粘包和拆包问题

粘包问题

在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。
服务器接收缓存池中读取数据会产生粘包问题,就是服务器同时接收两个包放入缓存池中,如果这个时候没有什么标记每个包的边界的话,将会将这个两个包当成一个包进行处理而产生的错误。

拆包问题:

1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。

解决方法

给数据包添加边界信息
例如:发送端在发送前给数据包包的前面加一个int字节流,只存放这个数据包字节流的长度,
接收端在收到数据,先读取前面的int字节流获取数据包长度,在根据长度读取下个包的数据,再判 断未读取的字节流是否还有头部信息和数据包,循环读取

Guess you like

Origin blog.csdn.net/weixin_44806700/article/details/120237550