TCP报文粘连就是,本来发送的是多个TCP报文,但是在接收端受到的却是一个报文,把多个报文合成了一个报文。
TCP报文粘连的原因:
1.TCP协议采用了Nagle算法
Nagle算法产生的背景是,当时为了解决发送多个非常小的数据包时(比如1字节),由于包头的存在而造成巨大的网络开销,也就是糊涂窗口综合征(silly window syndrome)。简单的讲,Nagle算法就是当有数据要发送时,先不立即发送,而是稍微等一小会,看看在这一小段时间内,还有没有其他需要发送到消息。当等过这一小会以后,再把要发送的数据一次性都发出去。这样就可以有效的减少包头的发送次数。
2.接收端从缓冲区里读消息的速度太慢
即发送端关闭了Nagle算法,在接收端读缓冲区的速度很慢的情况下,还是会产生报文粘连的现象。接收端收到一个TCP报文后,报文放在缓冲区里,如果这个报文没有及时被读取,这时又有新的报文发送过来,然后才读取缓冲区的内容时,就会一次读取2个报文的内容,产生报文粘连的现象。
TCP报文粘连的解决方法:
1.关闭Nagle算法。在scoket选项中,TCP_NODELAY表示是否使用Nagle算法。据说在windows中存在既是关闭了Nagle算法,Nagle算法仍然在使用的BUG。不知到现在是什么情况。
2.接收端尽可能快速的从缓冲区读数据。可以改进算法,或者提高任务的优先级。
3.还有一个肯定有用但是比较麻烦的方法。可以在发送的数据中,添加一个表示数据的开头和结尾的字符,在收到消息后,通过这些字符来处理报文粘连。