TCP 拆包、粘包

拆包、粘包举例

比如发送端要往接收端发送2个数据包
1.收到2个数据包,没发送拆包和粘包情况;
2.收到1个数据包,TCP把2个数据包合成1个发送给接收端了,这样应用层不能处理合成1个的两个数据包,应用层不知道两个数据包之间的分隔在哪,所以很难处理,这是粘包问题;
3.收到2个数据包,但1个数据包产生了粘包(发送端的1个半数据包),另1个数据包产生了拆包(只有发送端中1个数据包的半个包),这样应用层也是很难处理粘包、拆包的;

粘包、拆包发生原因

发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充,

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

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

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

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

解决

由于TCP是不知道应用层的数据包的分界的,所以我们应用层是决定不了传输层对数据包拆包还是粘包,不过应用层可以通应用层协议栈设计给数据包加分界标记,来处理最后接收到的数据,不管拆分还是粘包都可以处理好。

1.发送端给数据包增加首部,首部包含数据包中数据的长度,这样接收端的应用层接收数据后,根据首部中的长度就知道数据的实际长度了,可以很好处理数据了。
通常设计思路,比如第1个字段使用32int表示数据的长度,接着是数据内容。
2.设置数据包的长度为固定的长度,不够数据则以空格填补;
3.应用层在发送每个数据包时,给每个数据包加分界标记,比如回车换行.

猜你喜欢

转载自blog.csdn.net/fsfsfsdfsdfdr/article/details/82882840