解决TCP报文粘连的方法

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.还有一个肯定有用但是比较麻烦的方法。可以在发送的数据中,添加一个表示数据的开头和结尾的字符,在收到消息后,通过这些字符来处理报文粘连。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值