TCP的分包与粘包原理简单理解

5,495 阅读2分钟

TCP的分包与粘包原理的简单理解

1,首先我们来看看粘包的图解:如下图:

为什么会出现粘包

假如说,我们要发送两个hello数据,一个hello占5个,TCP假如一次性传输能存10个。当第一个hello存进TCP的缓存区里面时,没有存满,还剩下5个空位,这时第二个hello过来,刚好占满剩下的5个,然后这两个hello就粘在一起了,变成hellohello了。

2,再来看看分包的图解:如下图:

为什么会出现分包

假如说,我们要发送两个hello,一个hello要占领5个空位。但是TCP的一个包只有4个空位,。这时第一个hello传过来,只存了hell,剩下的e被分到下一个包存储,所以就成了分包。

3,在哪种情况下会出现分包与粘包:

  • 1,要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生分包。
  • 2,待发送数据大于MSS(最大报文长度),TCP在传输前将进行分包。
  • 3,要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出 去,将会发生粘包。
  • 4,接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

自定义协议

解决粘包/分包常用方式:

两种方式

  • 1,定义数据包包头,包头众包含数据完整包的长度,接收端接收到数据后,通过读取包头的长度字段,便知道每一个数据包的实际长度了。

比如说,将原数据加密,在密文前面加上包头,即:[包头]+[密文]。 包头=[密文长度+加密方式+...]

  • 2,数据包之间设置边界

理解的不对的地方,请指正