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