1、什么是粘包?
TCP的接受数据是从缓冲区里面拿,但是数据包转换为数据流,没有分割的标志就不知道一个包到哪停止。多个独立的数据包被粘在一起,形成一个大的数据块,接收端难以正确分辨和处理这些数据包。
2、为什么会发生粘包?
A、缓冲区里面的数据没有被及时处理,下一个数据读取进来就照成了粘包问题。
B、每一个数据包太小,多个一起写入套接字的缓冲区里面,就造成了粘包
3、处理粘包:优化数据包的结构
这里只提供一种思路,大家可以更具实际情况自行设计包的结构。
A、包头辨识:
1、前面两个字节,一般为FFFE 或者 FEFE,因为很少会遇到这种数据。
2、以下情况会造成刚开始的数据不是包头辨识符:
a、编写的解析代码bug或者协议出现了改变,不能完全的一次性读取一个包的全部内容。
b、会有嗅探报文过来:网络上的乱起八遭人的骚扰
· c、可能是你的端口和别人重复了,别的程序发来了报文
B、包的长度
根据自身情况来选择用两个字节还是四个字节来记录整个报文的长度。
C、命令:
SYN(Synchronize): 发起连接请求。
ACK(Acknowledgment): 确认收到的数据。
FIN(Finish): 请求关闭连接。
RST(Reset): 重置连接。
D、校验和:
为了监视传输是不是有出错的bite,所以要检验一下。简单的有奇偶检验,累加校验;比较靠谱的有CRC-32、CRC-16等等,有兴趣的自行了解。