3. 一些看法
网上有一些资料都提及到了这张图 , 其中的一些解释也并不算非常清晰 , 结合这些资料和自己的认识 , 笔者认为在网络链路的缓存区没有被使用时RTT为最小延时MinRTT , 在网络链路缓冲区被占满时出现最大带宽MaxBW(链路带宽+链路缓存) , 但是此时的MaxBW和MinRTT并不是最优的而是水位比较高的水平 , 有数据表明按照2ln2的增益计算此时为3BDP , 整个过程中MinRTT和MaxBW是分开探测的 , 因为这二者是不能同时被测量的 。
6.2.3 BBR算法的主要过程BBR算法和CUBIC算法类似 , 也同样有几个过程:StartUp、Drain、Probe_BW、Probe_RTT , 来看下这几个状态的迁移情况:
文章插图
- StartUp慢启动阶段BBR的慢启动阶段类似于CUBIC的慢启动 , 同样是进行探测式加速区别在于BBR的慢启动使用2ln2的增益加速 , 过程中即使发生丢包也不会引起速率的降低 , 而是依据返回的确认数据包来判断带宽增长 , 直到带宽不再增长时就停止慢启动而进入下一个阶段 , 需要注意的是在寻找最大带宽的过程中产生了多余的2BDP的数据量 , 关于这块可以看下英文原文的解释:
To handle Internet link bandwidths spanning 12 orders of magnitude, Startup implements a binary search for BtlBw by using a gain of 2/ln2 to double the sending rate while delivery rate is increasing. This discovers BtlBw in log2BDP RTTs but creates up to 2BDP excess queue in the process.
- Drain排空阶段排空阶段是为了把慢启动结束时多余的2BDP的数据量清空 , 此阶段发送速率开始下降 , 也就是单位时间发送的数据包数量在下降 , 直到未确认的数据包数量<BDP时认为已经排空 , 也可以认为是RTT不再下降为止 , 排空阶段结束 。
- ProbeBW带宽探测阶段经过慢启动和排空之后 , 目前发送方进入稳定状态进行数据的发送 , 由于网络带宽的变化要比RTT更为频繁 , 因此ProbeBW阶段也是BBR的主要阶段 , 在探测期中增加发包速率如果数据包ACK并没有受影响那么就继续增加 , 探测到带宽降低时也进行发包速率下降 。
- ProbeRTT延时探测阶段前面三个过程在运行时都可能进入ProbeRTT阶段 , 当某个设定时间内都没有更新最小延时状态下开始降低数据包发送量 , 试图探测到更小的MinRTT , 探测完成之后再根据最新数据来确定进入慢启动还是ProbeBW阶段 。
文章插图
曲线说明:这两个坐标给出了10Mbps和40msRTT的网络环境下CUBIC和BBR的一个对比过程 , 在上面的图中蓝色表示接收者 , 红色表示CUBIC , 绿色表示BBR , 在下面的图中给出了对应上图过程中的RTT波动情况 , 红色代表CUBIC , 绿色代表BBR 。
6.2.4 BBR算法的一些效果
有一些文章认为BBR有鲜明的特点 , 把拥塞控制算法分为BBR之前和BBR之后 , 可见BBR还是有一定影响 , 但是BBR算法也不是银弹 , 不过可以先看看BBR算法在谷歌推动下的一些应用效果 , 其中包括吞吐量、RTT、丢包率影响:
文章插图
文章插图
文章插图
从图中我们可以看到在YouTube应用BBR算法之后 , 就吞吐量普遍有4%左右的提升 , 特别地在日本的提升达到14% , RTT的下降更为明显平均降低33% , 其中IN(猜测是印度地区)达到50%以上 , 在丢包率测试中BBR并不像CUBIC那么敏感 , 在丢包率达到5%时吞吐量才开始明显下降 。
推荐阅读
- 轻松学习http知识让枯燥的内容变得生动有趣:TCP/IP四层模型
- Java中的BigDecimal,你真的会用吗?最强指南
- 为何视频流/网游大都使用UDP协议,而不用TCP协议?
- TCP粘包、拆包与解决方案
- 地球最强悍的生物 超级地球上有生命
- ICMP ARP协议 TCP&UDP协议相关介绍,两分钟快速掌握
- TCP粘包的解决方案
- TCP 拥塞避免算法
- 看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来
- 世界上最烈的啤酒排名是什么?