TCP粘包和拆包
客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下四种情况:
情况一、服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包
情况二、服务端一次接受到了两个数据包,D1和D2粘合在一起,称之为TCP粘包
情况三和四
- 服务端分两次读取到了数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这称之为
TCP拆包
- 服务端分两次读取到了数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余部分内容D1_2和完整的D2包。这称之为
TCP拆包
。
发生原因
1、要发送的数据>TCP发送缓冲区大小
,需要将包拆成多份分开发送,将会发生拆包
。
2、要发送的数据<TCP发送缓冲区的大小
,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包
。
3、接收端没有及时读取接收缓冲区中的数据,将发生粘包
。
粘包、拆包解决办法
常用的方法有如下几个:
1、可以在数据包之间设置边界
,如添加特殊符号
,这样,接收端通过这个边界就可以将不同的数据包拆分开。
2、发送端给每个数据包添加包首部
,首部中包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
3、发送端将每个数据包封装为固定长度
(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据
即可。