TCP拥塞控制——慢开始与拥塞避免AIMD

来源:互联网 发布:sql中union的用法 编辑:程序博客网 时间:2024/05/23 23:24

*之前总结了TCP拥塞控制的原理, 这次来看看具体的设计算法——慢开始与拥塞避免。。。→_→*

  1. 拥塞窗口cwnd(Congestion Window)

    • 发送方维持一个叫做拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度且动态变化。发送方让自己的发送窗口等于拥塞窗口,如果还考虑接收方的接受能力,那么发送窗口还可能小于拥塞窗口

    • 发送方控制拥塞窗口的原则:只要网络没有出现拥塞,就增大拥塞窗口,以便将更多的分组发送出去;只要网络出现拥塞(发送方没有按时收到应当到达的确认报文),就减少拥塞窗口,以减少注入到网络中的分组数

  2. 慢开始(Slow Start)算法

    • 由小到大逐渐增加发送窗口,相当于由小到大逐渐增大拥塞窗口数值。通常在刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的字节数,当每收到一个对新的报文的确认后,就将拥塞窗口增加至多一个MSS的字节数,以逐渐增大发送方的拥塞窗口cwnd

    • 拥塞窗口的变化

    • 使用慢开始算法后,每经历一个传输轮次(Transmission Round),拥塞窗口cwnd就加倍

    • 传输轮次:一个传输轮次所经历的时间是往返时间RTT。这里更加强调是将拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到对发送的最后一个字节的确认

  3. 拥塞避免(Congestion Avoidance )

    • 让拥塞窗口cwnd缓慢的增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,所以拥塞窗口按线性规律缓慢增长,比慢开始算法的拥塞窗口增长更加缓慢
  4. 慢开始门限ssthresh

    • 防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置慢开始门限ssthresh状态变量

    • cwnd < ssthresh时,使用慢开始算法

    • cwnd == ssthresh时,可以使用慢开始算法,也可以使用拥塞避免算法

    • cwnd > ssthresh时,使用拥塞避免算法

    • 无论使用哪种算法,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半,把拥塞窗口cwnd设置为1,执行慢开始算法

    • 慢开始和拥塞避免算法

  5. 总结

    • 乘法减小(Multiplicative Decrease):不论在慢开始阶段或拥塞避免阶段,只要出现超时,就把慢开始门限值减半(当前拥塞窗口的一半)

    • 加法增大(Additive Increase):执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止网络过早出现拥塞

    • 将这两种算法结合起来被称为AIMD算法

    • 拥塞避免不能完全避免拥塞,只是在拥塞避免阶段将拥塞窗口控制为线性增长,使网络不容易出现拥塞

阅读全文
0 0
原创粉丝点击