TCP的粘包和拆包

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

        运输层中最重要的两种协议:UDP和TCP,但是TCP 比 UDP复杂的多;UDP是无连接的,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)更复杂的应用层协议。

猜你喜欢

转载自taoyongpan.iteye.com/blog/2401028