经典拥塞控制算法介绍

网络传输的本质是对于网络资源合理的共享和复用,用于发送控制的拥塞控制算法便成为了网络传输最核心的设计之一,它不仅需要关注用户传输的性能还需要关注传输的公平性。在传输协议规范化之后便陆续诞生了许多经典的拥塞控制算法,虽然随着网络的发展,这些算法有着或多或少的历史局限性,但他们传输控制的设计思想对后续的拥塞控制算法设计产生了深远的影响。

TCP Tahoe

Tahoe是TCP协议最早的拥塞控制算法,主要包括三个阶段的拥塞控制机制:慢启动、拥塞避免和快速重传。

慢启动:当TCP连接开始建立的时候并不知道数据发送的上限,这一阶段的目的就是快速探测到可以发送数据量的上限,算法将这一上限表示为ssthresh(慢启动阈值),因此在这一阶段发送窗口处于快速增长的状态。在这个阶段,初始发送窗口通常被初始化为1MSS(最大片段大小,Maximum Segment Size),当发送端每收到一个确认ACK报文后,发送窗口就会增加1MSS大小。因此在这一阶段内发送窗口呈现指数级别增长,用于快速探测发送窗口的上限,具体增长过程如下:

  • 初始发送窗口为1MSS大小,报文成功被确认后,发送窗口增加至2MSS。

  • 发送窗口为2MSS,报文全部被成功确认后,发送窗口增加至4MSS。

  • 发送窗口为4MSS,报文全部被成功确认后,发送窗口增加至8MSS。

但是这会导致窗口在短时间内快速增长,必然在某个时间节点超过网络容量,那么将会在超过网络容量的时候结束慢启动过程,具体的情况分为以下两种:

  • 第一种:在慢启动过程中发生了丢包,这通常认为当前数据发送速率大大超过了网络可用带宽。此时将ssthresh(慢启动阈值)设置为当前发送窗口的一半并将发送窗口重置为1MSS重新启动慢启动过程。

  • 第二种:在慢启动过程中窗口增加至超过了ssthresh时,退出慢启动过程进入拥塞避免过程。此时如果继续成倍增加发送窗口可能过于激进,便进入拥塞避免过程进行窗口精细化探测。

拥塞避免:从慢启动过程进入拥塞避免过程中时,由于发送窗口只有上次发生丢包时发送窗口的一半,因此此时比较接近当前网络可用的最大发送窗口,便进入到网络窗口缓慢增长阶段。即:当网络不发生丢包时,每经过一个RTT,发送窗口增加1MSS。当发生丢包时,将ssthresh设置为当前发送窗口的一半并重新进入慢启动过程。

快速重传:在网络传输中,按照慢启动或者拥塞避免的发送方式一定会造成网络拥塞,因为在两个过程中窗口都会呈现单调递增的状态。因此丢包检测变得尤为重要,如果全部数据包都需要等待超时检测会大大降低传输效率。因此快速重传的理念是:当收到某个数据包连续三个重复的ACK报文就认为该数据包丢失并重传该数据包。这种方法大大提高了数据包丢失检测的效率。

TCP Reno

TCPTahoe算法的数据传输效率并不高,其中一个最重要的原因在于,每次遇到丢包Tahoe算法都要进入慢启动过程重新增长发送窗口直至到达ssthresh并没有参考历史探测出的ssthresh大小。因此Reno算法相较于Tahoe算法最大的改进就是增加了快速恢复过程。

顾名思义,快速恢复指的是发生丢包时快速恢复发送窗口。在Tahoe算法中并没有区分超时丢包和冗余ACK触发的丢包两种丢包发生时网络的拥塞状况,很明显这两类丢包发生时网络拥塞程度是不同的,超时丢包触发时通常网络拥塞程度更高。因此,当快速重传触发时,将ssthresh设置为当前发送窗口的一半,并将发送窗口设置为:cwnd=ssthresh+3MSS并进入拥塞避免过程。当超时重传触发时,Reno算法和Tahoe算法一致,进入到慢启动过程。

TCP NewReno

NewReno算法相较于Reno算法的改进了快速恢复过程中的重传。在Reno算法的快速恢复过程中,当发生三次重复确认事件时,TCP发送方将重新传输丢失的数据包并启动定时器,等待该数据包的确认。一旦重传数据包得到确认,便立即终止快速恢复阶段,转入拥塞避免阶段。然而,Reno在遭遇多个数据包丢失的单一拥塞事件中,可能会错误地将其解释为多重拥塞事件,并因此反复减少拥塞窗口大小,导致数据传输速率的下降。

相比之下,NewReno算法的快速恢复机制在遇到三次重复确认时,会记录下此时尚未得到确认的数据包的最高序列号,并重新传输被重复确认的数据包。若存在多个数据包丢失,NewReno将持续重传这些丢失的数据包,直至接收到最高序列号的数据包的确认为止,此后退出快速恢复阶段。

NewReno算法在低丢包率的环境下,其运行效率与采用SACK机制的策略相似,而在高丢包率的情况下,其性能远远超越Reno版本。这表明NewReno通过细化快速恢复策略,有效地提高了在多重数据包丢失场景下的网络传输效率,减少了不必要的拥塞窗口缩减,从而优化了数据传输速率的稳定性和效率。

Westwood

Westwood是一种面对有损网络环境的基于Reno算法改进的拥塞控制算法,特别是针对无线网络中的传输效率进行了优化。Reno算法是丢包驱动拥塞控制算法,倾向于填满网络缓冲区。但是随着无线网络的普及,信号误码等导致的传输随机丢包较为常见,但是Reno并没有区分出这两类丢包的差异,将其统共认为拥塞丢包。Westwood针对这一情况进行了改进,能够更有效地处理具有大带宽-延迟乘积路径、传输错误或其他非网络拥塞原因导致的丢包情况并在带宽动态变化的网络环境下取得了较好的优化效果。

当检测到重复ACK触发的丢包时,Westwood并没有执行和Reno相同的窗口减半操作,而是根据带宽值来确定发送窗口和ssthresh的大小来进行快速恢复。首先,Westwood会记录一段时间内被ACK的数据包总大小并除以时间间隔得到发送速率。当检测到丢包时,可以将发送速率和RTT的乘积赋值给ssthresh来防止随机丢包造成的网络带宽瞬时下降。

Cubic

随着网络传输朝着速率会更快距离会更长的的趋势发展,网络BDP逐渐增加,但是传统的Reno系列算法难以充分利用带宽,其主要原因在于Reno算法进入拥塞避免过程后,每个RTT只会增加1MSS的发送窗口。因此Cubic算法设计的主要关注点在于如何在拥塞避免过程中快速探测到可用带宽。

一个简单的带宽探测过程可以做如下抽象:假如此时算法从当前发送窗口 c w n d cwnd cwnd开始探测,记录中最近一次发生丢包时的发送窗口记为 W m a x W_{max} Wmax,那么该如何快速探测到网络的可用带宽呢?一种简单有效的解决方案应运而生:

  • c w n d cwnd cwnd未达到 W m a x W_{max} Wmax时:当 c w n d cwnd cwnd距离 W m a x W_{max} Wmax比较远时,窗口可以增加地快一些,因为此时大概率还没有达到网络的瓶颈带宽;当 c w n d cwnd cwnd距离 W m a x W_{max} Wmax比较近时,窗口可以增加地慢一些,因为此时距离网络的瓶颈带宽可能较近。

  • c w n d cwnd cwnd超过 W m a x W_{max} Wmax时:当 c w n d cwnd cwnd距离 W m a x W_{max} Wmax比较近时,窗口可以增加地慢一些, W m a x W_{max} Wmax距离瓶颈带宽可能较近;当 c w n d cwnd cwnd距离 W m a x W_{max} Wmax比较远时,窗口可以增加地快一些,此时可以认为 W m a x W_{max} Wmax距离瓶颈带宽较远。

为了实现上述的窗口探测过程,Cubic引入了三次函数进行模拟,公式如下:

W ( t ) = C ( t − K ) 3 + W m a x W(t) = C(t-K)^3 + W_{max} W(t)=C(tK)3+Wmax

其中,发送窗口 W ( t ) W(t) W(t)随着时间 t t t动态增加,参数 C C C是预设的常数,参数 K K K可以根据窗口大小计算出。当发生丢包时,发送窗口 c w n d cwnd cwnd W m a x W_{max} Wmax,进入到拥塞避免过程后发送窗口 c w n d cwnd cwnd降为 β W m a x \beta W_{max} βWmax β \beta β为窗口下降比例。因此可以获得 t = 0 t = 0 t=0时, W ( 0 ) = β W m a x W(0) = \beta W_{max} W(0)=βWmax,代入后解出:

K = W m a x ( 1 − β ) C 3 K = \sqrt[3]{\frac{ W_{max}(1-\beta)}{C} } K=3CWmax(1β)

Vegas

相较于前面的算法,Vegas算法虽然没有在网络中大范围使用,但是其delay-based的速度测量理念对于后续的拥塞控制算法设计有着重要的借鉴意义。它与基于丢包的拥塞控制机制不同,Vegas是通过计算期望值的吞吐量与实际吞吐量的差值来估计网络瓶颈处的可用带宽。这样Vegas不用依赖丢包信号就可以评测到网络的拥塞状况,从而在丢包之前进行拥塞避免,能减少数据包的丢失,更有效地利用带宽。Vegas在拥塞避免阶段的具体算法如下:

  • 计算计算期望的吞吐量(Expected)和实际吞吐量(Actual)的差值Diff:
    D i f f = E x p e c t e d − A c t u a l = c w n d b a s e R T T − c w n d l a t e s t R T T Diff = Expected - Actual =\frac{cwnd}{baseRTT} - \frac{cwnd}{latestRTT} Diff=ExpectedActual=baseRTTcwndlatestRTTcwnd

    其中 b a s e R T T baseRTT baseRTT是网络中没有缓存数据包是的测量值, l a t e s t R T T latestRTT latestRTT是传输中最近一次RTT的采样值,因此 l a t e s t R T T > b a s e R T T latestRTT > baseRTT latestRTT>baseRTT

  • 计算路由器中缓存的数据包个数:

    N u m b e r ( D i f f ) = D i f f ∗ l a s t e s t R T T Number(Diff) = Diff * lastestRTT Number(Diff)=DifflastestRTT

  • 根据 N u m b e r ( D i f f ) Number(Diff) Number(Diff)来调整发送窗口,其中 α \alpha α β \beta β是缓存数据包大小预设的两个上下界值, α < β \alpha < \beta α<β:

    c w n d ( n + 1 ) = { c w n d ( n ) + 1 , N u m b e r ( D i f f ) < α c w n d ( n ) − 1 , N u m b e r ( D i f f ) > β c w n d ( n ) , α < N u m b e r ( D i f f ) < β cwnd(n+1) = \left\{\begin{matrix} cwnd(n) + 1, Number(Diff) < \alpha \\ cwnd(n) - 1, Number(Diff) > \beta \\ cwnd(n), \alpha < Number(Diff) < \beta \end{matrix}\right. cwnd(n+1)= cwnd(n)+1,Number(Diff)<αcwnd(n)1,Number(Diff)>βcwnd(n),α<Number(Diff)<β

但是随着无线网络的发展,RTT抖动在互联网上变得非常普遍,使得Vegas算法带宽利用率较低。此外Vegas在与基于丢包的拥塞控制算法的竞争中往往处于劣势,这使得原生的Vegas算法很难在互联网中大规模使用。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiaxing.Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值