HTTP/3 is everywhere but nowhere

2025年3月 作者:Tim Perry

Introduction

HTTP/3 自 2016 年以来一直在开发中,而 QUIC(其底层协议)最早由 Google 于 2013 年推出。两者现在都已标准化,在 95% 的用户浏览器中得到支持,已经被 Cloudflare 的 32% 的 HTTP 请求使用,并且 35% 的网站声明支持(通过 alt-svc 或 DNS)在 HTTP Archive 数据集中。

我们开发了一个全新的 HTTP 版本,并且已经成功地将超过 1/3 的网络流量迁移到它!这是一个惊人的进步。

与此同时,QUIC 和 HTTP/3 都没有包含在任何主要语言的标准库中,包括 Node.js、Go、Rust、Python 或 Ruby。 Curl 最近 获得了支持,但它仍然是实验性的,并且在大多数发行版中被禁用。 某些语言有一些罕见的外部库,但它们都是实验性的和/或独立于其他核心网络 API。 尽管移动网络是 HTTP/3 的关键用例,但 Android 最流行的 HTTP 库 不支持。 像 Nginx 这样的流行服务器只有 实验性支持,默认情况下禁用,Apache 没有支持或发布支持计划,并且 Ingress-Nginx(可以说是最流行的 Kubernetes 反向代理)已经 放弃了所有 HTTP/3 支持计划,而是将一切都转移到一个全新的(尚未发布的)后续项目中。

实际上,很难指出任何完全支持 HTTP/3 的流行的开源工具:推广几乎还没有开始。

这似乎是矛盾的。 发生了什么?

我假设你对 HTTP/1.1 等、HTTP/2 和 HTTP/3 之间的差异有基本的了解。 如果您正在寻找更多背景信息,Daniel Stenberg(curl 的创始人兼首席开发人员)的 http2-explainedhttp3-explained 是一份优秀的指南。

Why do we need more than HTTP/1.1?

让我们简单回顾一下。 为什么这很重要? 谁在乎 HTTP/3 是否成功推广? 如果浏览器流量和大型 CDN 支持 HTTP/3,我们是否仍然需要在其他客户端或服务器实现中使用它?

例如,最近的一篇文章认为 HTTP/2 在负载均衡器之后没有太大意义。 简单来说,他们的观点是,HTTP/2 的主要优势在于多路复用,以避免延迟问题和 队头阻塞,而这些在局域网或数据中心内并不重要,因为往返时间 (RTT) 很低,并且可以无限期地保持长期的 TCP 连接打开。

你可以对 HTTP/3 提出同样的论点:这对网络浏览器和 CDN 的高延迟、多请求流量很有用,但在其他地方则无关紧要。

即使仅考虑 HTTP/1.1 与 HTTP/2,多路复用优势的现实也更加复杂:

除了多路复用之外,还有许多其他 HTTP/2 优势适用于负载均衡器和浏览器之外:

以上只是针对 HTTP/2。 HTTP/3 在此基础上进一步改进,包括:

除了理论之外,已经报告了一些具体的可衡量的好处。 例如,RequestMetric 运行了一些 详细的基准测试,显示了一些惊人的性能改进:

A comparison of small site, content site & SPA loading time with HTTP/1.1, 2, and 3 showing major speedups

Fastly 分享了他们在现实世界中看到的 time-to-first-byte 的重大改进:

A tweet showing Fastly getting 18% time-to-first-byte improvements with HTTP/3

所有这些都非常棒。

现在该技术已标准化,在浏览器和 CDN 中得到广泛支持并经过彻底的实战测试,我认为所有开发人员都应该能够在他们的语言、服务器和框架中内置这些优势。

The two-tier web

然而,事实并非如此:尽管 HTTP/3 具有优势并且经常用于网络流量,但大多数开发人员今天无法轻松地开始端到端地使用 HTTP/3。 在这方面,HTTP/3 将互联网上长期存在的鸿沟鲜明地展现了出来。 如今,有两种非常不同的网络流量:

让我们稍微简化一下,并将这两种情况描述为“超大规模 Web”和“长尾 Web”。 两者都建立在相同的基本标准之上,但它们具有非常不同的重点和需求,并且工具和平台也越来越不同。 这种情况已经存在很长时间了,但 HTTP/3 的现实使其痛苦地显现出来。

这些群体之间存在一些显着差异:

您可以看到我正在描绘的图景。 这两个群体存在于同一个网络上,但方式截然不同。

其中一些听起来可能像是超大规模团伙是不义之徒。 我不是那个意思(好吧,是的,有一个更广泛的有趣的对话,但在这里严格讨论网络协议)。 具体来说,关于 HTTP/3,这是一项 极好的 工程工作,它通过不同大型组织之间令人惊讶的整洁的开源标准合作解决了网络上的实际问题。 这太棒了!

很多 人在使用这些公司构建的服务,他们对网络性能的痴迷每天都在提高大量实际人员的这些服务的质量。 这非常酷。

但是,如果每个其他服务器、客户端和开发人员也可以访问它,那将会更酷。 最值得注意的是,这意味着下一代 Web 技术正在由一个少数群体定义和构建,而更大的多数群体实际上现在无法访问该技术(尽管经过多年的标准化和开发),除非向该第一个少数群体的 CDN 付款以提供帮助。 不酷。

OpenSSL + QUIC

我认为超大规模/长尾的划分是根本原因,但这在下游造成了更多具体的难题,其中最值得注意的是 OpenSSL 对 QUIC 的处理方式。

OpenSSL 是最常用的 TLS 库,并且它是上述大量开源工具的基础库,因此它们对此的支持对于将 QUIC 和 HTTP/3 带到更广泛的生态系统至关重要。 已经有很多 关于 广泛的 公开的 讨论 关于 OpenSSL 对 QUIC 的处理方式,但作为一个快速总结:

有些人会认为这是 OpenSSL 的一个重大错误,而我认为 OpenSSL 会认为 BoringSSL 的设计有缺陷和/或不适合 OpenSSL,并且值得花时间做好。

无论谁真正“正确”,这都在整个生态系统中造成了巨大的分裂。 Curl 对 不包括 OpenSSL 的现状有一个很好的概述:

HTTP/3 components supported by curl: the columns for quiche vs msh3 vs nghttp3, all working on top of Quictls, BoringSSL and others

OpenSSL 的方法在任何现有 QUIC 和 HTTP/3 实现的 TLS 部分中都无法轻松工作。 实际上,他们已经启动了另一列,但目前在 HTTP/3 和 QUIC 位置中没有兼容的实现。

这是一个值得注意的问题,因为对于大多数主要项目来说,放弃对 OpenSSL 的支持将是一项巨大且有问题的事情,这实际上意味着他们今天仍然无法发布内置的 QUIC 支持。 Node.js 最近 简要地讨论了 甚至完全删除 OpenSSL,转而使用 BoringSSL 或类似产品,但很明显这不切实际:这将是一项巨大的重大更改,没有其他替代方案提供相同级别的长期支持保证,并且 Node 和其他语言通常在 Linux 发行版等环境中发布,在这些环境中,它使用系统的共享 OpenSSL 实现,因此这也将在下游造成很大的麻烦。

这是网络上这两层组织的基本压力差异的一个例子:开源工具无法破坏这样的东西,并且长尾可用的库是分散且不协调的。 同时,超大规模可以快速且几乎单方面地做出决策,以设置今天适合其环境的实现,从而使他们能够获得新技术的好处,而不必过于担心每个人都使用的开源通用生态系统的状态。

What happens next?

我希望这能清楚地表明这里存在一个大问题:潜在的组织差异正在演变成互联网上技术的根本分裂。 有一种论点认为,尽管有好处,但长尾 Web 不需要 HTTP/3,因此他们可以忽略它,或者如果他们真的关心,可以使用具有内置支持的 CDN,并且超大规模实际上没有义务仅仅因为他们想在自己之间使用一些简洁的新技术而为我们其余的人提供方便的实现。

但这里的问题是,这些技术确实有真正具体的好处。 QUIC 是对替代方案的重大改进,尤其是在缓慢或不可靠的移动互联网上(例如,在发达国家/地区连接良好的办公室之外的任何地方)以及在连接之间漫游时。 有一些构建在其之上的技术,例如 WebTransport,它提供了额外的重要新功能和性能来取代 WebSocket。 将来会有更多依赖于 HTTP/3 的功能(请参阅 gRPC 如何构建在 HTTP/2 之上)。 再次:这里的技术很棒! 但是,如果这些好处没有均匀分布,并且只有一小部分组织及其客户可以访问,那将是一个挑战。

继续沿着这条路走下去可能会产生一些合理的严重后果:

所有这些都还很遥远,而且完全是假设! 我怀疑 其中一些 会在某种程度上发生,但存在广泛的可能性。 值得注意的是,这不仅仅适用于 HTTP/3:像这样的少数 CDN 和 Web 客户端的集中化和协调很容易在许多其他类型的技术改进中以类似的方式发挥作用。

至少对于 HTTP/3,我希望最终能有一个令人满意的解决方案来改善这种分裂,尽管我不知道它是否会及时到来以避免显着的后果。 许多 QUIC 和 HTTP/3 的外部库和实验性实现会随着时间的推移而成熟,并且我认为最终(我真的非常希望)OpenSSL QUIC API 分裂将会得到解决,以打开基于 许多 OpenSSL 的环境中的 QUIC 支持的大门,无论是通过适配器来支持这两种方法,还是通过直接支持 OpenSSL 模型的新 HTTP/3 和 QUIC 堆栈。 如果您有兴趣从事其中任何一项工作,并且我可以做任何事情来直接提供帮助或帮助资助这项工作,请 与我联系

但是,这些都不会在今天发生,所以不幸的是,如果您想在您的应用程序中端到端地使用 HTTP/3,您可能在一段时间内会遇到困难。 关注此空间。

想同时调试 HTTP/1 和 HTTP/2 吗? 现在测试 HTTP Toolkit。 Web、Android、终端、Docker 等的开源一键式 HTTP(S) 拦截和调试。

建议更改此页面 在 GitHub 上

分享此帖子: [](https://httptoolkit.com/blog/http3-quic-open-source-support-nowhere/<https:/bsky.app/intent/compose?text=HTTP/3 is everywhere but nowhere%3Cbr%3E%3Cbr%3Ehttps://httptoolkit.com/blog/http3-quic-open-source-support-nowhere/>)

博客时事通讯 通过订阅以接收直接发送到您的收件箱的此类新帖子,成为 HTTP 和调试专家:

注册

Related content

http 2024年12月

ERR_PROXY_CONNECTION_FAILED errors with HTTP proxies

如果您正在使用像 HTTP Toolkit 这样的本地调试代理工具,您可能会在 Chrome 和其他类似应用程序中遇到可怕的“ERRPROXYCONNECTIONFAILED”错误。 这可能是一个非常令人沮丧且无用的错误! 但是只有几个可能的原因,而且通常很容易修复。 阅读更多 apis 2024年9月

Designing API Errors

当 API 的一切顺利时,生活非常简单:您请求资源,然后瞧,您就得到了它。 您触发一个过程,API 礼貌地通知您一切都按计划进行。 但是,如果出现问题怎么办? 好吧,这就是事情变得有点棘手的地方。 HTTP 状态代码就像急救箱:它们很方便,但无法解决所有问题。 它们让您大致了解哪里出了问题,这可以帮助许多工具和开发人员做出合理的假设,例如: 阅读更多 http 2024年2月

22 years later, YAML now has a media type

截至 2024 年 2 月 14 日,RFC 9512 正式注册“application/yaml”作为所有 YAML 内容的媒体类型,并将“+yaml”添加为所有基于 YAML 的更特定媒体类型的标准结构化后缀。 通过此注册,它现在包含在 IANA 维护的官方媒体类型列表中。 这种媒体类型(也称为 MIME 类型,来自它们最初为电子邮件附件元数据发明的)被大量使用,尤其是在 HTTP “Content-Type”标头中用于请求和响应,以及其他地方的各种文件元数据和处理逻辑中。 这些名称为应用程序提供了一个通用的词汇表,以便在传递数据时描述数据。 阅读更多 FOLLOW US opens in a new tabopens in a new tab opens in a new tab Product

Projects

Resources

Resources

Projects

Alternatives

Integrations