TCP的拥塞控制 (四)

  TCP NewReno
 

NewReno是在Reno的基础上,改进了Fast Recovery,主要思想是保证处于network中的packet的总量是饱和的。算法

Reno算法中,一个超时会致使相应的那个packet的重传,然而,一个超时发生时,本能够重传多个潜在的丢包,但Reno算法没有这样实现,这就致使性能不高。网络

Reno在遇到多包丢失时,存在两个问题:一个是,大量的包没有足够的重复ACK触发重传,只能等待超时才能得以重传。第二个是,即便采起措施(Partial Acknowledgement一节中已有所讨论)避免了超时,也会存在Multiple Fast Retransmits和严重的window reduction现象,这些会影响TCP的性能。在Multiple Fast Retransmits一节中,咱们讨论了相应的解决方案。NewReno正是在此方案的基础上进行的改进。性能

NewReno添加一个recover变量,做为Fast Recovery阶段的一个阈值,当sender成功发送到recover所标识的packet时,Fast Recovery阶段才结束。这里成功发送的标志是收到来自receiver的正常ACKspa

每当进入Fast Recovery阶段时,recover都更新为high_seq(当前已经发送出去的packet的最大序号),而在进入Fast Recovery阶段以前,recover中保持的是上一个Fast Recovery阶段更新的recover的值。实际上,recover表示的是当前窗口中,可能的丢包的最大序号,Fast Recovery阶段的目标就是恢复这里面的全部的丢包,所以,recoverFast Recovery阶段的边界。ip

NewReno不容许Multiple Fast Retransmits,所以在收到3次重复ACK时,若是TCP已经处于Fast Recovery阶段,则不会进行Fast Retransmit。而且,即便TCP没有处于Fast Recovery阶段,NewReno还会判断重复ACK中的序号是否大于当前recover的值(当前recover的值实际是上一个Fast Recovery阶段的recover的值)。若是小于,则说明ACK指明的packet是上一轮Fast Recovery已经处理过的packet,其确定已经在上一轮被重传了,之因此仍然有3次重复ACK,多是乱序或者重复发送receiver端已经存在的packet致使的,并不意味着丢包,所以不须要重传。若是大于,则说明这是一个显然的丢包,会进入Fast Recovery进行处理。it

进入Fast Recovery以后,会继续收到重复ACK,直到收到非重复ACK为止,这期间的操做与传统的Reno一致,NewReno的特别之处体如今处理非重复ACK的环节。io

当收到一个非重复ACK时,这个ACK可能响应的是Fast Retransmit重传的packet,也多是Fast Retransmit以后重传的packet。因为多包丢失的存在,这个ACK多是Full ACK或者Partial ACK,对这两种ACK会采起不一样的处理方式。ast

若是ack_seq>recover,则该ACKFull ACK。它响应了进入Fast Recovery以前sender所发送的所有packet,按规定能够退出Fast Recovery阶段。在退出以前,会将cwnd缩减到min(ssthresh, FlightSize+SMSS),以保证网络的守恒。class

若是ack_seq<recover,则该ACKPartial ACK。在Partial Acknowledgement一节中已经讨论过,Partial ACK意味着多包的丢失,所以,NewReno会重传某些packet。与其余方案不一样,NewReno并不重传Partial ACK中指明的packet,而是目前未被响应的最小的packet,这样能够保证重传始终是从左到右依次进行,保持连续型。与Reno同样,重传以后,NewReno缩减cwnd。具体的作法是,首先减去Partial ACK所响应的packet的数量,而后加上SMSS。整体上是为了保证Fast Recovery结束时,有ssthresh大小的packet在网络中传输。基础

因为多包丢失的存在,NewReno针对Partial ACK的处理,仍然不能快速的恢复全部丢失的packet,所以超时会常常发生。当超时发生时,NewReno采起的措施是退出Fast Recovery,并在退出以前将recover的值更新为当前high_seq

相关文章
相关标签/搜索