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)更复杂的应用层协议。
上一篇: c语言:矩阵相乘-矩阵相加 新手练习1
下一篇: linux 中查看所有用户