引导 HTTP/1.1、HTTP/2 和 HTTP/3

2025 年 5 月 28 日:

  • HTTP 发展历程:从蒂姆·伯纳斯 - 李在 CERN 的 NeXT 立方体上的起源开始,经历了多次迭代,被以各种方式滥用,与代理、隧道和缓存相连,被中间盒拦截,是互联网的通用管道和主要内容传递机制。RFC1945 描述的 HTTP/1.0 易读,截至 2025 年 5 月,与 HTTP 相关的 RFC 数量从约十几个到几百个不等。HTTP/1.1 及之后版本是客户端和服务器需支持的最低共同标准,现代堆栈会使用 HTTP/2 和 HTTP/3。
  • 从 HTTP 到 HTTPS

    • 3xx 重定向:服务器返回 300 级别的 HTTP 状态码,如 301 永久移动,客户端会自动跟随重定向,建立 TLS 连接并重复请求。通过 curl --http1.1 -L -I 可指定使用 HTTP/1.1 并观察重定向过程,在 Wireshark 中可看到重定向的数据包及成本,包括初始 DNS 查找、TCP 连接、请求和重定向后的新 TCP 连接及 TLS 握手等。
    • 使用SSLKEYLOGFILE调试 TLS 连接:一些应用程序会尊重 SSLKEYLOGFILE环境变量,可用于记录 TLS 会话密钥,Wireshark 可读取该密钥以解密 TLS 数据包。通过设置 export SSLKEYLOGFILE=/tmp/tlskeys 并在 Wireshark 中设置相应路径,可查看加密的 TLS 扩展和证书以及应用层协议。
    • 记住使用 HTTPS:服务器返回 HTTP Strict Transport Security(HSTS)头,客户端会记住后续使用 HTTPS。但初始请求使用明文 HTTP 时,中间人攻击者可移除该头或更改重定向。流行浏览器可将域名硬编码为只使用 HTTPS,通过 HSTS preload 列表实现,可在浏览器中通过 chrome://net-internals/#hsts 查看 HSTS 列表。
  • 升级到 HTTP/2

    • Upgrade: h2:服务器可通过 Upgrade: h2头要求客户端使用 HTTP/2,但 HTTP/2 规范规定协商必须通过 TLS Application-Layer Protocol Negotiation Extension(ALPN),一些服务器可能出于兼容性等原因设置该头。
    • Alt-Svc:设置 Alt-Svc头告诉客户端服务器支持 HTTP/2 和 HTTP/3,客户端可缓存该信息用于后续连接。通过 Wireshark 可观察到 HTTP/1.1 重定向后通过 ALPN 协商使用 HTTP/2 的过程。
  • 升级到 HTTP/3

    • 从 HTTP/2 到 HTTP/3:客户端要使用 HTTP/3 需构建在支持 QUIC 的 TLS 库上,curl(1)的 HTTP/3 支持为实验性的,可使用浏览器观察。通过设置 SSLKEYLOGFILE 并在浏览器中加载站点后重新加载页面,可观察到 TCP 握手、TLS ClientHello、服务器选择 HTTP/2 以及切换到 QUIC 和使用 HTTP/3 的过程。
    • 直接到 HTTP/3:添加 HTTPS DNS 记录,包含 alpn "SvcParamKey",可使客户端立即尝试 HTTP/3,如 Chrome 会并行尝试 HTTP/2 和 HTTP/3,HTTP/3 通常比 HTTP/2 快。Firefox 只有在使用 DNS-over-HTTPS 且 HTTPS 查找结果有 alpn SvcParamKey 时才直接尝试 HTTP/3,否则 fallback 到 HTTP/2。Safari 会直接使用 HTTP/3 或 fallback 到 HTTP/2。使用代理时可能无法使用 HTTP/3,除非代理处理 UDP。
  • 总结:从 HTTP/1.1 到 HTTP/2 到 HTTP/3 的升级方式包括通过 ALPN 影响当前连接、Alt-Svc影响未来请求以及使用 HTTPS DNS 记录减少猜测并允许客户端立即切换到 HTTP/3。如今的 HTTP 协议比过去更复杂,需要考虑多种因素来实现协议升级。
  • 脚注及链接

    • 脚注包括关于 TLS 密钥日志文件格式标准化的讨论、不同系统中 curl 对密钥日志的支持、Chromium 中的 HSTS 硬编码等。
    • 链接包括关于使用 HTTPS 资源记录的博客、CS615 系统管理中的 HTTP 和 HTTPS 相关文档等。
阅读 10
0 条评论