Reno
是目前应用最广泛且较为成熟的算法。该算法所包含的慢启动、拥塞避免和快速重传、快速恢复机制,是现有的众多算法的基础。
1.慢启动与拥塞避免
TCP发送端采用慢启动和拥塞避免算法来控制向网络输送的数据量。为了实现这些算法,必须向TCP每个连接状态加入3个参量:
(1)拥塞窗口(cwnd),如前所述,它是对发送端收到确认(ACK)之前能向网络传送的最大数据量的一个发送端的限制。
(2)接收端通知窗口(rwnd),它是对未完成数据量的接收端的限制,cwnd和rwnd的最小值决定了数据传送。
(3)慢启动阀值(ssthresh),被用来确定是用慢启动还是用拥塞避免算法来控制数据传送,具体用法如下:当cwnd<ssthresh时使用慢启动算法;cwnd>ssthresh时使用拥塞避免算法;当cwnd=ssthresh时,发送端既可以使用慢启动也可以使用拥塞避免。ssthresh的初始值可以任意大(比如,一些实现中使用接收端通知窗口的尺寸),但是一旦对拥塞响应之后,其大小可能会被减小。
在不清楚网络环境的情况下向网络传送数据,要求TCP缓慢地探测网络以确定可用带宽,以避免突然传送大量数据而使网络拥塞。为达此目的,在传送开始时,采用了慢启动机制,这个机制在修复了由重发定时器探测到的数据丢失之后也被采用。
首先要确定的是cwnd的初始值IW(初始窗口大小),这里规定它必须小于或等于2*SMSS字节而且不能大于两个数据段。
在慢启动期间,每收到一个新的ACK,cwnd最多增长1。直到cwnd超过ssthresh或者检测到拥塞时,停止执行慢启动算法,转入拥塞避免阶段。在拥塞避免期间,cwnd在每个ACK以1/cwnd(或每个RTT增加SMISS个字节)的速度递增。拥塞避免算法一直保持直到检测出拥塞。等式(5.1.1)给出了一个在拥塞避免期间用来修正cwnd值的公式:
cwnd+=1/cwnd (5.1.1)
每收到一个非重复的ACK都采用等式(5.1.1)来调整cwnd。等式(5.1.1)用于近似拥塞避免算法的增长。
在实现中,在拥塞避免期间常用公式:cwnd+=SMSS*SMSS/cwnd来修正cwnd的值,当SMSS*SMSS/cwnd<1时,cwnd+=1。
另一种改进的方案是每当新的ACK到来时记下被新确认的字节数,然后cwnd就可增加相应字节数,这个增加的数目最多可达到SMSS字节。
一旦TCP发送端使用重传定时器检测到包丢失时,ssthresh的值就如下设置:
Ssthresh=max(FlightSize/2,2*SMSS) (5.1.2)
式中,Filght Size是已发送但未收到ACK的数据的大小。
在重发了丢失的数据段之后,cwnd必须被设置成LW(丢失窗口),它等于一个满尺寸数据段的大小。再发丢失的数据段之后,发送端起用慢启动算法增长窗口直到该窗口大小增长到等于新设置的ssthresh值之后,又采用拥塞避免算法了。
2.快速重传与快速恢复
当接收端收到一个失序的数据报时,会立即发回一个重复ACK,这个ACK的目的是告知发送端收到一个失序的数据报并说明其所期望的接受序号。从发送端的角度看,重复ACK可能是许多网络问题引起的。首先,它们有可能是因为包丢失而引起。在此情况下,在此数据段之后的所有数据段都会触发重复ACK。其次,重复ACK可能是由于网络对数据段的重新排序引起的。最后,重复ACK有可能是ACK或数据段被网络复制所引起的。此外,当接收端部分或完整地填补了序号空缺应立即发送一个ACK,这样可以更及时地通知发送端,使其迅速从重发状态中恢复过来。快速重传算法如图5-2所示。
TCP发送端应该使用快速重传算法来探测或者修复数据丢失,在收到3个重复ACK(即连续的4个相同的ACK,标志着1个数据段已丢失)时,TCP不等重传定时器超时就立即重传看来已丢失的数据段。此后起用快速恢复算法来进行新的数据传输,直到1个非重复 ACK到达。
下面是快速传送/快速恢复算法的实现:
(1)当第二个重复ACK收到时,ssthresh根据等式(5.1.2)设值。
(2)重传丢失的数据段并将cwnd的值设置为ssthresh+3*SMSS,称之为给拥塞窗口“充气”。
(3)此后对每个接收到一个重复ACK,将cwnd增大SMSS字节,这将人为地扩充拥塞窗口用以反映已经离开网络的附加数据段。
(4)如果cwnd和接收端的通知窗口值允许的话,发送一个数据段。
(5)当下一个确认新数据的ACK到达时,设定cwnd值为ssthresh(步骤1设置的值),这称作给窗口“放气”。这个ACK必须是步骤1触发的重发引起的确认,重发之后一个RTT(在接收端有次序紊乱的数据段的情况下,它可能一会儿就到达)。另外,此ACK应该确认丢失数据段和第二个重复ACK期间的数据段,如果它们一个也没有丢失的话。
Reno
算法的性能分析
从Reno运行机制中很容易看出,为了维持一个动态平衡,必须周期性地产生一定量的丢失,再加上AIMD机制--减少快,增长慢,尤其是在大窗口环境下,由于一个数据报的丢失所带来的窗口缩小要花费很长的时间来恢复,这样,带宽利用率不可能很高且随着网络的链路带宽不断提升,这种弊端将越来越明显。
公平性方面,根据统计数据,Reno的公平性还是得到了相当的肯定,它能够在较大的网络范围内理想地维持公平性原则。