2022 年 1 月 13 日,来自世界各地的 Firefox 用户开始报告连接问题。浏览器无法连接到任何站点,用户报告挂起和崩溃。
![mozilla-firefox-stuck-diagram mozilla-firefox-stuck-diagram](https://www.yundongfang.com/wp-content/uploads/2022/02/mozilla-firefox-stuck-diagram.png)
Mozilla于 2022 年 2 月 2 日在该公司的Mozilla Hacks网站上发布了该事件的详细技术说明。
该组织在 2022 年 1 月 13 日收到有关 Firefox 在连接尝试期间挂起的报告。当时,它看到崩溃报告激增,但没有太多关于导致问题的信息。
Mozilla 工程师发现网络请求导致 Firefox 用户挂起。工程师查看了最近的更改或更新,但没有发现任何可能导致用户遇到问题的内容。
Mozilla 怀疑该问题可能是由其用于负载平衡的云提供商之一最近“不可见”的配置更改引起的。该组织使用多个提供商的基础设施来提供崩溃报告、遥测、更新或证书管理等服务。
检查时设置没有更改,但工程师注意到 Telemetry 服务正在服务 HTTP/3 连接,这是它以前没有做过的。HTTP/3 被 Mozilla 禁用,用户终于可以再次使用 Firefox 连接服务。云提供商的 HTTP/3 设置配置为自动值。
在解决了最紧迫的问题后,Mozilla 对该问题进行了更详细的调查。所有 HTTP/3 连接都通过网络堆栈 Necko,但 Rust 组件使用一个名为 viaduct 的库来调用 Necko。
Necko 检查是否存在标头,如果不存在,将添加它。HTTP/3 依赖标头来确定请求大小。Necko 检查区分大小写。现在碰巧通过高架桥的请求被图书馆自动输入小写;这意味着任何通过高架桥添加内容长度标头的请求都通过了 Necko,但遇到了 HTTP/3 代码问题。
唯一使用网络堆栈并添加内容长度标头的 Rust 组件是 Firefox Web 浏览器的 Telemetry 组件。Mozilla 指出,这就是为什么在 Firefox 中禁用遥测解决了用户端问题的原因。禁用 HTTP/3 也确实解决了它。
根据 Mozilla 的说法,这个问题将导致无限循环,因为“所有网络请求都通过一个套接字线程”,因此阻止了所有进一步的网络通信。
Mozilla 表示,它已经从这个问题中吸取了一些教训。它正在调查所有负载均衡器并审查它们的配置,以便避免未来出现类似的问题。未宣布在有问题的云提供商 Google 部署 HTTP/3。最后,Mozilla 计划在未来使用“不同的 HTTP 版本”运行更多的系统测试。