就现阶段而言,大部分浏览器的默认行为应该是这样的:
默认是以HTTP2优先于HTTP1.1建立TCP连接,当发现网站支持HTTP3时,转而建立QUIC连接。
那么,具体又是如何的呢?
前言
对于支持HTTPS的网站来说(不支持的不做讨论),具体要使用什么协议,在建立TCP连接后,通过Client Hello
和Server Hello
消息,这些是可以协商好的,基本上不需要啥额外的步骤。
但是HTTP3是基于UDP的啊,难道我每次盲猜网站支持HTTP3,然后不支持就回落吗?就现状而言,这不太现实。
相较来说,先尝试以TCP建立HTTP2/HTTP1.1的连接,获知对HTTP3的支持性后再升级,这是比较稳妥的。
一个简单的header
在RFC7838, 我们可以得知这么一个header,它叫Alt-Svc
,
它可以告诉浏览器:”瞧,我在xx host的 xx端口用 xx协议运行了同样的服务。(所以你下次请求就用它吧。)”
简单点,可以查看MDN文档。
举例来说,Alt-Svc
回复可以长成这样:
Alt-Svc: h2="alt.example.com:443"
Alt-svc: h3=":443"; ma=86400
详情
当浏览器通过HTTP/2
甚至HTTP/1
访问了某个网站,而它又支持HTTP/3
的话,它会返回一个Alt-Svc
的header。
在下一次访问时,浏览器会按照指示使用HTTP3协议访问内容。
你可以在下面网址进行测试:
https://cloudflare-quic.com/