可能的 HTTP 版本

  1. HTTP/1.0:目前已几乎绝迹,仅有极个别网站在使用。但本质上与 HTTP/1.1 区别不大。
  2. HTTP/1.1:使用最为广泛的 HTTP 协议版本。当访问非 https:// 网站时,一定使用的是 HTTP/1.x 协议。
  3. HTTP/2:已逐渐成为主流的 HTTP 协议版本。必须配合 https 即 TLS 使用。相对于 HTTP/1.x 最大的改进为支持请求的 Multiplexing。
  4. HTTP/3:最新的 HTTP 规范,于 2022 年 6 月 9 日正式定稿,但互联网上已存在很多基于先前草稿版本规范实现的网站。与先前版本最大的不同是,HTTP/3 基于 UDP 而非 TCP 实现。

一般情况下浏览器与服务端协商 HTTP 版本的方法

  1. 当访问非 https:// 网站时,一定使用 HTTP/1.1。
  2. 当访问 https:// 网站时,在 TLS 握手阶段,浏览器会通过 TLS 的 ALPN(Application-Layer Protocol Negotiation) 扩展,向服务端告知希望使用 h2 协议。若服务端支持 HTTP/2,则在 TLS 的握手回应中会告知客户端。此后浏览器与服务端间在 TLS 层上开始使用 HTTP/2。若服务端未表明支持 h2,则回退至 HTTP/1.1。
  3. 服务端返回的 HTTP Response Header 中,可能带上 Alt-Svc 字段,表明该网站支持其他的协议,如 Alt-Svc: h3=":443",表示该服务在端口号 443 上还支持使用 HTTP/3 协议,浏览器在下次请求时将使用 HTTP/3 协议访问。(具体策略由浏览器逻辑自行决定,不同的浏览器策略可能不同)
  4. 因此,即使网站支持 HTTP/3,在首次访问时也必须先使用 HTTP/2 连接,当读取到 Alt-Svc 字段后再升级为 HTTP/3。
  5. 为了解决这个问题,又新加入了 SVCB/HTTPS RRs DNS 记录,浏览器在访问时优先查询该记录而非 A/AAAA 记录,该记录中会标明服务端具体支持的协议版本和各版本对应的接入点。所以可直接使用 HTTP/3 进行连接。

不同浏览器的策略区别

不同的浏览器实现在 HTTP 版本协商上有不一致的地方: