本篇博客从以下四个问题进行分析,来理解TCP粘包问题。
什么是TCP粘包问题?
为什么会存在TCP粘包问题?
如何解决TCP粘包问题?
UDP是否存在粘包问题?为什么?
什么是TCP粘包问题?
TCP是面向连接的,即客户端和服务端要成对维护socket连接。如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。
举个例子
正常情况下,如图两个数据包在网络中传输,分别到达服务端
但是发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。假设这里的packet1和packet2都比较小,两个包的长度之和小于MTU。则会出现粘包情况。
粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。
不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)