bbr2代码地址https://github.com/google/bbr/blob/v2alpha/net/ipv4/tcp_bbr2.c
问遍Chatgpt,都没得到理想的答案。痛定思痛,决定手工撸代码,,,,,,。
BBR的版本V2中,将Probe_BW阶段分为4个小阶段,分别是down–>cruise–>refill–>up。up阶段又分为两个小阶段,分别是前期的平稳探索阶段,这个阶段的inflight和cwnd的设置与BBR的V1版本探索阶段相同(暂时的理解,不一定准确),当cwnd > inflight_hi时,up阶段进入了狂野探索阶段,这个阶段每经过一个RTT inflight_hi分别额外增加1,2,4,8。额外增加的inflight以指数方式倍增。所以首先要判断当前额外增加inflight大小,代码如下:
bbr2_raise_inflight_hi_slope():
growth_this_round = 1 << bbr->bw_probe_up_rounds;
其次判断在当前rtt周期内,收到多少个ack需要增加一个inflight_hi,这里的思想与cnwd的思想相同,采用逐渐增加inflight_fi,而并不是一个rtt结束时一整个增加。所以代码如下:
bbr2_raise_inflight_hi_slope():
cnt = tp->snd_cwnd / growth_this_round;
cnt = max(cnt, 1U);
bbr->bw_probe_up_cnt = cnt;
tp->snd_cwnd代表当前rtt周期内收到ack的最大数据量,growth_this_round为当前周期内需要增加的inf大小,cnt就是代表每收到多少个ack需要增加inflight_hi。举个栗子,这个rtt周期内收到10个ack,需要增加2个inflight,那么每收到5个ack就将inflight的大小增加1.
所以在函数bbr2_probe_inflight_hi_upward()中,下述代码:
bbr->bw_probe_up_acks += rs->acked_sacked;
if (bbr->bw_probe_up_acks >= bbr->bw_probe_up_cnt) {
delta = bbr->bw_probe_up_acks / bbr->bw_probe_up_cnt;
bbr->bw_probe_up_acks -= delta * bbr->bw_probe_up_cnt;
bbr->inflight_hi += delta;
bbr->debug.event = 'I'; /* Increment inflight_hi */
}
逻辑如下:
- bbr->bw_probe_up_acks >= bbr->bw_probe_up_cnt说明已经达到增加inflight的时机
- delta 代表增加多少个整数个inflight,注意bbr->bw_probe_up_acks / bbr->bw_probe_up_cnt不一定乘除,
- 因为ack已经部分用于增加inflight了,所以需要将ack的部分减掉
- bbr->inflight_hi += delta;