HTTP3目前还在不断更新中。一般每个新版本的优化,都会主要针对上一个版本的缺点。
对HTTP2,有二进制编码、头部压缩、多路复用、服务器推送等新特性去弥补了HTTP1.1中的不足。不过HTTP2基于TCP实现的,带3个缺陷:① TCP层面的队头阻塞;② TCP、TLS握手的延迟;③ 网络迁移需重新连接。
HTTP2多个请求是跑在同一个TCP连接中,而当TCP丢包时,TCP要保证完整有序,整个TCP都要等待重传,就会阻塞TCP连接中所有请求。所以说是TCP层面的队头阻塞。即使序列化较高的TCP段已被接收,但应用层也无法从内核中读取了,只有缺失补充重传后才能读取到。
另外,一个TCP连接是由四元组(源IP、源端口、目标IP、目标端口)确定,当IP或端口变动,就会导致TCP、TLS重新握手,这显然对网络迁移不利,比如WIFI切成5G。
综上会发现, 其实这些都是TCP层面带的问题,应用层的HTTP2协议已较难去弥补。
而HTTP3把传输层协议替换为了UDP!不过并不是简单地替换,而是基于UDP协议在应用层实现QUIC协议。
QUIC协议有:无队头阻塞,建立速度快、连接迁移。
① QUIC会保证可靠性,且给数据包序号做唯一标识,某个流的丢包后,HTTP3也无法读取数据,需等待丢失包重传,但不同与HTTP2的是不会阻塞其他流的传输。QUIC各stream间独立无依赖。
② QUIC协议也需握手,但耗时1RTT而已,目的是确认双方连接ID,另外QUIC与TLS不分层,而是包含TLS,内部帧会携带TLS记录去完成密钥协商。甚至在第二次连接发送时,数据包和QUIC握手信息(连接信息和TLS信息)一起发送。
③ 因为UDP不依赖四元组,可以通过连接ID去无感知完成网络迁移。
另外,HTTP3使用QPACK优化了HTTP2的HPACK,以两个特殊单向流同步双方动态表来避免动态表首次丢包无法解码出HPACK头而阻塞后续请求。