BBR(Bottleneck Bandwidth and Round-trip propagation time)是一种由 Google 开发的较新型的 TCP 拥塞控制算法。它旨在解决传统拥塞控制算法(如 Reno 或 CUBIC)在某些网络条件下(尤其是有一定丢包率和延迟的网络中)带宽利用率不高和延迟较大的问题。
BBR 的核心思想是不再依赖丢包作为判断网络拥塞的主要信号。传统的拥塞控制算法通常在检测到丢包时才降低发送速率,但这在缓冲区较大或存在轻微随机丢包的网络中,可能导致无法充分利用可用带宽,或者引入不必要的延迟(缓冲区膨胀)。
BBR 转而主动测量网络的两个关键参数:
BBR 通过周期性地探测这两个参数来动态调整其发送行为:
通过这种方式,BBR 试图将正在传输的数据量(inflight data)维持在略高于带宽时延积(BDP = BtlBw * RTprop)的水平。这样既能充分利用瓶颈链路的带宽,又能避免在网络中造成过长的排队和高延迟。
操作系统支持才行。版本要求可能是 Windows 11 version 22H2 及以上。
以管理员身份运行 Powershell,发送以下命令了解系统支持的算法:
[Enum]::GetNames([Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetTCPSetting.CongestionProvider])
它可能会输出类似:
Default
NewReno
CTCP
DCTCP
LEDBAT
CUBIC
BBR2
这个列表代表了系统在 TCP 设置中所能识别和配置的拥塞控制算法名称。Default
通常意味着由系统根据特定模板或全局设置来决定使用 CUBIC 或其他算法。
查看当前配置的拥塞控制算法:
Get-NetTCPSetting | Select SettingName, CongestionProvider
输出可能如下所示:
SettingName CongestionProvider
----------- ------------------
Automatic
InternetCustom CUBIC
DatacenterCustom CUBIC
Compat NewReno
Datacenter CUBIC
Internet CUBIC
尝试开启:
Set-NetTCPSetting -SettingName InternetCustom -CongestionProvider BBR2
报错:
Set-NetTCPSetting : Property CongestionProvider is read-only
At line:1 char:1
+ Set-NetTCPSetting -SettingName InternetCustom -CongestionProvider BBR ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (MSFT_NetTCPSett...ystemName = ""):ROOT/StandardCimv2/MSFT_NetTCPSetti
ng) [Set-NetTCPSetting], CimException
+ FullyQualifiedErrorId : Windows System Error 87,Set-NetTCPSetting
此时,查询得知, Windows 的 BBR 支持尚不完善,有很多 bugs (前两个资料提到,开启 BBR 会破坏“localhost”(环回接口)TCP 流量,导致同一台机器内的连接变得缓慢或无响应),如:
NS_BINDING_ABORT
错误。我的 Visual Studio Code Remote 开发插件连接时卡住了,并出现以下错误: failed to set up socket for dynamic port forward to remote port =: proxy connection timed out.
。我的 Messenger (UWP) 应用几乎崩溃(新消息无法显示)。—— Windows 11 24H2 and BBR2 : r/Windows11Connecting to '[VM]'
几分钟,然后失败并显示 Video remoting was disconnected
,并弹出 Could not connect to the virtual machine.
的提示。—— 如何在 Windows 上启用 TCP BBR - Stack Overflow因此决定暂时不开启 BBR。如果您想尝试开启,可以试一下命令:
netsh int tcp set supplemental template=Internet congestionprovider=BBR2
netsh int tcp set supplemental template=InternetCustom congestionprovider=BBR2
netsh int tcp set supplemental template=Datacenter congestionprovider=BBR2
netsh int tcp set supplemental template=DatacenterCustom congestionprovider=BBR2
netsh int tcp set supplemental template=Compat congestionprovider=BBR2
这里也可以将 BBR2
替换成 BBR
(BBR v1),可以测试一下,对比一下效果。
然后查看当前配置的拥塞控制算法,是否已经配置为 BBR2
:
Get-NetTCPSetting | Select SettingName, CongestionProvider
在 Windows 11 23H2 / 24H2 上,启用 BBR v2 可能会导致本地 TCP 连接不可用(例如,导致 adb 无法使用、Steam 失败等) ,这时请将拥塞控制算法恢复为之前的配置。恢复后无需重启,问题应该会立即解决。
本文尚不完善,欢迎留言或者评论,告知我最新信息。
Set-NetTCPSetting (NetTCPIP) | Microsoft Learn
Enable TCP BBR v2 on Linux & Windows 11 - Coxxs
本文章有多种语言的版本。
如果您想发表评论,请访问以下网页:
这些网页仅支持浏览,无法发表评论或留言,但提供了更多语言选项,并且加载时间更短:
ZH EN ZH-TW JA RU KO CS ES AR FR PT DE TR IT NL SV DA FI PL UK HE RO HU EL HR TH HI BN ID SW VI NO