【趣解】粘包和半包:TCP通信的"奇葩"问题
开篇:TCP为什么会有粘包?
HTTP请求是完整的,TCP发送的数据为什么会"粘"在一起?
这其实是TCP的"原罪"——它只保证可靠传输,不保证"消息边界"。
什么是粘包?
粘包 = 多个小数据包粘在一起发送
你发送:数据包A、数据包B、数据包C 实际收到:数据包AB数据包C就像快递:
- 你寄了3个包裹
- 快递公司把3个包粘在一起了
- 收货方收到1个大包
什么是半包?
半包 = 一个数据包被拆成多次发送
你发送:数据包A 实际收到:数据包A的前半段、数据包A的后半段就像锯木头:
- 你锯了一段木头
- 实际被锯成两段运送
- 收货方要拼起来
为什么会粘包/半包?
根本原因
TCP是流式协议,不保留消息边界:
- 发送方:write() 100字节
- TCP:可能分成10次发送