拥塞控制的一般原理_拥塞控制的四种算法

拥塞控制的一般原理_拥塞控制的四种算法文章目录一、TCPTahoe二、TCPReno一、TCPTahoe二、TCPReno_cc一枝花


在这里插入图片描述

0、一些基础知识

0.1 名词解释

拥塞:在计算机通信中,当某一子网的分组数过多,超过了Link的Bandwidth时,所有的分组无法全都完成传输,会出现丢包、延时,甚至死锁的现象。因此,需要让发包的一方通过过去的先验知识去控制发包的行为, 这就是拥塞控制。

拥塞窗口(cwnd):Congestion Window,发送端在一个RTT内能发送的窗口大小。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如果再考虑到接收方的接收能力,那么发送窗口还可能小于拥塞窗口。
发 送 窗 口 = m i n ( c w n d , r w n d ) 发送窗口=min(cwnd,rwnd) =mincwndrwnd
rwnd是接收窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数。

RTO:Retransmission Time Out,超时重传。

RTT:Round-trip time,往返时间。

ACK:Acknowledgement,TCP是一个具有可靠性的协议,发送方给接收方发送数据,每收到一个数据包,接收方就会给发送方发送一个确认tcp报文,置ACK为1(ACK是TCP报文中flags之一)。

MSS:maximum segment size,最大报文段长度。

一、TCP Tahoe

TCP Tahoe协议是TCP最早的TCP拥塞控制版本。其拥塞控制的实现主要包括三个机制:慢启动、拥塞避免和快速重传。

  • 慢启动:当连接建立时,初始化cwnd,设置为一个MSS大小。设置ssthresh阈值的大小为64KB。
    ssthresh:slow start thresh,慢启动门限值。cwnd超过该值则进入拥塞避免。

  • 拥塞避免:使用AI(加性增)机制,只要有一个数据包丢失则认为网络拥塞。(实际上这么认为是不对的,丢包也可能是随机丢包,所以这样会浪费很多的带宽) 此时,将ssthresh设置为当前cwnd大小的一半,并回到慢启动阶段。

  • 快速重传:当收到三个重复ACK时,不必等待RTO,直接重传丢失的数据包。(此时认为收到3个重复的ACK时,该包已丢失。)

TCP Tahoe的cwnd的变化图如下:每次遇到丢包和3个重复ACK时,都会将拥塞窗口置0
在这里插入图片描述

在NS3中的仿真图如下:
在这里插入图片描述
TCP Tahoe会呈现出周期性的变化。

二、TCP Reno

相比于Tahoe,TCP Reno多了一个机制:快速恢复(Fast Recovery)
快速恢复: 当收到三个重复的ACK进入快速恢复状态。Reno会把当前的ssthresh的值设置为当前cwnd的一半,但是并不会回到slow start阶段,而是将cwnd设置为(更新后的)ssthresh+3MSS,之后cwnd呈线性增长。

这里有一个快速恢复的解读:
快速恢复是基于数据包守恒的原则,即同一时刻能在网络中传输的数据包是恒定的,只有当旧数据包离开网络后,才能发送新数据包进入网络。一个重复ACK不仅意味着有一个包丢失了,还表示有发送的数据包离开了网络(因此需要cwnd需要+1,因为此时网络中能多承受一个包),已经在接收区的缓冲区中,不再占用网络资源,于是将拥塞窗口加一个数据包大小。

这里给一个TCP Reno的状态机:
在这里插入图片描述

TCP Reno的cwnd的变化图如下:每次遇到丢包时,都会将拥塞窗口置0;每次遇到3个重复ACK时,都将cwnd=ssthresh+3MSS
在这里插入图片描述

在NS3中的仿真图如下:
在这里插入图片描述
其cwnd窗口同样呈现周期性变化。AIMD机制导致了其锯齿状的cwnd曲线。

三、TCP NewReno——针对Reno将一次拥塞识别为多次拥塞的问题

NewRenoReno的改进版,针对Reno存在的一些问题,提出相应的机制进行改进。

TCP Reno 提出的快速恢复算法提高了丢失报文后的吞吐量和顽健性,但是:
仅考虑了每次拥塞发生时只丢失一个报文的情形。实际网络中,一旦发生拥塞,路由器会丢弃大量的报文,即一次拥塞中丢失多个报文的情形很普遍。

如果在多个丢包的情形下使用Reno:
Cwnd和ssthresh多次进行减半,即乘性减,TCP的性能急剧下降。
并且由于窗口急剧下降,(当发送窗口小于3时)无足够的重复ACK可以触发快速恢复,只能等待超时重传。TCP Reno 终端会陷入仅通过传输超时来发现报文丢失的困境中。——等待超时是一件很久的事情,正常是3个RTT以上,极大的浪费了带宽。

因此,为了应对该情况,提出了TCP NewReno (这些算法都应该算是TCP Reno的变种,都是启发式的指定一些规则去解决某些情形)——总有一天这种设计架构会制约congestion control的发展,并且目前已经出现
在只丢失一个数据包的情况下,NewReno和Reno的处理方法是一致的。
而在同一个时间段丢失了多个包时,NewReno做出了改进:
Reno快速恢复算法中,发送方只要收到一个新的ACK就会退出快速恢复状态而进入拥塞避免阶段,而在Neweno算法中,只有当所有丢失的包都重传并收到确认后才退出。

3.1具体实现

在TCP NewReno中提出两个概念:部分应答(PACK,Partial ACK)、恢复应答(RACK,Recovery ACK)

记TCP发送端快速恢复阶段中接收到的ACK报文(非冗余ACK)为ACKx。

记在接收到ACKx时TCP终端已发出的序列号(SN)最大的报文是PKTy。

  • 部分应答:当ACKx不是PKTy的应答报文,即它们对应的Number不相等,则称报文ACKx为部分应答

  • 恢复应答:当ACKx恰好是PKTy的应答报文,即它们对应的Number相等,则称报文ACKx为恢复应答

在TCP NewReno中,接收到PACK并不会退出快速恢复,接收到RACK才会退出快速恢复阶段。因此在一次拥塞导致多个loss报文时,只会降低一次的cwnd。

  • 基本步骤如下:
    1.重新定义恢复阶段
    2.进入恢复阶段后,发送端重传被认定为丢失的报文,设置慢启动阈值(ssthresh)和拥塞窗口大小(cwnd)。ssthresh = cwnd/2,cwnd = ssthresh + 3MSS。
    3.收到一个重复ACK,cwnd=cwnd+MSS。
    4.当收到PACK(部分应答)时,发送端重传PACK所确认报文的下一个报文,如果拥塞窗口允许,继续发送新的数据包。
    5.当收到RACK(确认应答)时,发送端认为拥塞中所有被丢弃的报文都已经被重传,拥塞结束,设置cwnd=ssthresh并退出快速恢复状态。

TCP NewReno的cwnd窗口变化如下:
在这里插入图片描述
需要在同时发生多个丢包时,才看得出与Reno的差别。


四、TCP Cubic

TCP Cubic是目前Linux系统、Windows系统上默认的拥塞控制算法。

4.1 为什么会有Cubic呢?

在当时带宽比较受限的年代(KB级别),TCP NewReno等拥塞控制算法并不会造成很多的带宽浪费(本来的瓶颈带宽就不大)。但随着网络速度的发展,传统的TCP NewReno等算法在拥塞避免阶段每个RTT只增长一个拥塞窗口的操作已经无法匹配网络的速率,一些短流的拥塞窗口还没达到BDP就已经结束了。因此,需要有新的算法来提高网络带宽的利用率。

4.2 BIC算法

CUBIC算法的前身是BIC算法。BIC算法认为:TCP调制cwnd窗口的本质是找到一个适合当前网络的一个发送窗口,传统的AIMD其实是一个类似遍历搜索的过程。BIC认为这个最适合的窗口值位于1至无穷大之间,因此将cwnd窗口的选择问题类似与一个二分搜索的问题。

相比于Reno,BIC算法改进了Reno在快速恢复阶段后的行为,在BIC中,不进入拥塞避免阶段,而是进入一个二分搜索的阶段。

二分搜索阶段:当发生丢包时,认为cwnd窗口的最大值为 W m a x W_{max} Wmax,乘法减小后的窗口值为最小值 W m i n W_{min} Wmin。BIC算法认为最适合的窗口值位于 W m i n W_{min} Wmin W m a x W_{max} Wmax之间,因此在该区间进行二分搜索,即下一个cwnd为 c w n d = ( W m i n + W m a x ) / 2 cwnd=(W_{min}+W_{max})/2 cwnd=(Wmin+Wmax)/2。然后再更新 W m i n = c w n d W_{min}=cwnd Wmin=cwnd

但当当前的最大拥塞窗口比较大时,发生丢包后下一次窗口的更新幅度比较大,可能会造成传输的抖动,即 ( W m a x + W m i n ) / 2 (W_{max}+W_{min})/2 (Wmax+Wmin)/2 W m i n W_{min} Wmin相差比较大。此时,BIC设置了一个cwnd增幅限制 S m a x S_{max} Smax,当 [ ( W m a x + W m i n ) / 2 − W m i n ] > S m a x [(W_{max}+W_{min})/2-W_{min}]>S_{max} [(Wmax+Wmin)/2Wmin]>Smax时,cwnd为 c w n d = W m i n + S m a x cwnd=W_{min}+S_{max} cwnd=Wmin+Smax,而不是 W m i d W_{mid} Wmid

BIC还有一个缺点,就是 W m a x W_{max} Wmax可能并不是网络的瓶颈带宽,此时就需要BIC去探测网络的带宽,直至发生丢包,该阶段称为 M a x − P r o b e Max-Probe MaxProbe阶段。
在这里插入图片描述

虚线为二分搜索阶段的 W m a x W_{max} Wmax窗口值。上图右侧为 M a x − P r o b e Max-Probe MaxProbe阶段,最初缓慢的增加,当一直未丢包时,猜测最大带宽离得很远,因此逐渐增加探测的速度。

4.3 CUBIC算法

CUBIC论文链接:CUBIC: a new TCP-friendly high-speed TCP variant
CUBIC针对BIC算法进行改进,替换了BIC的增长函数,使其更光滑,并且降低BIC算法在不同阶段(二分搜索、最大探索、 S m a x S_{max} Smax S m i n S_{min} Smin)的复杂度。CUBIC用三次函数代替了BIC原有的窗口增长函数。
CUBIC的窗口增长函数如下:
在这里插入图片描述
CUBIC的cwnd增长函数为:
W ( t ) = C ( t − K ) 3 + W max ⁡ W(t)=C(t-K)^{3}+W_{\max } W(t)=C(tK)3+Wmax
其中 t t t为从上一次窗口减少到现在的时间, K K K为无丢包时,拥塞窗口从 W W W增加至 W m a x W_{max} Wmax的时间周期。可以观察到当 t = K t = K t=K时, W ( t ) = W m a x W(t)=W_{max} W(t)=Wmax。其中,K为:
K = W max ⁡ ∗ β C 3 K=\sqrt[3]{\frac{W_{\max } * \beta}{C}} K=3CWmaxβ

其中, β \beta β与TCP的公平性有关,而 C C C与Cubic的收敛速度有关。


五、

PRR

参考链接:
万字详文:TCP 拥塞控制详解
TCP NewReno

今天的文章拥塞控制的一般原理_拥塞控制的四种算法分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65233.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注