摘要
定义
粘包:数据包的重组/合并现象
拆包/半包:数据包的拆分现象
注:
- 出现TCP粘包、拆包的原因在于TCP报文基于字节流,没有边界
- TCP是不会出现丢包
- UDP无粘包拆包现象
发生原因
- 数据包数据经套接字缓存区发送/接收
- 数据包数据大于缓存区——拆包
- 数据包数据小于缓存区,可能需等缓冲区满再发送/接收——粘包
- TCP分段(MSS)
- IP分片(以太网payload > MTU)
解决方案
本质:如何区分数据包——为数据包添加边界,但底层无法感知上层数据(即TCP无法去区分业务数据,需要上层应用协议栈来解决)
- 发送端添加包首部,首部中包含数据包长度
- 消息定长,即发送端封装数据包为固定长度(不足补0)
- 为数据包设置边界,如添加特殊字符