bbr草稿

BBr也是基于延时判断阻塞,也是基于aimd试探码率

BDP?

1、BBR的原理

BBR核心就是保持BDP=BtlBW * RtPop操作,这样可以获取最大带宽BtlBW,同时只有物理延迟(RTProp全称Round-trip Propagation Delay, 也就是物理链路延迟)。下图可清楚说明带宽、物理延迟、排队延迟的关系(引自ACM Queue):

bbr草稿

  1. RTprop: 物理延迟。仅当链路没有排队时,这时的RTT才是物理延迟
  2. BtlBW: 可用带宽(?)。仅当有排队时,此时才是最大可用带宽。
  3. 排队延迟:当发送速率大于BtlBW时,导致有数据排队,导致额外排队延迟

2、BBR的状态机

BBR用了两个状态的状态机,交替测量RTProp和BtlBW。(实际上有三个,还有一个startup慢启动阶段,与TCP区别不大就省略了)。

其状态机如下:

bbr草稿

  • ProbeBW: 探测最大可用带宽,一般持续10s以上,是BBR的主要状态。探测带宽时按照Pacing_Gain调整速度。一个Gain Cycle有8个阶段[1]:

bbr草稿

每次调整都是:BtlBW * Pacing_Gain。 (呵呵,BBR调整力度不小,每次增加码率是之前的25% per RTT,这可比TCP高多了)

另外,为了提高公平性,BBR会打乱上面Pacing_gain顺序,随机挑选开始阶段。

  • ProbeRTT:探测物理RTTProp。当10s内没有发现最小RTTProp时,就要进入ProbeRTT状态。在ProbeRTT状态,仅发4pkts/RTT(接近停止发送),从而排空链路上的数据包,测量真实的RTTProp

3、BBR pacing发送控制

BBR采用了一种pacing发送方式,控制数据包的发送间隔,从而避免突发一个窗口,导致排队延迟和丢包。(此方法在rate-based congestion control早已使用, linux kernel不熟,不清楚是否采用。不过linux FAST早已是pacing)

方法如下:

bbr草稿

按照当前设定的探测速率,计算每个数据包的发送间隔。定好下个数据包的发送时间

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

bbr草稿

 管道长,意味着窗口爬升慢,丢包感知慢,丢包恢复慢。

管道肥,意味着目标很远大,结合管道长的弱点,达到目标更加不易

bbr草稿

 最终,BBR的BDP如下图所示,不再包括警戒区的网络缓存:

bbr草稿

 我用一个统一的图表示RTT和带宽的关系:

bbr草稿BBR对最大带宽和最小RTT的探测

从模型图上可以清楚的看出如何探测最大带宽:

bbr草稿

 

  BBR在一个不随时间滑动的大概10秒的时间窗口中采集最小RTT,BBR只使用这个最小RTT计算Pacing Rate和拥塞窗口。BBR不会对RTT变大进行反应。但是如果整的发生了拥塞,RTT确实会变大,BBR怎么发现这种情况呢?答案就在于这个时间窗口的超期滑动,如果在一个时间窗口内持续没有采集到更小的RTT,那么就会将当前的RTT赋值个最小RTT。BBR就是这样抵抗假拥塞的。秒级的窗口内,什么都是瞒不住的。这就是RTT的测量以及使用原则:

bbr草稿

 

上一篇:matlab如何从信号中去除60 Hz Hum电源线噪声


下一篇:impala导出结果集impala-shell -f hz2.txt -B --output_delimiter="\t" -o hz_result.txt