跨境长肥管道传输,海外服务器的BBR与CUBIC该如何对比验证?
在同一条跨境路径、同一台服务器、同一种 TCP 业务和相近的可用带宽条件下,BBR更适合被优先验证于高 RTT、长时间持续传输场景;CUBIC则更适合作为兼容性和共享链路行为较稳定的基线。不能仅凭“跨境、高延迟、带宽大”就断定 BBR 一定更快,因为收发窗口、丢包、队列延迟、服务器限速和业务连接时长都可能改变结果。
对比验证时,应先确认服务器确实是大流量发送端,并把 CUBIC 与 BBR 放在同一组测试条件中比较:同一客户端、同一 IP 协议、同一方向、同一并发数、同一测试时长或同一文件大小,同时记录持续吞吐、完成时间、重传、尾延迟和共存流量表现。只看带宽峰值,容易把“传得更快但排队更严重”的结果误判为优化成功。
共同前提:先把比较条件固定
只比较同一层 TCP 传输
BBR 和 CUBIC 都是 TCP 拥塞控制算法,比较对象应限定为 TCP 连接。常见的 HTTPS、文件传输、数据库复制和部分 API 调用可以纳入范围,但需要先确认业务实际使用的是 TCP。
如果业务使用的是 HTTP/3 或其他基于 UDP 的传输方式,修改 Linux 的 TCP 拥塞控制参数不会直接改变这类连接的拥塞控制行为。此时应检查业务协议自身的实现,而不是把 TCP 的 BBR/CUBIC 测试结果套用到所有流量上。
还要区分流量方向:

- 海外服务器向客户端发送大文件、网页响应或备份数据时,服务器侧的拥塞控制直接影响主要发送路径。
- 客户端向海外服务器上传数据时,主要发送端是客户端,服务器修改 TCP 拥塞控制通常不能直接改变上传端的发送算法。
- 双向同步需要分别测试两个方向,不能用下载结果代表上传结果。
- 如果客户端先访问 CDN,再由 CDN 回源到海外服务器,服务器侧算法只影响 CDN 到源站这一段,不代表终端用户到 CDN 的链路表现。
因此,标题中的“海外服务器端 BBR”最适合用于讨论服务器主动发送数据的场景,例如源站响应、大文件下载、跨区域备份读取和服务端推送。
长肥管道首先受带宽时延积约束
长肥管道可以简单理解为:链路带宽较高,但往返时延也较大,网络中同时在途的数据量需要达到较高水平,才能把链路填满。
估算在途数据量时,可以使用:
带宽时延积 = 带宽(bit/s)× RTT(秒)÷ 8
下面的数值采用十进制单位,MB 为 1,000,000 字节,Mbps 为 1,000,000 bit/s。
| 链路带宽 | RTT | 估算带宽时延积 | 直接含义 |
|---|---|---|---|
| 500 Mbps | 180 ms | 11.25 MB | 单个长连接需要维持约 11 MB 在途数据,才有机会接近链路上限 |
| 2 Gbps | 180 ms | 45 MB | 发送端和接收端的窗口、缓存及链路调度都不能过小 |
| 10 Gbps | 180 ms | 225 MB | 单连接填满链路的难度明显上升,实例、网卡和内核缓存都可能成为瓶颈 |
例如,180 ms RTT 下,如果有效 TCP 窗口只有 16 MB,那么仅从窗口上限估算:
16,000,000 字节 × 8 ÷ 0.18 秒 ≈ 711 Mbps
这意味着即使物理链路有 2 Gbps,单连接也可能无法接近该速率。此时把 CUBIC 换成 BBR,未必能解决窗口、接收端缓存或实例限速问题。

Linux 通常会通过 TCP 缓冲区自动调节来适应不同网络,但自动调节是否有效,还取决于内核版本、系统上限、应用套接字设置、接收端能力和中间设备。不要在没有确认 BDP 和业务负载的情况下直接把发送、接收缓存设置成很大的固定值。
先确认内核实际提供了什么
BBR 并不是所有旧内核、定制内核或云厂商内核都默认启用。首先应确认当前内核、可用算法和默认算法:
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
可能看到类似结果:
net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.ipv4.tcp_congestion_control = cubic
net.core.default_qdisc = fq
这里的 bbr 只说明系统提供了名为 BBR 的实现,不足以证明它是某个特定版本。部分发行版或厂商内核还可能提供不同名称的 BBR 变体。如果系统同时列出多个相关算法,应把它们当成不同候选分别验证,而不是笼统地写成“已经启用 BBR”。
BBR 的发送节奏依赖内核的 pacing 能力,fq 等队列调度方式通常更容易配合 pacing 工作,但实际效果仍与发行版、内核版本和网卡队列有关。验证阶段先查看当前队列,不要为了追求某个配置名而直接改动生产网卡的队列规则:
ip route get <客户端IP>
tc qdisc show dev <网卡名称>
如果当前系统没有 bbr,正确做法是确认内核和发行版支持情况,而不是在生产环境中盲目加载模块或复制其他版本的 sysctl 配置。
让两组测试真正可比
至少需要固定以下条件:
- 同一台海外服务器和同一台测试客户端;
- 同一公网 IP 族,IPv4 和 IPv6 不要混用;
- 同一目的端口和同一业务协议;
- 同一测试方向;
- 同一单连接或多连接数量;
- 同一测试时长,或同一固定大小的测试文件;
- 尽量选择相近的测试时段;
- 避免一组运行在业务高峰、另一组运行在空闲时段;
- 切换算法后建立全新的 TCP 连接,不能复用已经建立的连接。
net.ipv4.tcp_congestion_control 通常影响新建 TCP 连接,已有连接不会因为修改默认值而自动切换算法。因此,切换后应关闭旧连接,再开始下一组测试,并用活动连接信息确认实际使用的算法。
核心差异:BBR和CUBIC究竟在比较什么
控制信号不同
CUBIC主要以拥塞窗口增长和丢包反馈为依据。连接建立后,它会逐步增加发送窗口;当检测到丢包等拥塞信号时,再降低窗口并重新探测可用容量。
BBR则尝试估算两个关键量:
- 链路可交付带宽;
- 路径的最小 RTT。
它会根据估算结果控制发送节奏,而不是单纯等到丢包后再减速。对高延迟、带宽较大的长连接来说,BBR的价值在于更主动地使用 pacing 和带宽估计,减少“必须先积累到一次丢包才能知道是否过量”的依赖。
这并不代表 BBR 不会丢包,也不代表 CUBIC 无法跑满高带宽。两者的差异更准确地说是:
| 比较维度 | CUBIC | BBR | 对业务的意义 |
|---|---|---|---|
| 主要反馈 | 拥塞窗口、丢包等信号 | 带宽、RTT和交付速率估计 | BBR可能更早主动调整,CUBIC的行为更接近传统 TCP 预期 |
| 填充长肥管道 | 需要经过窗口增长过程 | 通过估计和 pacing 探测容量 | 长连接可能更容易获得较高持续速率,但必须确认窗口和接收端没有限制 |
| 遇到随机丢包 | 往往把丢包视为拥塞信号并降低发送 | 不一定把单次丢包直接等同于链路容量下降 | BBR可能维持较高吞吐,也可能带来更多重传或排队,需要看实际路径 |
| 共享瓶颈 | 行为相对传统、容易预期 | 不同 BBR 版本与 CUBIC 共存表现可能不同 | 不能只测空载单连接,还要测与其他流量共存 |
| 短连接 | 算法差异可能尚未充分体现 | 带宽估计和状态建立的收益可能来不及体现 | API 小请求和网页首包不一定因切换 BBR 获得明显收益 |
高 RTT 下,BBR的优势不是“无条件提速”
当 RTT 较高时,一次拥塞反馈需要更长时间才能返回发送端。对长连接而言,这会放大窗口增长和丢包恢复的时间成本。BBR通过带宽估计和 pacing,有机会在不频繁制造队列的情况下更快找到可用速率。
但这种优势有成立条件:
- 链路存在相对稳定的可用带宽;
- 发送端和接收端有足够的 TCP 窗口;
- 业务单个连接持续时间足够长;
- 中间设备没有严重的速率整形或突发流量限制;
- ACK 反馈没有严重压缩、延迟或异常丢失;
- 服务器实例本身不是 CPU、网卡或云平台出口上限的瓶颈。
如果业务每次只传几 KB 或几十 KB,连接主要时间耗费在 DNS、TCP 建连、TLS 协商和应用处理上,拥塞控制的持续探测阶段还没有展开,BBR和CUBIC的差距可能很小。
丢包率和排队延迟要同时看
跨境链路上的丢包并不总是由单一原因造成,可能来自拥塞、无线接入、运营商整形、中间设备队列或路径临时变化。CUBIC通常会把丢包视作重要的拥塞反馈,因此速率下降可能更明显,但队列压力也可能更快得到缓解。
BBR对丢包的处理取决于具体实现和版本。某些路径上,它能在存在少量随机丢包时维持较高吞吐;另一些路径上,它可能在高负载时保持较积极的发送节奏,导致:
- 重传率上升;
- 队列延迟变大;
- 与同链路的交互式业务互相影响;
- 多连接之间的带宽分配发生变化。
所以,“BBR吞吐更高”必须与“RTT尾部、重传和共存流量没有明显恶化”一起判断。只看 delivery_rate 或 iperf3 的平均带宽,会遗漏用户真正感知到的延迟抖动。
BBR版本和内核实现不能忽略
不同内核中的 BBR 实现并不完全等价。尤其是在以下方面,版本差异可能影响结论:
- 带宽估计窗口;
- 丢包后的发送行为;
- 与 CUBIC 的公平性;
- pacing 和队列配合方式;
- 对 ACK 压缩、带宽变化和共享瓶颈的处理。
因此,报告中不要只写“切换到 BBR 后提升了多少”,还应记录:
内核版本:
BBR/CUBIC 实际名称:
默认拥塞控制:
测试方向:
单连接或并发连接数:
客户端和服务器所在区域:
测试时段:
如果测试环境的 bbr 来自一个内核版本,而生产环境是另一个厂商内核,测试结果不能直接当作生产承诺。
业务影响:不同流量不应使用同一个判断标准
大文件、备份和跨区域同步
这类业务通常具有连接时间长、单次传输量大、对平均吞吐敏感的特点,是 BBR 最值得验证的场景。
例如传输一个 100 GB 的十进制文件:
- 100 GB × 8 = 800 Gb;
- 800 Gb = 800,000 Mb;
- 如果持续速率为 200 Mbps,时间约为 800,000 ÷ 200 = 4,000 秒,即约 66.7 分钟;
- 如果持续速率为 260 Mbps,时间约为 800,000 ÷ 260 = 3,077 秒,即约 51.3 分钟。
理论上,速率提高 30% 可以明显缩短传输时间。但真实业务还要扣除重传、磁盘读取、压缩、加密、应用确认和限速的影响。因此应记录完整文件的实际完成时间,而不是只记录测速工具在某一分钟内的峰值。
对这类业务,BBR可以作为优先验证对象,但仍要检查:
- 服务器磁盘是否能够持续读出足够数据;
- 客户端写盘是否跟得上;
- 加密或压缩是否占满 CPU;
- 云厂商出方向带宽是否有限制;
- 同一出口是否还有其他租户或业务;
- 传输失败重试是否会放大链路压力。
API、网页和小文件请求
API 请求通常是短连接或短数据流,即便采用连接复用,单个请求传输量也可能不大。此时端到端延迟更多由连接复用、应用处理、数据库、TLS 和 RTT 决定,而不是由拥塞窗口增长决定。
如果业务是:
- 小 JSON 响应;
- 短时网页请求;
- 少量配置分发;
- 低并发的管理接口;
- 大量短连接而不是少量长连接;
那么切换 BBR 后吞吐可能变化不明显。更应该观察:
- 首字节时间;
- p95/p99 响应时间;
- 连接建立失败率;
- 重试率;
- 高峰期队列延迟;
- 共享出口上的其他请求是否受影响。
如果 CUBIC 已经满足业务 SLO,而 BBR只带来很小的带宽变化,通常没有必要为了理论上的长肥管道收益改变全局默认算法。
混合业务和共享出口
一台海外服务器可能同时承载文件下载、网页响应、API 和监控上报。单独测试大流量连接时表现良好,不代表混合负载下仍然合适。
建议把测试分为两类:
- 空载测试:只运行目标 TCP 流,观察算法能够达到的吞吐和基础延迟。
- 共存测试:保留一定比例的 API、小请求或其他业务流,再观察大流量连接是否造成尾延迟和重传恶化。
共存测试中,需要看大流量连接以外的业务。例如,BBR让文件下载从 400 Mbps 提高到 500 Mbps,但 API 的 p99 延迟从 180 ms 上升到 600 ms,那么对于混合型业务,这次优化未必值得采用。
一个用于读懂结果的示例
下面是一组示例数据,用于说明如何权衡,不代表所有跨境线路都会出现相同结果。测试条件为:同一 TCP 连接、固定传输 10 GB 十进制文件、RTT 约 180 ms。
| 算法 | 持续速率 | RTT p95 | TCP 重传比例 | 估算完成时间 |
|---|---|---|---|---|
| CUBIC | 420 Mbps | 240 ms | 0.8% | 约 3 分 10 秒 |
| BBR | 515 Mbps | 280 ms | 2.1% | 约 2 分 35 秒 |
完成时间按 10 GB × 8 = 80,000 Mb 估算:
- CUBIC:80,000 ÷ 420 ≈ 190 秒;
- BBR:80,000 ÷ 515 ≈ 155 秒。
如果业务核心目标是缩短备份窗口,且 40 多毫秒的 RTT 尾部上升不会影响其他业务,BBR可能更合适。如果同一出口承载交互式 API,重传增加和尾延迟上升会导致用户请求超时,那么即使 BBR 的大文件速度更高,也可能应保留 CUBIC,或只在专用传输节点上使用 BBR。

成本与限制:切换算法没有授权费,但并非没有代价
算法切换本身成本低,验证和治理成本不低
BBR和CUBIC通常都是 Linux 内核中的 TCP 拥塞控制选项,不需要为算法本身购买授权。但生产环境切换仍需要承担以下成本:
- 测试流量消耗公网出口配额;
- 可能影响同一实例上的其他连接;
- 需要增加传输、重传和延迟监控;
- 多个发行版和内核版本需要分别验证;
- 出现异常时需要快速恢复原默认值;
- 需要明确哪些节点切换、哪些节点保持基线。
例如,单条 1 Gbps 测试持续 10 分钟,理论传输量为:
1,000,000,000 bit/s × 600 秒 ÷ 8 = 75,000,000,000 字节,即 75 GB
如果连续运行多轮单连接和多连接测试,出口流量会迅速增加。生产环境不宜把 iperf3 大流量测试直接当成普通健康检查,最好使用隔离节点、专用测试窗口或经过限制的测试数据。
全局默认值可能影响不相关业务
使用 sysctl 修改默认拥塞控制时,影响范围通常是该主机后续建立的 TCP 连接,而不是某一个端口或某一个进程。若服务器同时承载多个业务,全局切换可能让原本没有参与测试的服务也使用新的算法。
验证阶段可以先查看当前值:
sysctl -n net.ipv4.tcp_congestion_control
确认 bbr 在可用列表中后,再进行短时切换。以下示例只适合经过授权的测试主机,且只影响后续新建连接:
OLD_CC="$(sysctl -n net.ipv4.tcp_congestion_control)"
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
# 建立新的测试连接并完成测试
sudo sysctl -w net.ipv4.tcp_congestion_control="$OLD_CC"
注意事项如下:
- 切换前保存原值,避免把原来的厂商默认设置覆盖掉;
- 切换后必须关闭旧连接并重新建立测试连接;
- 生产环境不要在没有观察窗口的情况下直接持久化配置;
- 如果测试中出现大量重传、业务超时或出口拥塞,应停止流量并恢复原值;
- 回滚只恢复拥塞控制默认值,不会自动恢复其他已经改动的 sysctl、队列或应用配置。
如果需要针对单个业务测试,应优先使用应用或程序级别的套接字配置,而不是直接修改整台服务器的全局默认值。具体能否按进程或连接设置,取决于应用和运行环境,不能用一个通用 shell 命令代替。
发送端之外的瓶颈会掩盖算法差异
以下限制会让 BBR 与 CUBIC 的测试结果趋同:
- 云服务器实例的出方向带宽上限;
- 虚拟网卡或宿主机共享出口限速;
- 客户端接入带宽不足;
- 接收端 TCP 缓冲区或应用读取速度不足;
- 磁盘、压缩、加密或校验占满 CPU;
- 中间防火墙、负载均衡或网关进行整形;
- 业务使用连接池,实际单连接时间很短;
- CDN 或反向代理终止了客户端连接;
- IPv4 与 IPv6 实际走了不同路由。
因此,如果 CUBIC 和 BBR 都稳定停在某个相同速率,不应立即得出“两者性能相同”的结论。先确认是否被实例、客户端或业务程序的固定上限卡住。
不能只依据一个时间点的跨境测速
跨境路由可能发生变化,拥塞也具有明显的时段性。一次测试只能说明该时间、该客户端、该路径下的表现,不能代表所有用户。
合理的验证周期应包括:
- 至少多个重复样本,而不是单次结果;
- 相近时段和不同负载时段;
- 服务器到客户端、客户端到服务器两个方向;
- 单连接和符合业务实际的多连接;
- 空载和共存流量;
- 算法实际名称、内核版本和队列配置。
不需要为了形式追求极多参数,但必须保证两种算法的测试样本数量和条件一致。
决策规则:用业务指标决定是否切换
第一步:确认测试对象和实际算法
在服务器端记录内核和算法能力:
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
ip route get <客户端IP>
tc qdisc show dev <网卡名称>
测试过程中查看活动连接:
ss -tin
不同版本的 ss 输出略有差异,部分版本会在连接信息中显示 cubic 或 bbr,也可能同时显示 pacing_rate、delivery_rate、拥塞窗口和重传信息。若活动连接仍显示旧算法,说明测试连接没有真正切换。
第二步:先做单连接,再做多连接
单连接测试用于回答:某种算法能否在该 RTT 和带宽条件下有效利用长肥管道。
例如使用 iperf3 时,可以分别测试服务器到客户端的单连接和多连接:
# 服务器到客户端,单 TCP 连接
iperf3 -c <服务器IP> -R -t 60 -P 1
# 服务器到客户端,8 条 TCP 连接
iperf3 -c <服务器IP> -R -t 60 -P 8
这些命令只适合已获授权的测试端点。运行前应确认测试端口已开放且受到访问控制,不要为了测试随意扩大生产防火墙范围。
单连接和多连接需要分开解读:
- 单连接明显受益,说明算法可能改善长连接填充能力;
- 多连接总吞吐上升、但单连接没有变化,可能只是并发连接共同填补了窗口;
- 多连接总吞吐不变而重传上升,说明瓶颈可能在出口或共享队列;
- BBR单连接很快,但其他业务尾延迟明显变差,需要优先考虑共存公平性。
第三步:同时记录速率、重传和延迟
建议每次测试至少记录以下指标:
| 指标 | 观察重点 | 对决策的意义 |
|---|---|---|
| 持续吞吐 | 中位数、低分位和稳定区间 | 判断是否真正缩短传输时间 |
| 完成时间 | 固定大小文件的实际耗时 | 比峰值带宽更接近业务结果 |
| RTT p95/p99 | 尾部是否明显上升 | 判断是否制造了额外排队 |
| TCP 重传 | 比例和绝对数量 | 判断速率提升是否以更多重传为代价 |
| 应用响应时间 | API、网页或同步任务的尾延迟 | 判断对用户业务是否有副作用 |
| CPU和网卡利用率 | 发送端、接收端是否已饱和 | 排除非拥塞控制瓶颈 |
| 共存流量 | 其他业务的吞吐和错误率 | 判断共享出口是否受到影响 |
可以使用系统工具辅助观察:
nstat -az
sar -n DEV 1
ss -tin
不同发行版对统计项名称和工具默认安装情况可能不同。如果某项不可用,应先确认工具版本,不要把缺失字段当作“没有重传”或“没有拥塞”。
第四步:使用固定门槛,而不是凭感觉选择
实际门槛应根据业务 SLO 制定。没有现成标准时,可以先使用一组内部示例规则:
- BBR 的持续吞吐中位数至少比 CUBIC 高 10%;
- 固定大小任务的完成时间有稳定缩短;
- API 或交互业务的 p95/p99 延迟没有超过允许范围;
- 重传率没有成倍增长;
- 共存业务的错误率、超时率和吞吐没有明显恶化;
- 多个时间窗口的结果方向一致,而不是只在单次测试中领先。
如果 BBR只带来 3%~5% 的吞吐改善,却让尾延迟上升 20% 以上,那么对交互式混合业务通常不值得切换。反过来,如果 BBR让跨区域备份窗口明显缩短,而该节点是专用传输节点、没有低延迟业务共用出口,则可以接受一定的重传或排队变化,但仍需设置监控和回滚条件。
不同用户条件下的选择
| 用户条件 | 优先选择 | 判断依据 |
|---|---|---|
| 专用海外传输节点,主要发送大文件或备份,RTT较高 | 优先验证 BBR | 长连接和大数据量更容易体现带宽估计与 pacing 的价值 |
| 服务器同时承载 API、网页和下载 | 先保留 CUBIC 作为基线,再做共存测试 | 不能用下载峰值掩盖 API 尾延迟和共享队列问题 |
| 请求短、文件小、业务主要关心首包和 p99 | 通常无需因长肥管道切换 | 拥塞控制探测收益可能尚未体现,连接和应用开销更主要 |
| 链路丢包明显、队列延迟敏感 | 以实测的重传和尾延迟为准 | BBR与CUBIC在不同实现和路径上的行为可能不同 |
| 服务器只负责接收上传 | 不要只修改服务器端 BBR | 主要发送端是客户端,应测试客户端实际使用的算法 |
| 前面有 CDN 或其他连接终止层 | 分段判断 | 服务器算法只影响源站与上一跳之间的 TCP 连接 |
| 内核只提供 CUBIC,或生产与测试内核不同 | 先解决环境一致性 | 没有可验证的 BBR 实现时,不能用理论收益替代实测 |
| 多租户共享公网出口 | 选择对共存业务影响更小的方案 | 公平性、尾延迟和重传比单连接峰值更重要 |
最终可以把 CUBIC 作为稳定基线,把 BBR作为特定长连接场景的候选,而不是把全站切换当成默认动作。专用备份节点、跨区域对象传输节点和持续大响应源站,适合优先验证 BBR;以短请求、低延迟和多业务共享为主的海外服务器,则应先确认 CUBIC是否已经满足目标,再用同口径测试证明 BBR确实带来足够收益。


