TCP 粘包问题
TCP 粘包问题是指发送方多次发送的数据混合到了一起(具体体现为发送方多次 SEND 发送的数据,接收方一次 RECV 就能全部读取)。
造成 TCP 粘包问题的原因
粘包问题的本质在于,TCP 本来就是面向字节流的协议,不会根据数据发送的次数保持数据的边界,导致接收方可能一下子读取到多个报文。
从协议栈的实现来看,出现粘包的原因有:
-
发送方:发送方会使用 Nagle 算法,Nagle 算法会收集多个小分组,将它们合并发送;
-
接收方:TCP 收到数据报时,实现保存在接收缓冲区中的,并不能保证应用立即处理。只要 TCP 接收数据的速度大于应用层从缓冲区中读取数据的速度,则应用层可能读取到多个首尾相接的包。
处理粘包现象
-
对于发送方造成的粘包现象,可以通过关闭 Nagle 算法来解决;
-
可以在应用层定义数据传输协议:
-
格式化数据:为每条数据设置固定的格式(开始符,结束符);
-
发送长度:发送每条数据时,将数据的长度一并发送
-