粘包原因:

  • 发送方每次写入数据<套接字缓冲区大小
  • 接收方读取数据不及时

半包原因:

  • 发送方写入数据>套接字缓冲区大小
  • 发送的数据大于协议的MTU(最大传输单元),必须拆包

根本原因:

TCP是流式协议,消息无边界

解决问题的根本手段:找出消息边界:

封装成帧

  • 固定长度 — 空间浪费 — 不推荐
  • 分隔符 — 空间不浪费 — 内容本身出现分隔符时需转义 — 推荐
  • 固定长度字段存内容的长度信息 — 精确定位用户数据,内容不用转义 — 推荐

image.png