注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

TCP—Nagle算法和延迟ACK  

2016-07-02 14:37:39|  分类: 网络 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://toutiao.com/i6262701847992074754/

糊涂窗口综合症 当发送端应用程序产生数据很慢或者接收端应用程序处理缓冲区数据速度很慢,就会使进程间传送的报文段很小,特别是有效载荷比较小。极端情况下,有效载荷就1字节,传输开销有40字节(TCP头+IP头),这种现象就是糊涂窗口综合症。 发送端的应用程序产生数据很慢,如rlogin应用,一次产生一个字节,结果有很多41字节的IP报文在网络中传输。解决的方法就是防止发送端逐个字节的发送数据,等待一段时间让TCP收集数据再统一发送,然而等待时间过长会造成大的延时,而等待时间过短还是不能解决这个问题。可以使用Nagle算法来解决. 接收端应用程序每次处理1个字节缓冲区数据,在接收端缓冲区满的情况下,先是通知发送端窗口大小为0让其停止发送数据,处理完1字节后,通知发送端窗口大小为1字节,此时发送端发送一个字节数据的报文段,这个过程一直持续同样造成了41字节IP报文充斥在网络中。解决的方法就是接收端一直宣布窗口为0直至缓冲区有显著增长(MSS或最大窗口大小一半),再通知发送端更新窗口大小 Nagle算法 Nagle算法是指在任何时刻,一个连接上最多只能有一个未经确认的小分段 ,Nagle算法是为了避免网络上充斥着大量的小包而造成网络拥塞。 Nagle算法在未收到前一个包的ACK时,会累积需要发送的包,直到收到前一个包ACK,此时才发送,继而一直重复。Nagle算法只是避免了发送大量小包, 而不能避免发送小包,如果对端ACK回复很快的时候,并不会拼接太大数据包,虽然避免了网络拥塞,但网络利用率依然很低。 Nagle算法并不总是要等到前一个包的ACK才能继续发包,在某些情况下,没有等到上一个包ACK,还是可以发送数据,主要包括以下情况: 累积的数据已经达到MSS 数据中包括FIN包 当前数据属于紧急数据 设置了TCP_NODELAY选项关闭了Nagle算法 没有设置TCP_CORK选项并且所有包都收到了ACK 默认情况下,发送数据采用Nagle算法,虽然能避免大量小包,但却增加了包的时延,这对实时性要求很强的应用是不允许的,使用TCP_NODELAY选项可以禁止Nagle算法。 TCP_CORK选项让内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据。TCP_CORK是禁止了小包的发送。 Nagle避免网络因为太多小包而拥塞,而CORK算法是为了提高网络利用率。 延迟ACK 一般接收端收到数据后,并不会立即发送ACK,而是将ACK的发送延迟一段时间,如果这段时间内接收端有数据要发送,那么可以ACK就可以和应答数据一起发送,这就是延迟ACK(捎带ACK)。 ACK的延迟时间初始化为40ms,之后回根据重传超时时间(RTO)、上次收到数据包与本次接收数据包的时间间隔等参数进行不断调整。 Nagle算法和延迟ACK是相互”矛盾”的,发送端等待ACK才能继续发数据,而接收端却延迟了回复ACK的时间,这进一步增加了发送端的数据延时


作者:头条号 / 林凡技术碎碎念
链接:http://toutiao.com/i6262701847992074754/
来源:头条号(今日头条旗下创作平台)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017