摘要

定义

粘包:数据包的重组/合并现象
拆包/半包:数据包的拆分现象
注:

  1. 出现TCP粘包、拆包的原因在于TCP报文基于字节流,没有边界
  2. TCP是不会出现丢包
  3. UDP无粘包拆包现象

发生原因

  1. 数据包数据经套接字缓存区发送/接收
    1. 数据包数据大于缓存区——拆包
    2. 数据包数据小于缓存区,可能需等缓冲区满再发送/接收——粘包
  2. TCP分段(MSS)
  3. IP分片(以太网payload > MTU)

解决方案

本质:如何区分数据包——为数据包添加边界,但底层无法感知上层数据(即TCP无法去区分业务数据,需要上层应用协议栈来解决)

  1. 发送端添加包首部,首部中包含数据包长度
  2. 消息定长,即发送端封装数据包为固定长度(不足补0)
  3. 为数据包设置边界,如添加特殊字符