粘包问题
首先,粘包并不是 TCP 的问题。搜索引擎中列出的各种关于“TCP 粘包问题”的文章,所讲的其实是采用 TCP 传输数据的应用层协议设计不合理导致的粘包问题,并不是 TCP 的锅。
TCP 是流协议,没有粘包这个概念。
所谓粘包问题,是指发送方的多条消息在传输到接收方时,由于被拼接在一起而导致无法解析的情况。要解决这一问题,需要合理设计应用层协议,约定好消息边界,以便即使多条消息被拼接在一起,也能够按照协议找到消息边界从而正确解析。
之所以很多人将粘包问题看作是 TCP 造成的,是因为“拼接”这一行为发生在 TCP 层。通过 TCP 发送和接收的数据,均为数据流格式。当应用层协议使用 TCP 协议传输数据时,TCP 协议很可能将应用层发送的消息分成多个包依次发送或将多条消息组合后发送,这就会出现接收方收到的一个数据段可能由多条消息组成,即粘包。
而实际情况是,TCP 本就是基于字节流而不是消息包的协议,它保证的是字节流的次序到达,对于字节流的解析应该是由应用层协议来完成的,所以粘包问题,实际上描述的是“如何设计应用层协议”的问题。