BBr也是基于延时判断阻塞,也是基于aimd试探码率
BDP?
1、BBR的原理
BBR核心就是保持BDP=BtlBW * RtPop操作,这样可以获取最大带宽BtlBW,同时只有物理延迟(RTProp全称Round-trip Propagation Delay, 也就是物理链路延迟)。下图可清楚说明带宽、物理延迟、排队延迟的关系(引自ACM Queue):
- RTprop: 物理延迟。仅当链路没有排队时,这时的RTT才是物理延迟
- BtlBW: 可用带宽(?)。仅当有排队时,此时才是最大可用带宽。
- 排队延迟:当发送速率大于BtlBW时,导致有数据排队,导致额外排队延迟
2、BBR的状态机
BBR用了两个状态的状态机,交替测量RTProp和BtlBW。(实际上有三个,还有一个startup慢启动阶段,与TCP区别不大就省略了)。
其状态机如下:
- ProbeBW: 探测最大可用带宽,一般持续10s以上,是BBR的主要状态。探测带宽时按照Pacing_Gain调整速度。一个Gain Cycle有8个阶段[1]:
每次调整都是: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的BDP如下图所示,不再包括警戒区的网络缓存:
我用一个统一的图表示RTT和带宽的关系:
BBR对最大带宽和最小RTT的探测
从模型图上可以清楚的看出如何探测最大带宽:
BBR在一个不随时间滑动的大概10秒的时间窗口中采集最小RTT,BBR只使用这个最小RTT计算Pacing Rate和拥塞窗口。BBR不会对RTT变大进行反应。但是如果整的发生了拥塞,RTT确实会变大,BBR怎么发现这种情况呢?答案就在于这个时间窗口的超期滑动,如果在一个时间窗口内持续没有采集到更小的RTT,那么就会将当前的RTT赋值个最小RTT。BBR就是这样抵抗假拥塞的。秒级的窗口内,什么都是瞒不住的。这就是RTT的测量以及使用原则: