bbr2有关inflight_hi的部分理解part1

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;
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值