整体过程如下图 , 在一个 10Mbps 带宽 , 延迟 40ms 的网络下取了 700ms 时长的数据 。图中纵轴有 RTT , inflight , 和 Bandwidth (BW) 。带宽部分有两个值 , 红色的是发送方计算出来的 Delivery Rate , 紧挨着红色线的黑线是当前估计出来的 BtlBw 。可以看到 Delivery Rate 波动但估计出来的 BtlBw 变动不大 , 因为是每次有估计出 Delivery Rate 后将这个值放入估计 BtlBw 的滑动统计窗口内 , 取滑动窗口内的最大值为 BtlBw , 也即那个黑色线 , 所以红色线变动后 , 黑色线不会立即变动 。黑色线上面的灰色框是 cycle gain 用于控制发送速度 , cycle gain * 估计的 BtlBw 就是发送方当前需要的发送速度 。每个周期通过控制 cycle gain 来定期的提高发送速度 , 以探测当前链路上 BtlBw 是否提高 。
对于黑色的圈我们从起点开始说 , 起点是红线 , 即 Delivery Rate 计算出来后 , 放入 max BtlBw 滑动窗口估算 BtlBw 是多少 。之后 1.25 这个 cycle_gain 时用之前估算的 BtlBw 乘以 1.25 作为发送速度发消息 , 增周期发消息多了以后链路 Inflights 增大 , RTT 增大 , 发出的消息看到是在 1.00 这个 cycle_gain 才被 Ack , 计入 Delivery Rate , 并让 max BtlBw 稍微增加了一点点 , 看到红线峰值比红线上面的细黑线高了一点 , 于是将细黑线也向上推了一点点 。
图中 RTT , Inflights , cycle_gain , Delivery Rate 大致都是对齐的 , 可以看到增周期时候 Delivery Rate , Inflights 和 RTT 增加 , 减周期是减少 。
文章插图
来自[4]
下图是带宽从 10Mbps , 40ms 延迟提到到 20Mbps 又降回 10Mbps 的过程 。带宽提高后看到在 ProbeBW 的增周期 , BBR 发现提高发送速度后 RTT 没有变化 , 且计算出来的 deliveryRate 有升高 , 更新 BtlBw 到新值 , 稳定期发送速度比原来高了 25% 。在接下来三个周期内 , 每一次发送速率提高 25% 后延迟都没有变化 , 且 deliveryRate 得到提高 , 最终在第四个探测周期重新出现蓝色小三角 , 即链路上队列有排队后说明链路进入 full_pipe 状态开始稳定发送速率 。
下半部分是带宽从 20Mbps 降低到 10Mbps , BBR 内因为维护了 BtlBW max filter 即从一个窗口期内采样得到的 BtlBw 值中取最大值作为当前链路的 BtlBw 。所以即使带宽出现突降 , 因为 20Mbps 的 BtlBw 还在 max filter 内缓存着 , 这段时间 BBR 依然认为 BtlBw 是 20Mbps , 会按照原来的发送速度继续发数据 。于是带宽突降后延迟和 inflight 数据量大幅度增加 。但 inflights 数据量最大不能超过 BBR 内的 target cwnd , 其值等于 `cwnd gain * 估计的 BDP` , BBR 会始终控制发送速率保持 inflights 在 target cwnd 内 , cwnd gain 比 1 大 , 但不会大很多 , 所以带宽突然变小后 inflights 不会无限增加 , 并且会维持一个固定值 , 在图中表现为 40s ~ 42s 之间的一条水平线 。这个期间即使处在 ProbeBW 阶段也无法执行增周期按 1.25 倍速率发数据 , 因为 target cwnd 是满的 , 必须遵从它的限制 , 它限制了发送端不能让 inflights 数据量比它大 。Inflights 和 RTT 能是一条水平线说明链路上 Buffer 比较大 , 能承载 target cwnd 下的数据量且不出现丢包 。
补充一下 BBR 里有两个听起来很像的东西 , pacing gain 和 cwnd gain 。pacing gain 用来在 ProbeBW 内周期性的控制发送速率 , 发送速率等于估计的 `BtlBw * pacing gain` 。而 cwnd gain 用于控制 target cwnd , 限制 inflights 数据量 。
在 42s 开始 , 之前 20Mbps 的 BtlBw 估计值过期了 , 从 BtlBw max filter 的采样窗口中滑出 , 根据过去一段时间 Ack 计算出来的到达重新估算 BtlBw , 根据这个重新估算的 BtlBw 调整发送速度 , 所以发送速率大幅度下滑 。因为当前的 Inflights 数量远大于当前的 target_cwnd 也即 cwnd_gain * 新估计的 BtlBw , 所以发送方会完全不发数据等待 Inflights 下降 , 在图上表现出 Inflights 突然掉下来 。当 Inflights 小于当前 target_cwnd 后 , ProbeBW 的周期特性又开始显现 , 一个一个的小三角开始出来了 。最终发送速率重新回到稳态 。
推荐阅读
- 看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来
- 翡翠|翡翠饰品的价格不断增长,但是要投资需要谨慎,避免被假货蒙骗
- MITM 如何避免中间人攻击
- 避免电动车变“炸弹”,做对这些事很重要
- 淘宝联盟站内推广如何避免 淘宝联盟如何推广
- 练习太极拳的时候怎样避免膝盖受伤
- Google tcp拥塞控制 bbr算法
- 发型|5款短下巴「显瘦发型」推荐,八字刘海显瘦,避免剪错发型会显胖!
- 地暖为啥逐渐被“嫌弃”?业主说了四个无法避免的弊端,你后悔没
- 防晒|皮肤暗黄的女人,日常避免3不要,很多人都忽略了,难怪白不起来