TCP通信粘包问题分析和解决
一、 粘包出现原因
简单得说,在流传输中出现,UDP不会出现粘包,因为它有消息边界
1、 发送方需要等缓冲区满才发送出去,造成粘包
解释:发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送
方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少
,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就
收到了粘包数据。
2、接收方不及时接收缓冲区的包,造成多个包接收
解释:接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包
现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲
区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据
放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲
区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
二、 粘包问题分类:
1、 一种是粘在一起的包都是完整的数据包,
2、 一种是粘在一起的包有不完整的包。
不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。在处理定长结构数据的粘包问题时,分包算法比较简单;在处理不定长结构数据的粘包问题时,分包算法就比较复杂。特别是粘在一起的包有不完整的包的粘包情况,由于一包数据内容被分在了两个连续的接收包中,处理起来难度较大。实际工程应用中应尽量避免出现粘包现象。
三、 为了避免粘包现象&