欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP的粘包和拆包

程序员文章站 2022-03-12 10:18:00
...

        当客户端不停的向服务端发送数据包的时候,会出现两个 数据包连在一起的情况,这就是我们TCP协议中经常遇到的粘包和拆包;

        运输层中最重要的两种协议:UDP和TCP,但是TCP 比 UDP复杂的多;UDP是无连接的,TCP是面向连接的;因此只有TCP才会发生粘包和拆包的情况;

       TCP粘包和拆包的表现形式:
TCP的粘包和拆包
            
    
    博客分类: 网络 TCP 
 第一种情况

        当发送两个数据包的时候,每次server读取一个,情况正常;

第二种情况

        两个数据包连在了一起,发生了粘包现象;

第三种情况

       P1太大或者P2太大的时候,一次只接收了P1或者P2的一半,这时候就是发生了拆包的现象;

第四种情况

      P1和P2都非常大的时候,并且TCP 的滑动窗口还非常的小,这个时候P1和P2都会发生多次的拆包现象;

 

发生粘包和拆包的原因:

1、要发送的数据大于TCP发送缓冲区剩余空间的大小,将会发生拆包现象;

2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。

3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。

4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

5、以太网帧的payload大于MTU进行IP分片。

等等......

粘包拆包的解决方法:

(1)消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;

(2)在包尾增加回车换行符进行分割,例如FTP协议;

(3)将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;

(4)环形缓冲区解决粘包问题

(5)更复杂的应用层协议。

  • TCP的粘包和拆包
            
    
    博客分类: 网络 TCP 
  • 大小: 125.3 KB
相关标签: TCP