当前位置:首页>科技 >内容

深度解析TCP,BBR技术

2024-02-14 10:35:01科技漂亮的斑马

很多朋友对深度解析TCP,BBR技术不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。今天推荐一篇对TCP BBR技术分析

深度解析TCP,BBR技术

很多朋友对深度解析TCP,BBR技术不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。

今天推荐一篇对TCP BBR技术分析非常透彻的文章。希望你能学到一些真正的知识,了解其背后的设计原理,这样才能应对各种面试和工作挑战!

宏观背景下的BBR

20世纪80年代的拥塞崩溃导致了20世纪80年代拥塞控制机制的释放。从某种意义上来说,这是一种诡计多端的策略。针对20世纪80年代的拥塞问题,提出了1980年代的拥塞控制算法,即ss、ssthresh、congestionvoid这些。

说实话,这些机制完美地适应了20世纪80年代网络的特点,低带宽、浅缓存队列,并且美感一直延续到2000年代。

随后互联网爆炸式增长,多媒体应用特别是图片、音频和文章应用需要带宽急剧增加,摩尔定律使存储设施变得更便宜,路由器队列和缓存急剧增加。这就是BBR诞生的背景。也就是说,80年代的CC已经不适用了,2010年代还需要另外一招。

如果说上一次80年代的CC是为了收敛,那么这一次的BBR则是为了性能最大化,E,至少我个人是这么认为的,这也符合BBR提高带宽利用率的初衷!

插入gif 图像:

文本开始

国庆前,看到了bbr算法,发现这是唯一正确的方法(可能有点夸张,但至少是一个通向正路的起点!),于是花了点时间研究了一下,包括它的补丁说明、补丁代码,以及亲自移植到低版本内核的bbr补丁。在这个过程中,我也有了一些想法。作为备忘,我整理了一篇文章,记录如下。时隔多年,再看TCP bbr算法的数据,我的记录可以算得上是中文界少有的第一个吃螃蟹的记录了,够了!

正文之前先给出本文的图例:

BBR的组成

bbr算法其实很简单,实现上由5部分组成:

BBR的组成

1、即时费率计算

计算一个瞬时带宽bw,它是所有bbr计算的基准。 bbr 将根据当前即时带宽及其管道状态(见下文)计算起搏速率和cwnd(见下文)。正如我们稍后将看到的,这一瞬间带宽计算方法的突破性改进是bbr 的简单性和高效性的根源。计算方案按照标量计算,不再关注数据的含义。 bbr运行过程中,系统会跟踪迄今为止的最大瞬时带宽。

2.RTT追踪

bbr之所以能够获得非常高的带宽利用率,是因为它能够以非常安全、无约束的方式检测带宽的最大值和rtt的最小值。这样算出的BDP就是目前为止TCP管道的最大容量。 bbr的目标就是达到这个最大容量!这个目标最终驱动了cwnd的计算。 bbr运行期间,系统会跟踪迄今为止的最小RTT。

3、BBR状态机的维护

bbr算法根据互联网的拥塞行为,具体定义了4种状态,分别是STARTUP、DRAIN、PROBE_BW、PROBE_RTT。通过不断观察上面计算出的瞬时带宽bw和rtt,bbr可以在这四种状态之间自由切换。与之前所有的拥塞控制算法相比,其革命性的改进在于bbr拥塞算法不再跟踪系统状态机的TCP拥塞情况,而旨在统一处理pacingrate和cwnd的计算,无论是否当前TCP处于Open状态或者Disorder状态,或者已经处于Recovery状态。也就是说,bbr算法感觉不到丢包,它能看到的只是bw和rtt!

4.结果输出——pacingrate和cwnd

首先必须要说的是,bbr的输出不仅仅是一个cwnd,更重要的是pacingrate。传统意义上的cwnd是TCP拥塞控制算法的唯一输出,但它只规定了当前TCP最多可以发送多少数据,并没有规定如何发送这么多数据。在Linux的实现中,如果发送这么多数据呢?简单粗暴,炸裂!在忽略接收端通知窗口的前提下,Linux会爆出cwnd窗口中的所有数据,而这往往会造成路由器的排队。在队列较深的情况下,rtt会被测得剧烈波动。

bbr在计算cwnd的同时,也计算出一个与其适配的pacing rates。调步速率指定cwnd指示的数据窗口的数据包之间发送出去的时间间隔多长时间。

5.使用其他外部机制——fq、rack等。

bbr之所以能够高效运行并且如此简单,是因为很多机制不是自己实现的,而是利用了外部现有的机制,比如为什么在计算带宽bw时可以这么放心,这将在下一节中解释。重传的数据也被计算在内。

带宽计算细节和状态机

1. 即时带宽计算

bbr作为一种纯粹的拥塞控制算法,完全忽略了系统层面的TCP状态。计算带宽时,只需要两个值:

1)。回答了多少数据,并记录为交付的数据;

2)。答1)发送这么多数据所花费的时间记录为interval_us。

将以上两者相除即可得到带宽:

bw=已交付/interval_us

很简单的!上述计算完全是标量计算,并且只关注数据的大小,而不关注数据的含义。比如在delivered的集合中,bbr并不关心某个响应是否是重传后的ACK确认,正常的ACK确认

以上知识分享希望能够帮助到大家!

声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们

Top