什么是TCP粘包
背景
在socket网络编程中,通常使用(客户端端口号,服务端端口号,客户端IP地址,服务端IP地址,协议)来表示一条连接。而为了传输效率,发送方会将多个间隔小,数据量小的数据,合并成一个数据量大的数据块,再进行传输。
定义
TCP沾包就是客户端发送的若干包数据到达服务端时粘成了一个包,前一个包的包尾与后一个包的包头连接在了一起。
原因
客户端
客户端为了减少网络中报文段的数量而默认使用Nagle算法,Nagle算法进行如下两个工作:
- 消息确认:在上一个包确认收到后再发送下一个包
- 消息合并:将多个间隔小、数据量小的数据包合并成一个大的数据包进行发送
服务端
接收端接受数据包的速度大于应用程序读取数据包的速度,就可能造成前一个数据包和后一个数据包粘在一起。
如何处理
- 消息定长
- 分消息头和消息尾
- 在消息尾插入特殊格式符
UDP是否会粘包
不会,由于TCP是面向连接的字节流传输协议,流传输消息没有保护边界。
而UDP是非面向连接的报文传输,消息有保护边界。