← 回總覽

Cloudflare 如何解决了 quiche 中的一个拥塞漏洞

📅 2026-07-07 16:25 InfoQ 中文 软件编程 2 分鐘 1390 字 評分: 81
QUIC 拥塞控制 Cloudflare Rust CUBIC
📌 一句话摘要 本文详细介绍了 Cloudflare 团队如何发现并修复 quiche 库中 CUBIC 拥塞控制算法在连接初段严重丢包时无法恢复的 Bug,定位到空闲时间计算错误导致陷入无休止恢复循环,并仅用一行代码完成修复。 📝 详细摘要 文章由 InfoQ 编译自 Cloudflare 官方博客,记录了团队排查 quiche 库中 CUBIC 拥塞控制算法 Bug 的全过程。问题源于集成测试中连接初始阶段高丢包率下的异常失败。团队通过构建本地模拟环境复现问题:配置 10ms RTT 和 30%随机丢包,约 60%测试无法在 10 秒超时内完成。监控发现,出现故障时拥塞窗口无法扩大,状

📌 一句话摘要

本文详细介绍了 Cloudflare 团队如何发现并修复 quiche 库中 CUBIC 拥塞控制算法在连接初段严重丢包时无法恢复的 Bug,定位到空闲时间计算错误导致陷入无休止恢复循环,并仅用一行代码完成修复。

📝 详细摘要

文章由 InfoQ 编译自 Cloudflare 官方博客,记录了团队排查 quiche 库中 CUBIC 拥塞控制算法 Bug 的全过程。问题源于集成测试中连接初始阶段高丢包率下的异常失败。团队通过构建本地模拟环境复现问题:配置 10ms RTT 和 30%随机丢包,约 60%测试无法在 10 秒超时内完成。监控发现,出现故障时拥塞窗口无法扩大,状态在“拥塞避免”和“恢复”之间快速转换(6.7 秒内 999 次)。与 Reno 算法对比后,问题锁定在 CUBIC。根因是空闲时间计算方式:从上次发送数据时开始计时,导致在高丢包慢启动阶段传输入字节归零后触发空闲期优化,进而形成自我实现的循环,使应用程序始终处于恢复状态并设定遥远的恢复时间。修复方案是将空闲时间计算起点改为上次收到 ACK 时——仅一行代码改动,即打破循环,使测试通过率恢复 100%。文章体现了从现象到根因的严谨调试流程,对网络协议开发者有重要参考价值。

💡 主要观点

- 连接初始阶段严重丢包导致 CUBIC 算法无法恢复拥塞窗口。 约 60%的测试在 10 秒超时内未完成,且拥塞窗口毫无增长迹象,表明算法陷入死锁。

根因是空闲时间计算方式触发无休止恢复循环。 从上次发送数据时计算空闲时间,在高丢包慢启动阶段传输入字节归零后触发空闲期优化,使状态始终停留在恢复状态。
通过对比 Reno 算法缩小问题范围。 Reno 算法测试 100%通过,排除通用拥塞控制问题,将定位锁定在 CUBIC 的特定实现上。
一行代码修复:将空闲时间计算起点改为收到最后一个 ACK。 这一改动打破了恢复循环,使拥塞窗口正常扩大,测试通过率恢复 100%。

💬 文章金句

- 这是一个圆满的结局:一个(几乎)仅需一行代码的优雅的修复方案,成功打破了这一循环。

  • (1)如果没有数据包丢失,则提高发送速率(即提高带宽利用率);
(2)如果发生数据包丢失,那么基于丢包率的算法就会认为已经超过网络容量,发送方必须进行退避(即降低带宽利用率)。

📊 文章信息

AI 初评:81

来源:InfoQ 中文

作者:InfoQ 中文

分类:软件编程

语言:中文

阅读时间:7 分钟

字数:1735

标签: QUIC, 拥塞控制, Cloudflare, Rust, CUBIC

阅读完整文章

查看原文 → 發佈: 2026-07-07 16:25:00 收錄: 2026-07-07 20:00:40

🤖 問 AI

針對這篇文章提問,AI 會根據文章內容回答。按 Ctrl+Enter 送出。