假定:
    1、数据是单方向传递,另一个窗口只发送确认;
    2、接收方的缓存足够大,因此发送方的大小的大小由网络的拥塞程度来决定。

    拥塞窗口cwnd(congestion window)的状态变量:取决于网络的拥塞程度,并且动态地在变化

    发送方:拥塞窗口cwnd:发送方维护的一个状态变量,根据网络拥塞程度动态变化
    swnd = min(cwnd, rwnd)
    标志:重传即未在规定时间内接收ACK应答报文,标志拥塞发生
    图示

    实现算法(实现策略)
    ssthresh:慢启动门限slow start threshold
    用法如下:
    当cwnd当cwnd>ssthresh时,改用拥塞避免算法。
    当cwnd=ssthresh时,慢开始与拥塞避免算法任意

    慢启动:先探测一下网络的拥塞程度
    拥塞避免
    拥塞发生:把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
    目的:迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕
    快速恢复

    image.png
    (1)拥塞窗口cwnd初始化为1个报文段,慢开始门限初始值为16
    (2)执行慢开始算法,指数规律增长到第4轮,即cwnd=16=ssthresh,改为执行拥塞避免算法,拥塞窗口按线性规律增长
    (3)假定cwnd=24时,网络出现超时(拥塞),则更新后的ssthresh=12,cwnd重新设置为1,并执行慢开始算法。当cwnd=12=ssthresh时,改为执行拥塞避免算法
    关于 乘法减小(Multiplicative Decrease)和加法增大(Additive Increase):
    “乘法减小”指的是无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,所以当网络频繁出现拥塞时,ssthresh下降的很快,以大大减少注入到网络中的分组数。“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞。常合起来成为AIMD算法。
    注意:“拥塞避免”并非完全能够避免了阻塞,而是使网络比较不容易出现拥塞。

    image.png
    往返时间RTT:

    初始化 init_ssthresh、init_cwnd

    1. 慢启动 cwnd < ssthresh

    每收到一个ACK,cwnd = cwnd + 1 即 cwnd(new) = cwnd * 2^n,即指数增长

    1. 拥塞避免 cwnd > ssthresh

    每收到一个ACK,cwnd = cwnd + 1/cwnd 即 cwnd(new) = cwnd + 1,即线性增长

    1. 拥塞发生

    a.超时重传 —— 慢启动
    ssthreth(new) = cwnd / 2(但不能小于2)
    cwnd(new) = init_cwnd
    b.快速重传 —— 快速恢复
    cwnd(new) = cwnd / 2
    ssthreth(new) = cwnd

    1. 快速恢复 —— 拥塞避免

    cwnd(new) = ssthreth + 3 (此时已进行拥塞发生快速重传算法即ssthreth=old_cwnd / 2)

    快重传:接收失序报文段后立即发出重复确认(及早告知,提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认。连续接收到3个重复确认后立即重传而不等待重传计时器到期。
    如接收M4后立即重复确认,接收到应答M6后立即重传
    image.png
    快恢复:
    image.png

    注意:在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用