HTTP/3 凭借在 TCP 之上采用 QUIC 协议,打破了 HTTP/2 的格局。现在,让我们初次深入了解这个新标准以及它对网络开发人员的意义。
毫不意外,推动互联网基础庞大协议基础设施的发展堪称一项史诗级任务。HTTP 的下一个主要版本建立在 QUIC 协议之上,承诺带来更出色的性能与更高的安全性。以下是 Web 应用程序开发人员需要知晓的内容。
HTTP/3 的承诺与风险
HTTP/3 渴望让互联网对每个人而言都更安全、更快速、更简便。倘若这些目标听起来颇为熟悉,那是因为它们与 HTTP/2 启动之时的目标如出一辙。这是个饶有趣味的故事,但关键在于,HTTP/3 在解决 TCP 和 HTTP 的长期缺陷方面又迈出了新的一步。令人惊讶的是,这个新协议完全绕过了 HTTP/2,而是将 QUIC 协议作为其基础。
HTTP/3 的快速解读是:在 UDP 之上构建 TCP 2.0,并称之为 QUIC。接着,在 QUIC 之上重建 HTTP/2,将其命名为 HTTP/3。如果这听起来有些怪异,那确实如此。毕竟,大多数已部署的硬件和软件都是为了与现有协议进行通信而设计的。大规模重新配置网络设备以采用新版本的 TCP 并不可行,从理论上讲,这虽然是个正确的开端,但这种方法会解决 HTTP/2 的许多问题,同时也会留下大量故障设备。于是,我们迎来了 HTTP/3。
HTTP/3 的高层次视角
HTTP/3 中有两个规范:规范本身以及 QUIC 协议。它们共同构成了技术与实际复杂性的丛林。从高层次的视角出发,将有助于我们理解这项技术及其期望实现的目标。
首先,我们可以将 HTTP/3 的功能划分为三大类:
内置加密
虽然内置加密是一种安全功能,但它同时也是一种性能提升手段。这是因为 HTTP/3 中的加密协商方式减少了所需的往返次数。
网络上的加密有着漫长的历史,其中包括将 SSL 弃用,转而采用 TLS。总体而言,此举是为了实现更好的效果以及更多的默认加密。如今,HTTPS 已成为大多数网络流量的默认设置,而在 HTTP/3 中,明文(“http://...”)选项将被完全剔除。
HTTPS 仍将作为建立安全连接的机制,但流量将在 HTTP/3 级别进行加密。换句话说,TLS 将被集成到网络协议中,而非与之并行工作。
因此,加密将移入传输层并移出应用程序层。这意味着默认情况下安全性更高 —— 甚至 HTTP/3 中的标头也是加密的 —— 但同时也会带来相应的 CPU 负载成本。总体而言,这个想法是,由于加密协商方式的改进,通信将更加快速,而且由于它内置在较低级别,避免了由各种实现方式引起的问题,通信也将更加简便。
除了加密之外,QUIC 还旨在提供集成的 DDoS 保护以及 “前向安全”,即使参与者后来泄露了机密,攻击者也更难破坏过去的通信。
多字节流,即精细粒度的多路复用
如果你熟悉 HTTP/2 的工作原理,就会知道它已经实现了多路复用。实际上,多路复用是 HTTP/2 的主要特征之一。而 HTTP/3 只是以一种全新的、更好的方式做到了这一点。特别是,HTTP/3 希望解决行头阻塞问题(HOL)。
理想情况下,我们本应直接在 TCP 中修复这个阻塞问题。当我们通过 TCP 运行 HTTP 时,我们可以(并且确实)同时发送多个不同的文件。这是我们目前多路复用的体现。当你打开一个网站时,服务器希望一次发送尽可能多的文件。这对速度和效率都有好处。HTTP/2 允许这样做,但 TCP 并不理解多路复用的文件。对 TCP 而言,它们都是一大块数据。更糟糕的是,如果其中任何一个文件传输失败,它必须重新启动该流中的所有文件。
HTTP/3 的新协议是 QUIC,它有点像 TCP 2.0。它将颗粒文件的概念构建到流中,以便它们可以以更精细的方式重新启动。更妙的是,它在实现这一目标的同时,并没有破坏所有现有的 TCP 基础设施。
连接弹性
我们所说的连接弹性是指,当设备在网络中移动时,存在一种机制能够保持客户端与服务器之间的相同连接。
在 TCP 中,这种连续性是不可能实现的,因为该协议只了解 IP 地址和端口号。如果这些参数中的任何一个发生变化 —— 就像你拿着移动设备从一个网络走到另一个网络时一样 —— 就必须建立一个全新的连接。这种重新连接会导致可预测的性能下降。
QUIC 协议引入了连接 ID(CID)。为了确保安全,这些实际上是服务器与客户端协商的 CID 集合。因此,HTTP/3 连接使用 IP 地址、端口和 CID,即使网络发生变化并建立了新的 IP 或端口,它们也能持续连接。这赋予了协议一种对话的持久性。
HTTP/3 的实现
我曾提到,HTTP/3 建立在 QUIC 协议之上,而 QUIC 协议本质上是 TCP 的新版本。QUIC 是一个有着历史并持续演进的协议,但就 HTTP/3 的目的而言,你需要知道的是,它在古老的用户数据报协议(UDP)上构建了几个功能。
结合 UDP
UDP 是一个基本协议,几乎所有的网络设备和软件都实现了它。它被用于 DNS 查询。它的无处不在和简单性使其成为最新版本 HTTP 的坚实基础。
与 TCP 不同,UDP 是无连接的,也没有网络优化逻辑。QUIC 协议建立在 UDP 之上,并添加了这些必要的元素。从本质上讲,我们正在实施一个更好的网络层,这个网络层从实际互联网使用方面数十年的经验中汲取了教训。
QUIC
虽然 UDP 是无连接的,但 QUIC 不是。QUIC 使用确认(ACK)来建立和维护连接。QUIC 还支持数据包重新传输。这些功能与 TCP 类似,只是改进旨在实现我们已经讨论过的三个目标:内置加密、减少网络往返次数以及持久连接。
QUIC 是 HTTP/3 的核心,它基于现实世界的经验,以更高性能和更安全的方式重新实现了 TCP 的基本元素(如确认和重新传输)。UDP 被用作 QUIC 的基础,因为它是一个成熟的协议,为实现提供了最小的基线。
QUIC 也被设计为可扩展的,这使我们能够避免目前使用 TCP 时的情况。QUIC 协议使用帧,这些帧封装了特定的数据报用途,并且可以在将来添加,而不会破坏现有用例。
HTTP/3 的当前与未来状态
尽管 QUIC 已经在浏览器和其他项目中得到应用,但所有功能、协议以及 HTTP/3 规范本身都在持续开发中。
在可预见的未来,HTTP/1、HTTP/2 和 HTTP/3 将继续共存。有消息表明,HTTP/1 仍然占据网络流量的近 30%。HTTP/3 将根据请求模型进行类似的采用。目前,HTTP/3 作为一个更先进的网络层存在,随着越来越多的参与者支持它,它将扩展到广泛使用。大规模部署时,HTTP/3 将如何兑现其承诺还有待观察。
对于大多数工作中的程序员来说,这种变化只是我们生活和工作的世界中的一个有趣事实,但它不会直接影响我们编写的代码。例如,我们不会直接构建 QUIC 客户端。当然,对于网络管理员和系统操作员以及其他需要分析和了解网络流量的人来说,这一变化更加重要。(事实上,QUIC 的加密性质一直是一些网络运营商的棘手问题,因为它使识别模式和确定用户何时滥用网络变得更加困难。)
结论
HTTP/3 是未来网络景观的一个重要特征。每个从事 Web 开发的程序员都希望至少在高层次上了解它是如何工作的。请参考以下资源,以了解有关 HTTP/3 及其组件的更多信息:
RFC 9114:HTTP/3 提案的细节和历史。RFC 9000:QUIC 提案的细节和历史。另请参阅此处的 QUIC RFC 摘要。《Smashing Magazine》有一个关于 HTTP/3 的良好、深入的系列,包括性能改进。