”TCP 拆包粘包“网络上的争论挺大的,原因在于这一概念在 RFC 中并未提到过,(* ̄︶ ̄)有点民科的赶脚。但实际上它是挺常见的一个问题,比较准确的描述应该是应用层分包问题。那么为什么提到这一概念总是会带上 TCP 而不是 UDP 呢?因为应用层分包问题本质是接收方在某个时刻接收到的数据不构成一条完整的消息
对于 UDP 来说,它并未在 IP 协议外作出额外的可靠性特性,所以无论发送的数据荷载是多少都会完整的交由 IP 层处理,而 IP 层虽然会根据 MTU 进行分包,但是接收方会确保在 IP 层重组完成才会交由 UDP 处理,否则会直接丢弃。所以基于 UDP 协议实现的应用层协议每次接收到的数据都是完整的消息,无需应用层做额外的分包和重组
对于 TCP 来说,它是无边界的字节流协议,为了解决可靠性的问题以及各种性能优化会导致接收方收到的数据不是完整的消息,比如:
- 若数据荷载过小时,TCP 根据 Nagle 算法整合多个小数据包统一发送
- 若数据荷载过大时,TCP 会根据 MSS 大小对数据进行分段发送
这也就是为啥”拆包粘包“总是碰瓷 TCP 的原因了