BBR的工作流程和原理

1.基本原理

BBR是Bottleneck bandwidth and RTT的简称,其说明其工作的两个主要参数:瓶颈带宽BW与RTT。

瓶颈带宽其实就是应用占用的带宽值(此带宽值由其所在链路上的最小/瓶颈带宽来决定),以下我们用BW来简称。而RTT是指无队列时的RTT,以下我们都用RTT来简称。

根据BW, 拥塞控制算法可以计算数据包发送速率。在有可靠的BW与RTT后,就可以计算带宽延迟积BDP(Bandwidth Delay Product)来设置发送窗口的大小。

解释一下为什么是用BDP来设置窗口大小:其思路与westwood的利用带宽来调控窗口的思路类似,发送窗口(简称CWND)可以指代在链路上正传送的报文数。

而BDP是指在RTT时间内发送的报文数,可以看成是前一个RTT发送并到达接受端的报文和当前刚要从发送端出发的报文间传送的报文数,也就是链路上正传送的报文数。

2.工作模式概述

BBR有4个工作模式:StartUp, Drain, ProbeBW, ProbeRTT.  其工作时序如下所示:

其中StartUp模式只在连接开始时运行,其结束后运行Drain模式, 等待队列排空后,进入Steady-Stage,循环运行ProbeBW与ProbeRTT模式。

StartUp与传统的Slow Start类似,是为了快速填充带宽,不同点在于StartUp还需要快速探测出BW.

Drain模式作为BBR独有的,是为了排空StartUp模式下转发设备上积累的队列。

获得BW, 测量出RTT后, BBR进入稳定的基于BW的数据发送模式,即交替的进入ProbeBW模式与ProbeRTT模式来工作。

3.BBR调控参数

了解BBR的工作流程,首先需要了解BBR做TCP拥塞控制时调控数据包发送的参数:

BBR主要调控数据包的发送速率参数sk_pacing_rate, 保证其和带宽匹配;次要调控参数为snd_cwnd, 保证其和BDP匹配。

同时,BBR修改的是cong_control function,与之相对的,其他算法只是修改cong_avoid  function,并通过设定snd_cwnd来间接的控制发送速率 [注 1]。

因此在分析BBR时,其窗口行为和报文发射行为可以分开考虑。一般的,cwnd会在带宽填充满时保持稳定的大小,而在带宽增加时,窗口增加速度保持比发射速度增加更快。

还需注意的是,cong_control func拿到的是struct rate_sample, 是发送packet的采样数据, 记录时间间隔(单位us)与间隔内发送的数据包(rs->delivered),并在tcp_ack()会更新其数据。

尽管struct rate_sample会测量原始的数据,但是要想保证拥塞控制算法高效、正确的工作,测量BW与RTT仍旧是BBR的重要的组成机制。

4.RTT与BW的测量

为了保障测量的RTT与BW的可靠性,需要设定特殊的机制来工作。与海森堡测不准原理类似,RTT与BtlBw无法同时测得。因此,BBR设定两个工作模式:ProbeBw与ProbeRT。

a. ProbeRTT

在ProbeRTT模式,BBR会把窗口设为不大于bbr_cwnd_min_target(=4)的大小,其目的是排干队列,测量尽可能精确的RTT。

整个ProbeRTT持续的时间为200ms, 并每隔10s进入该模式一次。由于ProbeRTT仅占整个时间周期的2%,因此不会带来较大的影响。

当然,在非ProbeRTT模式下,如果ACKed的packet的rtt小于当前最小rtt(min_rtt_us), 同样也会更新RTT的值。

b. ProbeBW

大部分时间内,BBR都工作在ProbeBW模式,其按照周期(cycle)来工作,每个cycle有8个阶段(phase)。

其中,Phase 1探测更多的可用带宽,Phase 2排空队列,Phase 3-8保持正常带宽的发送速率。需注意,在BBR中是利用RTT作为基本的更新与操作单位。在这里,每个Phase是1个RTT 时间。

ProbeBW的工作时序如下所示:

BBR有两种测量带宽的模式,一种是long term sampling, 其工作在网络中路径是policing的情况下[注 2],测试采样取两次丢包时刻之间的间隔内的BW ,这意味着测量的带宽尽可能的接近policing设置的带宽;

另一种是是窗口最大值,这是利用linux/win_minmax的struct minmax[注 3]来实现,窗口大小为10(bbr_bw_rtts),每次ACK到达后就会更新。不过在每个RRT内只采样一次(测量的最大值),记录到窗口中。


注 1:在tcp_input.c里,line 778注明 ”* In Slow Start [1], set sk_pacing_rate to 200 % the current rate. * In Congestion Avoidance phase, set it to 120 % the current rate.”, current rate = mss*cwnd/srtt"

注 2:policing与shaping相对应。通俗的说,policing指流的带宽被指定的情况,例如指定某个源地址的带宽为1M,多发的包会被丢掉。shaping指完全基于队列来转发的流,只有当队列满时才会丢包。

具体的区别如下所示(取自“An Internet-wide analysis of traffic policing”,SIGCOMM 2016)

注 3:struct minmax记录3次采集的结果,data[0]是最大(小)值。如果发现更大(小)结果,就会更新data[0]。在滑动到1/4,1/2窗口,还没有出现比data[0]更大(小),会直接赋值data[1], data[2](假如比data[1]更大(小)的话,还是会更新data[1])。


猜你喜欢

转载自blog.csdn.net/eipi1/article/details/80237721