浏览器如何知道网站是否支持HTTP/3?

8

我有一个类似于 如何判断网站是否支持HTTP/2的问题。我想知道浏览器如何知道网站是否支持http3。

我正在使用 Safari 浏览器并启用了 http3 支持。然后我访问 https://cloudflare-quic.com,协议是 h3-29。我认为我的 Safari 使用 h3 协议探测此网站。它是如何知道的呢?

3个回答

7

规范定义了“发现HTTP/3端点”

一个HTTP源可以通过Alt-Svc HTTP响应头字段或HTTP/2 ALTSVC帧(ALTSVC)使用“h3” ALPN令牌,来宣传等效的HTTP/3端点的可用性。

在这种情况下,Alt-svc 存在:

$ curl -i https://cloudflare-quic.com
HTTP/2 200 
...
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400

因此,接收到此响应的浏览器可以在使用UDP 443端口连接同一服务器时尝试使用这三个草案版本中的下一个。


2

2023年的答案:

现在大多数浏览器都支持使用新的DNS记录类型HTTPS,直接与HTTP/3连接,而无需在旧协议上进行初始连接。这比Alt-Svc头部方法更好,因为它(根据规范):

在不等待完整的HTTP连接初始化(多次往返)之前,就能够享受到Alt-Svc的许多好处,并且不一定向网络路径上的所有实体透露用户的目标地址。

一个网站可以通过以下方式在DNS区域文件中宣传它支持HTTP/3:

example.com. 3600 IN HTTPS 1 . alpn="h3"

更多信息:

请注意,尽管主流浏览器支持,但HTTPS记录仍处于草案阶段,许多主机不允许在区域文件中放置HTTPS记录类型。您可能需要使用较大的DNS提供商,如Google Cloud DNS、AWS、Cloudflare等,或者使用自己的DNS服务器。


如果你想验证你的HTTPS记录,用dig是不行的(至少在我使用的版本中是这样)。相反,你可以使用附带ldns的drill工具。
例如,google.com有这个HTTPS记录:
(0) > drill google.com HTTPS       
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 25201
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; google.com.  IN      HTTPS

;; ANSWER SECTION:
google.com.     544     IN      HTTPS   1 . alpn=h2,h3

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 18 msec
;; SERVER: 8.8.8.8
;; WHEN: Thu Nov  2 11:33:02 2023
;; MSG SIZE  rcvd: 53

0

它可以通过DNS中的HTTPS记录了解网站的功能,或者通过http/1.1或http/2连接(在TCP上)了解它。

我想它也可以尝试连接并查看是否连接成功。

浏览器似乎还会记忆先前访问过的一些站点。

从长远来看,我希望http/3成为默认选项,并且浏览器必须将旧版本视为要检测的异常情况,但那种情况可能是遥远的未来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接