- tcp粘包的原因
- tcp本身是面向流的协议,是没有消息边界的
- TCP 为了效率,会把多个小的数据包合并成一个大的发出去(Nagle 算法);
- 接收方处理不够快,多个包积压在接收缓冲区里,一次性读出来了
- 拆包
- 数据包太大,超过了 MSS(最大报文段长度),
- IP 层进行了分片,导致一个完整的消息被切断成两半发送。
- 解决方案
- 包设置固定长度
- 增加分隔符
- 消息头带长度(Length Field Based)(把包分成“头”和“体”)
- 自定义序列化协议
- 使用 Protobuf、JSON 等。虽然它们本身不解决粘包,但通常配合方案 C 使用
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!