最近在使用某个工具的时候发现基于 UDP 的协议延迟很低,而且感觉速度很快,所以去了解了一下 HTTP/3 这个协议,对自己的网站全部做了兼容,顺便做了一个特性对比以及客户端以及服务端的支持情况说明以及配置的示例
特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
---|---|---|---|
多路复用 | 否 | 是(头部多路复用) | 是(多路复用) |
头部压缩 | 否 | 是(HPACK) | 是(QPACK) |
优先级 | 否 | 是 | 是 |
服务器推送 | 否 | 是 | 是 |
管线化 | 是(有限制) | 否 | 否 |
0-RTT | 否 | 否 | 是 |
连接复用 | 是(有限制) | 是 | 是 |
错误恢复 | 否 | 否 | 是 |
安全性 | 否(明文传输) | 是(TLS) | 是(QUIC 中的 TLS) |
传输协议 | TCP | TCP | QUIC(基于 UDP) |
HTTP 协议版本的性能特性的详细解释:
多路复用(Multiplexing):允许在单个连接上同时发送多个请求和响应。这意味着不再需要等待之前的请求完成,可以并行发送和接收多个请求和响应,提高了网络利用率和性能。
头部压缩(Header Compression):减少 HTTP 请求和响应中头部信息的大小,从而减少了传输的数据量。这可以节省带宽并减少加载时间。
优先级(Prioritization):允许客户端指定发送的请求的优先级,以便服务器知道哪些请求应该优先处理。这有助于优化资源分配,提高用户体验。
服务器推送(Server Push):服务器可以在客户端请求之前主动将相关资源推送给客户端。这可以减少客户端发起的请求次数,加快页面加载速度。
管线化(Pipelining):允许客户端在一个连接上发送多个请求而无需等待响应。然而,在 HTTP/1.1 中,管线化的使用受到了一些限制,并不是所有的浏览器和服务器都支持。
0-RTT:零往返时间握手,允许客户端在建立新连接时通过发送加密的数据来减少握手延迟。这可以加快连接建立过程,提高性能。
连接复用(Connection Reuse):允许多个 HTTP 请求和响应在同一个 TCP 连接上进行传输,减少了建立和关闭连接的开销,提高了性能。
错误恢复(Error Recovery):提供了在传输过程中出现错误时进行恢复的机制,以确保数据的可靠传输。
安全性(Security):保护数据的传输安全,HTTP/2 和 HTTP/3 通过使用 TLS 协议加密数据传输,防止了数据被窃取或篡改的风险。
传输协议(Transport Protocol):HTTP/1.1 使用 TCP 作为传输层协议,而 HTTP/2 和 HTTP/3 分别使用了 SPDY 和 QUIC 作为传输层协议,这些协议的设计旨在提高性能和安全性。QUIC 基于 UDP,相比 TCP 具有更好的拥塞控制和连接建立等特性。
浏览器 | 实现但默认禁用的起始版本 | 支持的时间 | 默认开启的起始版本 | 默认开启版本的时间 | 备注 |
---|---|---|---|---|---|
Chrome | 稳定版 (79) | 2019 年 12 月 | 87 | 早期版本实现了 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 的支持 |
如果不知道自己的浏览器是否支持可以直接访问 https://quic.nginx.org, 假如上面的 QUIC 图标变为彩色(文章封面的示例), 则说明浏览器支持 HTTP3
服务器 | 实现但默认禁用的起始版本 | 支持的时间 | 默认开启的起始版本 | 默认开启版本的时间 | 备注 |
---|---|---|---|---|---|
LiteSpeed Web Server | 6.0.2 | 2021 年 6 月 7 日 | 6.0.2 | 2021 年 6 月 7 日 | LiteSpeed Web Server 6.0.2 版本成为首个默认启用 HTTP/3 的版本。 |
Caddy 网页服务器 | v2.6.0 | 2022 年 9 月 20 日 | v2.6.0 | 2022 年 9 月 20 日 | Caddy v2.6.0 默认启用了 HTTP/3。 |
Nginx | 1.25.0 | 2023 年 5 月 23 日 | 1.25.0 | 2023 年 5 月 23 日 | Nginx 从 1.25.0 版本开始支持 HTTP/3。2020 年发布了支持 HTTP/3 的技术预览版。2023 年发布了支持 HTTP/3 的二进制包。 |
Cloudflare | - | - | - | - | Cloudflare 发布了一个补丁,将 quiche HTTP/3 库集成到 Nginx 中。 |
Microsoft IIS | - | - | - | - | Microsoft IIS 在 Windows Server 2022/Windows 11 上原生支持 HTTP/3。 |
HAProxy | 2.6 | 2022 年 5 月 31 日 | 2.6 | 2022 年 5 月 31 日 | HAProxy 从 2.6 版本起支持 HTTP/3 over QUIC。 |
nginxserver { listen 443 ssl; listen [::]:443 ssl; # 监听 HTTP3 listen 443 quic reuseport; listen [::]:443 quic reuseport; location / { add_header alt-svc 'h3=":443"; ma=2592000'; #添加 HTTP3 响应头 ... } ... }
然后重新加载 Nginx 配置即可开启 HTTP/3 的支持,在不兼容的情况下会自动降级到 HTTP/2 或 HTTP/1.1
bash# 测试配置
nginx -t
# 重载配置
nginx -s reload
到这里服务端就已经开启完成
如果使用 Caddy 的话,默认就会为你开启支持
接下来可以使用以下工具进行测试, 以本站为例
注: 使用了代理工具会导致无法使用 HTTP3, 即使是 Direct 模式也无法使用
想要启用 HTTP3 必须使用 TUN 模式
参考文章