可能的 HTTP 版本
- HTTP/1.0:目前已几乎绝迹,仅有极个别网站在使用。但本质上与 HTTP/1.1 区别不大。
- HTTP/1.1:使用最为广泛的 HTTP 协议版本。当访问非
https:// 网站时,一定使用的是 HTTP/1.x 协议。
- HTTP/2:已逐渐成为主流的 HTTP 协议版本。必须配合
https 即 TLS 使用。相对于 HTTP/1.x 最大的改进为支持请求的 Multiplexing。
- HTTP/3:最新的 HTTP 规范,于 2022 年 6 月 9 日正式定稿,但互联网上已存在很多基于先前草稿版本规范实现的网站。与先前版本最大的不同是,HTTP/3 基于 UDP 而非 TCP 实现。
一般情况下浏览器与服务端协商 HTTP 版本的方法
- 当访问非
https:// 网站时,一定使用 HTTP/1.1。
- 当访问
https:// 网站时,在 TLS 握手阶段,浏览器会通过 TLS 的 ALPN(Application-Layer Protocol Negotiation) 扩展,向服务端告知希望使用 h2 协议。若服务端支持 HTTP/2,则在 TLS 的握手回应中会告知客户端。此后浏览器与服务端间在 TLS 层上开始使用 HTTP/2。若服务端未表明支持 h2,则回退至 HTTP/1.1。
- 服务端返回的 HTTP Response Header 中,可能带上
Alt-Svc 字段,表明该网站支持其他的协议,如 Alt-Svc: h3=":443",表示该服务在端口号 443 上还支持使用 HTTP/3 协议,浏览器在下次请求时将使用 HTTP/3 协议访问。(具体策略由浏览器逻辑自行决定,不同的浏览器策略可能不同)
- 因此,即使网站支持 HTTP/3,在首次访问时也必须先使用 HTTP/2 连接,当读取到
Alt-Svc 字段后再升级为 HTTP/3。
- 为了解决这个问题,又新加入了 SVCB/HTTPS RRs DNS 记录,浏览器在访问时优先查询该记录而非 A/AAAA 记录,该记录中会标明服务端具体支持的协议版本和各版本对应的接入点。所以可直接使用 HTTP/3 进行连接。
不同浏览器的策略区别
不同的浏览器实现在 HTTP 版本协商上有不一致的地方:
- Chrome 在 HTTP/3 可用时,总是优先使用 HTTP/3 协议,当失败后再回退至 HTTP/2。
- 而 Safari 则是并发尝试使用 HTTP/2 和 HTTP/3,并优先选择最先完成连接建立过程的连接。这可能使得在测试时发现 Safari 经常甚至永不使用 HTTP/3。