TCP 拥塞避免算法( 三 )


可以参考: Bufferbloat: Dark Buffers in the Internet - ACM Queue
PRR在 CUBIC 之上又有个优化 , 叫做 Proportional Rate Reduction (PRR) , 用以让 CUBIC 这种算法在遇到丢包时候能更快的恢复到当前 CWND 正常值 , 而不过分的降低到过低的水平 。
参考: draft-mathis-tcpm-proportional-rate-reduction-01 - Proportional Rate Reduction for TCP  。不进一步记录了 。Linux 3.X 的某个版本引入的 , 配合 CUBIC 一起工作 。
链路上的队列模型为了进一步优化 Cubic , 可以先看看链路上队列的模型 。

  • 当链路上数据较少时 , 所有数据都在发送链路上进行发送 , 没有排队的数据 。这种情况下延迟最低;
  • 当传输的数据更多时候 , 数据开始排队 , 延迟开始增大;
  • 当队列满的时候进入第三个状态 , 队列满了出现丢包;

TCP 拥塞避免算法

文章插图
 
来自[1]
最优状态是 State 1 和 State 2 之间 , 即没有出现排队导致延迟升高 , 又能完全占满链路带宽发送数据 , 又高效延迟又低 。而基于丢包的 Congestion Avoidance 策略都是保持在 State 2 的状态 。而 Cubic 是让 CWND 尽可能保持在上一个 Wmax 的状态 , 也即 State 2 末尾和即将切换到 State 3 的状态 。所以 Cubic 相当于尽可能去占用链路资源 , 使劲发数据把下游链路占满但牺牲了延迟 。
于是可以看到 , 为了保持在 State 1 和 State 2 状态 , 我们可以监控每个数据包的 RTT , 先尽力增大 CWND 提高发送率如果发现发送速率提高后 RTT 没有升高则可以继续提高发送速率 , 直到对 RTT 有影响时就减速 , 说明从 State 1 切换到了 State 2 。
我们希望让 CWND 尽力保持在下面图中标记为 optimum operating point 的点上 , 即 RTT 又小 , 链路上带宽又被占满 。在这个图上 , RTprop 叫做 round-trip propagation time  , BtlBw 叫做 bottleneck bandwidth。横轴是 inflights 数据量 , 纵轴有两个一个是 RTT 一个是送达速度 。看到图中间有个很淡很淡的黄色的线把图分成了上下两部分 , 上半部分是 Inflights 数据量和 Round trip time 的关系 。下半部分是 Inflights 和 Delivery Rate 的关系 。
这里有四个东西需要说一下 CWND、发送速度、inflights , 发送者带宽 。inflights 就是发送者发到链路中还未收到 ACK 的数据量 , 发送速度是发送者发送数据的速度 , 发送者带宽是发送者能达到的最大发送速度 , CWND 是根据拥塞算法得到的当前允许的 inflights 最大数据量 , 它也影响着发送速度 。比如即使有足够大的带宽 , 甚至有足够多的数据要发 , 但 CWND 不够 , 于是只能降低发送速度 。这么几个东西会纠缠在一起 , 有很多文章在描述拥塞算法的时候为了方便可能会将这几个东西中的某几个混淆在一起描述 , 看的时候需要尽力心里有数 。
回到图 , 蓝色的线表示 CWND 受制于 RTprop , 绿色的线表示受制于 BltBw 。灰色区域表示不可能出现的区域 , 至少会受到这两个限制中的一个影响 。白色区域正常来说也不会出现 , 只是说理论上有可能出现 , 比如在链路上还有其它发送者一起在发送数据相互干扰等 。灰色区域是无论如何不会出现 。
先看上半部分 , Inflights 和 Round-Trip Time 的关系 , 一开始 Inflights 数据量小 , RTT 受制于链路固有的 RTprop 时间影响 , 即使链路上 Buffer 是空的 RTT 也至少是 RTprop 。后来随着 Inflights 增大到达 BDP 之后 , RTT 开始逐步增大 , 斜率是 1/BtlBw  , 因为 BDP 点右侧蓝色虚线就是 Buffer 大小 , 每个蓝点对应的纵轴点就是消耗完这么大 Buffer 需要的时间 。消耗 Buffer 的时间 / Buffer 大小 就是 1/BltBw  , 因为消耗 Buffer 的时间乘以 BltBw 就是 Buffer 大小 。感觉不好描述 , 反正就这么理解一下吧 。主要是看到不可能到灰色部分 , 因为发送速率不可能比 BltBw 大 。等到 Inflights 把 Buffer 占满后到达红色区域开始丢包 。
下半部分 , Inflights 比较小 , 随着 Inflights 增大 Delivery Rate 越大 , 因为此时还未达到带宽上限 , 发的数据越多到达率也就越高 。等 Inflights 超过 BDP 后 , Delivery Rate 受制于 BtlBw 大小不会继续增大 , 到达速度达到上限 , Buffer 开始积累 。当 Buffer 达到最大限度后 , 进入红色区域开始丢包 。


推荐阅读