版本协商来源
HTTP版本不断迭代,为了可以无缝切换到新的协议,因此HTTP推出了一些协议来支持版本协商,帮助用户进行版本升级,得到更好的网络体验。 主要的HTTP版本有三个,分别是HTTP1.1,HTTP2,HTTP3,而协议的升级是逐步的,不能跨大级别,如HTTP1.1直接升级到HTTP3。
升级路径
HTTP1.1-HTTP2
HTTP1.1 的Upgrade机制
Upgrade机制是在HTTP1.1引入的,主要是基于HTTP的协议基础上,可以升级到其他的应用层协议。最常见的是webSocket协议的升级,以字节的飞书网页版为例

其中请求中的Connection为upgrade,表示此请求用于升级协议。 Upgrade的值则为要升级的协议名称,Sec-**则是连接ws的版本和认证信息。而如果服务器接受升级,则会返回101状态码,表示协议切换成功。同时Connection也是为upgrade,Upgrade为选择升级的协议,Sec-*表示接受ws的认证信息。
如果服务器不接受协议升级,则会忽略该请求,返回状态200/OK。这时候客户端需要做回退操作,使用服务器端接受的协议进行数据传输。如果客户端还是执意使用ws进行数据传输,服务器端会返回426状态码,表示服务器拒绝处理客户端使用当前协议发送的请求,但是可以接受其使用升级后的协议发送的请求。
而HTTP1.1升级到HTTP2的过程也跟上面的过程类似,通过Upgrade字段来标志要升级的协议,服务器端使用101状态码来切换协议。
但HTTP2分为加密h2和非加密h2c(HTTP/2 over cleartext)两种版本,因此upgrade升级在浏览器中是不支持的,主要是为了安全考虑。那如果要升级到基于TLS加密的HTTP2协议,则需要使用ALPN(Application Layer Protocol Negotiation)来进行协商。
ALPN 应用层协议协商
ALPN是TLS协议的一个插件,用于在进行TLS握手时进行应用层协议的协商。主要目的是为了解决Upgrade机制需要依赖HTTP服务,并且有多余的RTT,影响了服务响应速度。因此在TLS的连接建立的基础上,提前进行应用层的协议协商,用户可以无缝切换到HTTP2等应用协议上。
主要的流程如下:

国内的淘宝手机网页版是使用了HTTP2版本,下面是对其抓包的截图


HTTP2-HTTP3
由于前面的ALPN是基于TCP的,而HTTP3是基于UDP传输的,因此需要新的协商协议来进行版本升级。HTTP Alternative Services 是作为 HTTP/2 的一个特性于 2016 年引入的(RFC 7838),主要作用是进行流量分发。通过在服务器响应中,增加Alt-Svc Header 或 ALT_SVC 控制帧两种形式。提供一组替身服务,客户端可以从替身来获取需要的资源。
使用此服务,可以通过给HTTP1或者HTTP2指定HTTP3的替身服务,来达到协议升级的目的。以下为例:
