一文读懂Google的BBR算法,提升你的网络速度 – wiki词典


一文读懂Google的BBR算法,提升你的网络速度

在当今这个数据驱动的时代,无论是观看高清视频、进行在线游戏,还是进行大规模数据传输,我们都对网络速度和稳定性有着极高的要求。然而,网络拥堵常常成为体验的瓶颈。为了解决这个问题,Google设计并开源了一款革命性的TCP拥塞控制算法——BBR(Bottleneck Bandwidth and Round-trip propagation time)

本文将带你深入了解BBR是什么,它如何工作,以及你该如何利用它来优化你的网络连接。

传统拥塞控制算法的困境:Bufferbloat

要理解BBR的创新之处,我们首先需要知道传统的拥塞控制算法(如Cubic和Reno)是如何工作的。这些算法大多是基于丢包的。它们的逻辑很简单:不断增加数据发送速率,直到发生数据包丢失,然后就降低速率。它们将“丢包”等同于“网络拥堵”。

这种方式在过去很长一段时间里都行之有效,但随着网络硬件的发展,一个名为“Bufferbloat”(缓冲区膨胀)的问题日益凸显。网络路径上的路由器和交换机为了防止丢包,配备了越来越大的缓冲区(Buffer)。

这导致了以下问题:
1. 高延迟:发送方持续向一个已经拥堵的节点发送数据,这些数据包不会立即被丢弃,而是在缓冲区中排队等待。这导致数据包的往返时间(RTT)急剧增加,造成了极高的延迟。对于视频通话、在线游戏等实时应用来说,这是灾难性的。
2. 网络利用率不充分:当最终发生丢包时,算法会“悬崖式”地降低发送速率,导致网络带宽在一段时间内无法被充分利用。

简单来说,传统算法就像一个司机,只通过撞到前车(丢包)来判断是否跟车太近(拥堵),而不是通过观察与前车的距离和速度来主动调节。

BBR的革命性思想:不依赖丢包,而是建模

Google BBR算法彻底改变了游戏规则。它不再依赖丢包来判断拥堵,而是采用了一种基于模型的方法。BBR的核心思想是:找到网络链路的瓶颈带宽(Bottleneck Bandwidth)和最小往返时间(Round-trip Time),并以此为依据来调节发送速率。

BBR通过持续测量两个关键指标来建立网络模型:

  1. 瓶颈带宽 (BtlBw):网络路径上最窄处的最大数据传输速率。这是你的连接速度的“天花板”。
  2. 最小往返传播时间 (RTprop):在网络没有排队的情况下,一个数据包从发送到确认的最小时间。

BBR的目标是让发送速率刚好等于瓶颈带宽,同时让在途的数据包总量(inflight data)刚好等于 带宽时延积 (BDP = BtlBw * RTprop)。这样一来,数据包可以像流水一样顺畅地通过网络管道,既不会因为发送太慢而浪费带宽,也不会因为发送太快而在缓冲区中排队,从而实现了高吞吐和低延迟的完美平衡。

BBR如何工作?

BBR的工作状态可以分为四个阶段,循环进行:

  1. Startup (启动阶段):启动时,BBR会像传统算法一样快速增加发送速率,以尽快探测到网络的瓶颈带宽。
  2. Drain (排空阶段):当探测到带宽上限后,BBR会主动降低发送速率,以排空在Startup阶段可能在缓冲区中累积的多余数据包,从而降低延迟。
  3. ProbeBW (带宽探测阶段):这是BBR大部分时间所处的状态。它会以一个稳定的速率发送数据(等于已测得的瓶颈带宽)。为了探测是否有更大的可用带宽,BBR会周期性地、短暂地提升发送速率。如果发现网络可以承受更高的速率,它就会更新瓶颈带宽的估计值。
  4. ProbeRTT (延迟探测阶段):BBR会周期性地进入这个状态(例如每10秒),主动将在途数据包数量降至一个极低的值,并持续一小段时间(如200ms)。这使得BBR能够测量到最真实的、没有排队干扰的最小往返时间(RTprop),从而校准其网络模型。

通过这四个阶段的循环,BBR能够动态、精准地适应网络变化,始终在不造成拥堵的前提下,最大化地利用网络带宽。

BBR的优势

  1. 高吞吐量:在有一定丢包率的网络中,BBR的吞吐量远超传统算法。因为它不认为丢包就一定意味着拥堵。
  2. 极低的延迟:BBR主动避免填满网络缓冲区,从而显著降低了网络延迟,改善了网页加载、视频会议和游戏体验。
  3. 快速适应性:BBR能够快速启动并适应网络变化,迅速达到并维持高效率。

BBR v1 vs BBR v2

最初的BBR(v1)在实际部署中表现出色,但也暴露出一些问题,例如在与Cubic等传统算法共存时可能过于“激进”,抢占过多带宽。

为了解决这些问题,Google推出了BBRv2。BBRv2做出了许多改进,使其更加“公平”和智能:
* 更好地与其他拥塞控制算法共存。
* 能更好地利用ECN(显式拥塞通知)信号。
* 在丢包率极高的情况下表现更稳定。

目前,BBRv2被认为是更成熟和推荐的版本。

如何在你的服务器上启用BBR?

BBR主要部署在服务器端。如果你的服务器是Linux系统,开启BBR非常简单。

前提条件:
* 你的Linux内核版本需要足够新。BBRv1需要 4.9+,BBRv2需要 5.18+
* 拥有root权限。

步骤(以Ubuntu/Debian为例):

  1. 检查内核版本
    打开终端,输入:
    bash
    uname -r

    如果版本低于 5.18,你可能需要先升级内核。

  2. 修改系统配置
    使用文本编辑器(如 nanovim)编辑 /etc/sysctl.conf 文件:
    bash
    sudo nano /etc/sysctl.conf

    在文件末尾添加以下两行:
    net.core.default_qdisc=fq
    net.ipv4.tcp_congestion_control=bbr

    • net.core.default_qdisc=fq:设置默认的包调度队列为 fq (Fair Queue),这是BBR推荐的配置。
    • net.ipv4.tcp_congestion_control=bbr:将TCP拥塞控制算法设置为 bbr
  3. 保存并应用配置
    保存文件并退出编辑器。然后,运行以下命令使配置立即生效:
    bash
    sudo sysctl -p

  4. 验证是否成功
    运行以下命令来检查当前的拥塞控制算法:
    bash
    sysctl net.ipv4.tcp_congestion_control

    如果输出为 net.ipv4.tcp_congestion_control = bbr,则说明BBR已成功开启。

    你还可以运行以下命令来查看可用的拥塞控制算法,bbr 应该在列表中:
    bash
    sysctl net.ipv4.tcp_available_congestion_control

总结

Google BBR算法通过其创新的建模方法,成功摆脱了对丢包的依赖,在实现网络高吞吐的同时保持了极低的延迟。它对于提升网站访问速度、优化流媒体传输和改善云服务质量具有里程碑式的意义。如果你的应用场景对网络性能有较高要求,那么在你的服务器上启用BBR无疑是一个简单而高效的优化选择。

滚动至顶部