粘包和拆包现象
在网络通信中,客户端向服务端发送两个数据包,C1 和 C2 如下图:
站在客户端的角度,它是发送了两个不同的数据包。但是从服务端接受数据的角度来看就不一定了。可能出现的情况有三种。
第一种也是最符合直觉的,服务端按照客户端发送的顺序收到了数据包:D1 和 D2。
第二种,服务端第一次读取数据时读到了 D1 的一部分,再次读取时读取到了 D1 的剩余部分,第三次读取,读取完毕了D2。
用图来表达就是:
第三种,服务端读取一次数据,就完全读取到了 D1 和 D2。就如下图:
以上的第二种现象被称之为拆包,也就是一个完整的业务数据包被拆分到多次 Socket 读取的结果中。而第三种先想想被称之为粘包,也就是在一次 Socket 数据读取中,读取到了多个业务数据包。
原因分析
了解了现象,我们再来分析下原因。首先,TCP 是传输层协议,是无法感知到应用层的数据分包大小的。可想而知,在 TCP 层面进行的数据传输,其数据切分必然无法和应用层协议保持一致,因此会