• [网络工程师]-传输层协议-TCP拥塞控制


            TCP拥塞控制的概念是:每个源端判断当前网络中有多少可用容量,从而知道它可以安全完成传送的分组数。拥塞控制解释防止过多的数据注入网络,避免网络中间设备(路由器、交换机等)过载而发生拥塞。拥塞控制是一个全局性的过程,与流量控制不同,流量控制仅指点对点通信量的控制。

            TCP拥塞控制机制包括慢启动、拥塞避免、快重传、快恢复、RED等。

    1、慢启动与拥塞避免

            慢启动又称慢开始。发送方维持的拥塞窗口是一个状态变量,网络拥塞程度动态决定cwnd(congestion windows)的值(网络出现拥塞,则cwnd值会调小些;反之则调大些),发送方的发送窗口等于拥塞窗口,考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。

            慢启动的策略是:主机一开始发送大量数据,有可能引发网络拥塞,因此较好的方法是先探测一下,由小到大逐步增加拥塞窗口cwnd的大小。通常,在刚开始发送报文段时,可将cwnd设置为一个最大报文段MSS的数值。而在每收到一个对新报文段的确认后,将拥塞窗口增加至多一个报文(严格来说是增加一个MSS大小的字节)。这种方式下,cwnd的值是逐步增加的,下图描述了慢启动的过程:

            具体过程如下:

            第一步:发送方设置cwnd=1,并发送报文段M1,接收方接收后确认M1;

            第二步:依据慢启动算法,发送方每收到一个新的报文确认(不计重传),则cwnd加1。所以发送方接收M1确认后,cwnd由1变为2,并发送报文段M2和M3。接收方接收后发回对M2和M3的确认;

            第三步:发送方接收M2和M3的确认后,cwnd由2变为4,并可以发送报文段M4~M7。由此可见,每经过1轮(就是一个往返时间RTT),cwnd值翻倍。

            慢启动的“慢”是指初始值小,但其cwnd是成倍增加的。由于cwnd倍增速度过快,因此需要使用一个慢启动门限ssthresh状态变量限制cwnd倍增。

            (1)当cwnd

            (2)当cwnd>ssthresh时,改用拥塞避免算法。拥塞避免算法就是每经过1轮(1个往返时间RTT),cwnd值加1,而不是倍增;

            (3)当cwnd=ssthresh时,可任选慢启动与拥塞避免算法。

            下图为慢启动与拥塞避免示例,描述了控制cwnd的增长、设定sshresh阈值的过程和策略:

                     

            (1)TCP连接初始化,cwnd设为1。设置cwnd增长的阈值ssthresh=16;

            (2)当cwnd

            (3)当cwnd=ssthresh=16时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长;

            (4)当cwnd=24时,突遇网络拥塞,出现超时。设置拥塞窗口cwnd=1,增长的阈值ssthresh=12(执行"乘法减少”,即出现超时的拥塞窗口值24的一半),并开始执行多轮慢启动算法;

            (5)当cwnd=ssthresh=12时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长。

    2、快重传与快恢复

            快重传额快恢复是TCP拥塞控制机制中,为进一步提高网络性能而设置的两个算法。

            快重传规定:(1)接收方在收到一个失序的报文段后立即发出重复确认,该目的是使发送方及早知道有报文段没有到达对方;(2)发送方只要收到三个连续重复确认,就应当立即重传对方尚未收到的报文段,而无须等待设置的重传计时器的时间到期。

            快重传如下所示:

                       

            图中,接收方没有收到M3而接收到了M4,出现了失序,因此重复发送三个M2确认;发送方接收到三个确认后,立刻重传报文M3。

            

            快恢复算法是与快重传算法搭配使用的算法。快恢复算法的要点为:当发送方连续收到三个重复的报文段确认时,慢启动阈值ssthresh减半,但之后并不执行慢启动算法,而是执行拥塞避免算法(拥塞窗口cwnd值呈线性增加)。执行过程如下所示:

                 

            快重传后使用快恢复的方式为“TCP Reno版本”;而快重传后使用慢启动的方式为“TCP Tahoe版本”,现已废弃不用。

    3、随机早期检测RED

            另一种TCP拥塞控制的方法是预防性分组丢弃,即检测到网络拥塞的早起征兆时(路由器的平均队列长度超过了一定的门限值),就用一定的概率p丢弃个别分组,从而避免网络全局拥塞,改进网络的性能。

            早期路由器采用尾部丢弃策略,但是会出现连个问题:(1)丢失分组必须重传,增加网络负担,导致TCP传输延时明显;(2)全局同步现象。路由器的丢弃数据行为导致发送方吹安超时重传,TCP进入慢启动状态,这样一段时间内,网络通信量急剧下降;又因为许多TCP连接在大约同一时刻进入慢启动,它们将在大约同一时刻脱离慢启动,而这将引起网络通信量的急剧上升。这种情况陈伟TCP的“全局同步”。

            为了避免出现”全局同步“现象,路由器采用随机早期检测(Random Early Detection,RED)算法。路由器在输出缓存完全装满之前,就随机丢弃一个或多个分组,避免发生全局性拥塞的现象,使得拥塞控制只是在个别的TCP连接上进行。RED算法中,路由器的队列维持两个参数,即队列长度最小门限TH{min}和最大门限TH{max}。RED对每一个到达的数据报都先计算平均队列长度L{AV}

            (1)若L{AV}<TH{min},则将新到达的数据报放入队列进行排队;

            (2) 若L{AV}>TH{max},则将新到达的数据报丢弃;

            (3)若TH{min}<L{AV}<TH{max},则按照某一概率P,将新到达的数据报丢弃。

    4、TCP协议的重传时间

            TCP可靠的一个保证机制就是超时重传,而超时重传的核心是重传超时时间的计算。计算超时重传时间的参数如下:

            (1)往返时间(Round Trip Time,RTT):发送端发送一个数据包给对端,然后接收端返回一个ACK。发送端计算出这个包来回所需的时间就是RTT。

    RTT=链路层的传播时间+端点协议栈的处理时间+中间设备的处理时间

            RTT的前两个部分值相对固定,而中间设备处理时间会随着网络拥塞程度的变化而变化,所以RTT的变化在一定程度上反应了网络的拥塞程度。

            (2)加权平均往返时间(Smoothed RTT,RTTS):又称平滑往返时间,该时间是通过多次RTT的杨根本多次测量的结果。

    RTTS的初始值=计算出来的第一个RTT

            RTTS的计算公式如下:

    新的RTTS=(1-\alpha)*(旧的RTTS)+\alpha*(新的RTT样本)

            根据RFC推荐,\alpha值为1/8,这样计算的RTTS更加平滑。

            (3)重传超时时间(Retransmission TimeOut,RTO):基于RTT计算出的一个定时器超时时间。RTO的作用是:没发送一个TCP报文段,就开启一个重传计时器。当计时器超时,还没有收到接收方的确认,就重传该报文段。RTO的计算公式为:

    RTO=RTTS+4*RTTD

            式中:RTTD的初始值=1/2*RTT样本值。

            RTTD的计算公式为:

    新的RTTD=(1-\beta)*(旧的RTTD)+\beta*|RTTS-新的RTT样本|

            根据RFC推荐,\beta值为1/4。

     

     

     

     

  • 相关阅读:
    C++内存管理
    力扣面试题17.04:消失的数字
    【UCIe】UCIe 软件配置
    红队打靶:Misdirection打靶思路详解(vulnhub)
    Thymeleaf模板
    机器学习6——EM算法与高斯混合模型GMM
    Nested嵌套对象类型还挺实用
    论文超详细精读|五千字:PB-GCN
    Flutter 应用程序性能优化建议
    线性代数_第二章,矩阵
  • 原文地址:https://blog.csdn.net/m0_58983558/article/details/127834510