TCP提供的是流式数据传输,而粘包问题是流式数据传输带来的必然问题。与UDP接收端收到的是数据报不同,TCP端收到的是数据流,应用层的报文在以流的形式传输时,每一个报文的报头紧接着上一个报文的报文尾部,这就是所谓的“粘包”问题。这其实在网络编程中是经常遇到的问题,解决办法也很简单,通常在每个应用报文前加上一个指明报文长度的字段。
Nagle算法是TCP协议提供的一种选项,具体做法如下:当有很多小报文时,TCP并不急于将小报文发送出处,而是进行缓存,累积成一个大报文后再统一发送,这可以减少网络拥塞和减少丢包。一般而言TCP是默认打开的Nagle算法的,但有些时候我们需要关闭这个算法,比如在某些实时性比较强而每次传输的报文又比较小的情况,例如TeamViewer远程桌面操作系统。每一次鼠标的移动最终会以一个很小的TCP报文发送给远端,如果使用Nagle算法,累积到一个大报文再发送,势必会导致严重的延迟和鼠标的“瞬移”。
网上很多介绍粘包的博客中都提到了Nagle算法,但在我看来二者没有必然联系。粘包是TCP流式数据这一性质带来的必然问题,而Nagle算法是TCP协议的一个可以提高网络效率的选项。