TCP 粘包拆包
一、什么是粘包拆包?
粘包拆包是TCP协议传输中一种现象概念。TCP是传输层协议,他传输的是“流”式数据,TCP并不知道传输是哪种业务数据,或者说,并不关心。它只是根据缓冲区状况将数据进行包划分,然后进行传输。

在这个前提下,就有可能发生发生同一个业务数据被分割程多个数据包,或者多个业务数据被打包到同一个数据包进行发送。但是对于业务数据接收方,则必须拥有能够重新拆解或者组装完整业务数据的能力。这个现象,我们称之为TCP粘包拆包。

如上图,三个业务数据A、B、C被打包成一个数据包进行传输;D被分割为连个数据包进行传输。
所以综上,影响粘包拆包发生的原因:

1、业务数据的大小<>TCP 套接字缓冲区大小
如果需要写入的应用数据大于当前设置的TCP套接字缓冲区,则需要对应用数据进行分次写入。
SO_SNDBUF:发送缓冲区大小。
SO_RCVBUF:接收缓冲区大小。
应用首先将数据写入TCP套接字缓冲区,然后等待发送。默认情况下,多数操作系统支持动态调节SO_SNDBUF大小以进行自适应,但是如果有主动设置,则自动调节会失效。
2、MSS大小传输线制
标识TCP传往另一段的最大数据长度,建立连接时,双发通告自己允许的MSS(只能出现在SYN报文中)。
3、MTU大小限制
网路中主机之间的MTU不是一个常数,取决于所选择的路由,而且路径不一定对称(A到B的选路,B到A的选路).

因为每一次发送报文都会包含IP及TCP首部,所以,发送的报文段越大,效率越高,但是以不发生报文分段及双方都接受为基础。否则以较小的MTU发送。
关于MTU MSS相关知识可以参照:MTU(Maximum transmission unit) 最大传输单元
二、怎么处理粘包拆包?
传输层是业务无感知的,因此粘包拆包只能由业务层处理。通过指定收发两端共同的约定规约,发送方按照特定的规则组装数据,接收方按照同样的规则拆解数据。
这个共同的约定规约,我们通常称之为应用层协议;发送方组装数据的过程称之为编码;接收方拆解数据的过程称之为解码。
常见的协议处理有如下:
1、固定长度消息
在预知最大报文不超特定长度的情况下,可以规定报文大小固定,业务数据不足则以特定的空间占位。

2、特定分隔符分割消息
每条消息尾部加特定分割符进行消息分割。

3、消息头+消息体
每一条消息包含一个消息头和一个消息体,消息头使用固定长度占位,内部写入当前消息消息体的数据长度。接收方首先读取消息头数据,然后根据指明的消息长度进行消息体的读取。

应用协议没有统一的规则限制,如上,我们只是简要说明可能使用的应用协议形式,实际应用中,也会根据特定的场景需求进行定向的优化。
TCP 粘包拆包的更多相关文章
- Netty(三)TCP粘包拆包处理
tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D ...
- TCP粘包/拆包问题
无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河 ...
- TCP 粘包/拆包问题
简介 TCP 是一个’流’协议,所谓流,就是没有界限的一串数据. 大家可以想想河里的流水,是连成一片的.期间并没有分界线, TCP 底层并不了解上层业务数据的具体含义 ,它会根据 TCP 缓冲区 ...
- TCP粘包/拆包问题的解决
TCP粘包拆包问题 一个完整的包可能被TCP拆分成多个包,或多个小包封装成一个大的数据包发送. 解决策略 消息定长,如果不够,空位补空格 在包尾增加回车换行符进行分割,例如FTP协议 将消息分为消息头 ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- 第四章 TCP粘包/拆包问题的解决之道---4.1---
4.1 TCP粘包/拆包 TCP是一个“流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可 ...
- Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- TCP粘包/拆包 ByteBuf和channel 如果没有Netty? 传统的多线程服务器,这个也是Apache处理请求的模式
通俗地讲,Netty 能做什么? - 知乎 https://www.zhihu.com/question/24322387 谢邀.netty是一套在java NIO的基础上封装的便于用户开发网络应用程 ...
- netty之==TCP粘包/拆包问题解决之道(一)
一.TCP粘包/拆包是什么 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在 ...
- Netty使用LineBasedFrameDecoder解决TCP粘包/拆包
TCP粘包/拆包 TCP是个”流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TC ...
随机推荐
- 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)
寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...
- Java学习之路【第一篇】:前言
Java 语言概述 一.什么是Java语言 Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级的编程语言.所谓编程语言,是计算机的语言,人们 ...
- Java IO(十四) CharArrayReader 和 CharArrayWriter
Java IO(十四) CharArrayReader 和 CharArrayWriter 一.介绍 CharArrayReader 和 CharArrayWriter 是字符数组输入流和字符数组输出 ...
- HTTP/2 简介及https原理
注:以下内容节选自<高性能浏览器网络>(出版社:O'Reilly,作者:Ilya Grigorik). 要了解完整版本和相关内容,请访问 hpbn.co. HTTP/2 可以让我们的应用更 ...
- 结合 AOP 轻松处理事件发布处理日志
结合 AOP 轻松处理事件发布处理日志 Intro 前段时间,实现了 EventBus 以及 EventQueue 基于 Event 的事件处理,但是没有做日志(EventLog)相关的部分,原本想增 ...
- Java实现 LeetCode 836 矩形重叠(暴力)
836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...
- (Java实现) 蓝桥杯 国赛 重复模式
标题:重复模式 作为 drd 的好朋友,技术男 atm 在 drd 生日时送给他一个超长字符串 S .atm 要 drd 在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,而他想说 ...
- Java实现 LeetCode 655 输出二叉树(DFS+二分)
655. 输出二叉树 在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则: 行数 m 应当等于给定二叉树的高度. 列数 n 应当总是奇数. 根节点的值(以字符串格式给出)应当放在可放置的第一 ...
- Java实现 LeetCode 57 插入区间
57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...
- java实现 蓝桥杯 算法提高 盾神与条状项链
问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n的项链.当他准备把项链首尾相接的时候,土方进来了. ...