总结:bbr在20%丢包以内表现很好
设丢包率为 ,BltBW为 ,很显然有效传输率为 ,BBR在ProbeBW状态的1.25倍速的up probe探测,若要抵消丢包,维持带宽 ,则必须保证:
解得 的值为0.2,也就是20%,正中上图。如果我们把固定的增益系数1.25抽象成一个可以调节的参数,那么会得到一个在该增益系数下的丢包率崖点:
丢包率超过该值,有效带宽将会以
的速度快速衰减。
probe bw阶段的gain为1.25
pacing = 瓶颈带宽 * gain
pacing 每间隔5ms执行一次。我理解为,
while (true) {
for (int i = 0; i < pacing; i++) {send(ms);}
usleep(5000);
}
1 首先看看初始化窗口size
初始化的时候是10个mss,要不然就是通过min rtt和探测到的bw计算出来的。bw 为带宽横截面积,gain为增益系数
2 探测RTT
上面代码是探测数据回调,如果探测到的最新RTT小于之前记录的,就更新一下,并且更新下min rtt得到的时间戳。
这个函数从哪里调用过来的?
.cong_control = bbr_main->bbr_update_model->bbr_update_min_rtt(sk, rs);
3 具体RTT探测过程
先是清除一下probe_rtt_done_stamp 这个变量,清除之后,表示要开始RTT探测了。如果判断为0,就进入RTT探测阶段,这里探测过程为200ms。
bbr->probe_rtt_done_stamp = tcp_jiffies32 + msecs_to_jiffies(bbr_probe_rtt_mode_ms); // PROBE RTT状态保持200ms
4 检查是否探测完成,检查的是时间是否过期
5 更新瓶颈带宽
elapsed 这里指的就是时长,发送delivered包量花的时间。
6 通过BW瓶颈带宽,计算得到pacing过程
7 接下来看bbr状态机切换过程
(1)Startup->drain模式
drain -> probe bw
probe bw->probe rtt 这个是通过10s一次检测的,上面讲解过了。
8 最后分析一下full_bw_reached 状态是怎么达到的?
可以理解为,保持了3次坚持到的bw值达到预测的值了。就重新进入Probe bw状态,再次probe bw瓶颈带宽。
备注:还有一些细节没有完全看明白,欢迎交流。