zoukankan      html  css  js  c++  java
  • roportional Rate Reduction (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,可以先看看链路上队列的模型。

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


    来自[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 达到最大限度后,进入红色区域开始丢包。

    之前基于丢包的拥塞算法实际上就是和链路 Buffer 一起配合控制 Inflights 数据量在 BDP 那条线后面与 BDP 线的距离。以前内存很贵,可能只比 BDP 大一点,基于丢包的算法延迟就不会很高,可能比最优 RTT 高一点。但后来 Buffer 越来越便宜,链路上 Buffer 就倾向于做的很大,此时基于丢包的拥塞算法就容易导致实际占用的 Buffer 很大,就容易出现 BufferBloat。

    为了达到最优点,发送速率必须达到 BltBw,从而占满链路带宽,最高效的利用带宽;再有需要控制 Inflight 数据量不能超过链路的 BDP = BtlBw * RTprop,从而有最优的延迟。发送速率可以超过 BltBw,可以有队列暂时产生,但数据发送总量不能超 BDP,从而让平均下来延迟还是能在最优点附近。


    来自[4]

  • 相关阅读:
    MyBatisPlus-快速入门
    Spring Cloud Alibaba的使用
    SpringCloud-Bus组件的使用
    Python刷题:最长回文子串(字符串)
    Python刷题:求最大连续bit数(位运算)
    Python刷题:用二进制方式求集合S的所有子集(位运算)
    Python刷题:集合S(k)求|x-y|最小时的x和y(位运算)
    Python刷题:常用二进制操作(位运算)
    Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明
    从今天起做个真正的程序员
  • 原文地址:https://www.cnblogs.com/dream397/p/14598090.html
Copyright © 2011-2022 走看看