HTTP/3

HTTP/3是HTTP协议的第三个主要版本，用于在万维网上交换信息。与之前版本（HTTP/1.1、HTTP/2等）不同，HTTP/3不依赖TCP协议，转为使用基于UDP协议的多路复用传输协议QUIC协议实现。

此变化主要为了解决HTTP/2中存在的队头阻塞问题。由于HTTP/2在单个TCP连接上使用了多路复用，受到TCP拥塞控制的影响，少量的丢包就可能导致整个TCP连接上的所有流被阻塞。

与该协议的早期版本相比，HTTP/3使用相似的语义，包括相同的请求方法、状态代码和消息字段，但编码方式和会话状态的维护方式有所不同。然而，部分由于该协议采用了QUIC，与之前的版本相比，HTTP/3在实际使用中具有更低的延迟和更快的加载速度：在某些情况下，速度是HTTP/1.1（是许多网站唯一部署的HTTP版本）的四倍以上。

截至2024年9月，超过95%的主流网络浏览器支持HTTP/3，并且在排名前1000万的网站中，有34%的网站支持HTTP/3。

## 历史

HTTP/3起源于QUIC工作组采纳的互联网草案。最初的提案名为“HTTP/2 Semantics Using The QUIC Transport Protocol”（使用QUIC传输协议的HTTP/2语义），后来更名为“Hypertext Transfer Protocol (HTTP) over QUIC”。

在2018年10月28日的一次邮件列表讨论中，IETF HTTP和QUIC工作组主席Mark Nottingham提议将HTTP-over-QUIC更名为HTTP/3，以“清晰地表明它是HTTP语义到线路协议的另一种绑定方式……让人们意识到其与QUIC的分离”。Nottingham的提议在几天后被其他IETF成员接受。HTTP工作组受命在HTTP/3的设计期间协助QUIC工作组，然后在发布后承担维护责任。

Chrome（Canary build）在2019年9月添加了对HTTP/3的支持，然后最终在稳定版本中实现，但默认情况下通过功能标志禁用。它在2020年4月默认启用。Firefox在2019年11月通过功能标志添加了对HTTP/3的支持，并于2021年4月在Firefox 88中开始默认启用。2020年4月8日在Safari Technology Preview中添加了对HTTP/3的实验性支持，并包含在随iOS 14和macOS 11一起发布的Safari 14中，但截至macOS和iOS上的Safari 16，它仍然默认禁用。

2022年6月6日，IETF在中将HTTP/3发布为提议标准。

## 相较于HTTP/1.1与HTTP/2

不同HTTP版本之间的语义保持一致，如请求方法、状态代码和消息字段等通常在所有版本中都适用。差异在于这些语义到底层传输的映射。HTTP/1.1和HTTP/2都使用TCP作为其传输协议。HTTP/3采用QUIC，一种传输层网络协议，基于用户数据报协议（UDP）实现了用户空间拥塞控制。QUIC的引入旨在解决HTTP/2中被称为 “队头阻塞” 的主要问题：由于HTTP/2多路复用的并行性对TCP的丢失恢复机制是不可见的，因此一旦发生数据包丢失或重排序，所有活跃的事务都会停滞，无论该事务是否受到丢失数据包的影响。相较之下，QUIC提供了原生多路复用，因此丢包只会影响数据真正丢失的那些流。

提议的DNS资源记录SVCB（由服务绑定）和HTTPS将允许在不首先通过先前的HTTP版本接收Alt-Svc标头的情况下进行连接，从而消除TCP握手的1个RTT。自Firefox 92、iOS 14、报告的Safari 14支持以来，以及Chromium在标志后支持HTTPS资源记录。

## 实现

### 客户端

浏览器｜实现但默认禁用的起始版本｜默认开启的起始版本｜备注

Chrome｜稳定版 (79)｜2019年12月｜87｜2020年4月｜早期版本实现了QUIC的其他草案

Edge｜稳定版 (79)｜2019年12月｜87｜2020年4月｜Edge 79是基于Chromium的首个版本

Firefox｜稳定版 (72.0.1)｜2020年1月｜88｜2021年4月

Safari｜稳定版 (14.0)｜2020年9月｜16.4｜2023年3月｜Apple从Safari 16.4开始，对部分Safari用户测试HTTP/3的支持。

### 库

为 QUIC and HTTP/3 实现了客户端或服务器逻辑的开源库有

名称｜客户端｜服务端｜编程语言｜所属公司｜仓库链接

lsquic｜支持｜支持｜C｜LiteSpeed｜https://github.com/litespeedtech/lsquic

nghttp3｜支持｜支持｜C｜https://github.com/ngtcp2/nghttp3

H2O (网络服务器)｜不支持｜支持｜C｜https://github.com/h2o/h2o

cURL｜支持｜不支持｜C｜https://github.com/curl/curl

MsQuic｜支持｜支持｜C｜Microsoft｜https://github.com/microsoft/msquic

proxygen｜支持｜支持｜C++｜Facebook｜https://github.com/facebook/proxygen#quic-and-http3

Cronet｜支持｜支持｜C++｜Google｜https://github.com/chromium/chromium/tree/main/net/quic

.NET｜支持｜支持｜C# (using MsQuic)｜Microsoft｜https://github.com/dotnet

quic-go｜支持｜支持｜Go｜https://github.com/quic-go/quic-go

http3｜支持｜支持｜Haskell｜https://github.com/kazu-yamamoto/http3

Kwik｜支持｜支持｜Java｜https://github.com/ptrd/kwik

Flupke｜支持｜支持｜Java｜https://bitbucket.org/pjtr/flupke

aioquic｜支持｜支持｜Python｜https://github.com/aiortc/aioquic

quiche｜支持｜支持｜Rust｜Cloudflare｜https://github.com/cloudflare/quiche

neqo｜支持｜支持｜Rust｜Mozilla｜https://github.com/mozilla/neqo

quinn｜支持｜支持｜Rust｜https://github.com/quinn-rs/quinn

s2n-quic｜支持｜支持｜Rust｜Amazon Web Services｜https://github.com/aws/s2n-quic

### 服务器

- 2021年6月7日，LiteSpeed Web Server（及OpenLiteSpeed）6.0.2版本发布，并成为默认启用HTTP/3的首个版本。
- Caddy网页服务器v2.6.0（2022年9月20日发布）默认启用了HTTP/3。
- Nginx自1.25.0版本（2023年5月23日发布）开始支持HTTP/3。2020年6月，发布了支持HTTP/3的nginx技术预览版。2023年2月，发布了支持HTTP/3的nginx二进制包。
- Cloudflare在2019年发布了一个补丁，该补丁将quiche HTTP/3库集成到nginx中。
- Microsoft IIS在Windows Server 2022/Windows 11上原生支持HTTP/3。
- HAProxy自2.6版本（2022年5月31日发布）起支持HTTP/3 over QUIC。
- Nimble Streamer中基于HTTP的协议自4.1.8-1开始支持HTTP/3。