粘包是什么?
TCP协议在网络编程中应用极为广泛。实现了端对端面向连接的可靠的数据通信。UDP协议同样应用广泛,实现了一对多的无连接的不可靠数据传输。
根据TCP的应用场景,我们把TCP连接分为长连接和短连接:
1.短连接:Client和Server每发送一次报文建立一次连接,在发送报文之后立即关闭该连接。
2.长连接:Client和Server建立通讯连接后不断开,进行多组报文的传输,TCP协议为了提高传输效率,经常会采用优化算法(Nagle算法),对多组间隔时间短,数据量小的报文进行合并发送,这样每条报文之间就失去了消息边界,在接收端难以分辨原来的报文,造成粘包发生。
如何解决粘包问题?
对于发送方使用优化算法造成的粘包,我们可以系通过设置关闭优化算法,但这种方法会降低TCP传输效率,同时也无法避免接受方法再次产生粘包,所以并不是完美的解决方案。
对于接收方,如果接受的速度大于应用处理数据的速度,则在接受方的缓存区里就会形成首尾相接的TCP报文,形成沾包。面对这种情况,可以通过优化接收端处理数据的效率来解决。但这同样不能避免发送方引起的沾包,而且优化接收端处理数据的效率也是有限的,所以这也不是一个完美的办法。
一种相较之下更为妥当的方法是格式化数据的结构,接收端采用一定的规则来解析TCP报文,从而可以较好的解决沾包问题。