HTTP/2 协议相比于 HTTP/1 协议来说有很多优点,但是 HTTP/2 也有很多问题,谷歌基于 HTTP/2 协议的问题制定了一种基于 UDP 的低时延的互联网传输层协议 QUIC 协议,这篇文章就来讨论一下 HTTP/2 有哪些问题,以及 HTTP/3 诞生的意义。
1.HTTP/2 的问题简单描述
基于 TLS 协议握手的 HTTP/2 被称为 h2,直接在 TCP 协议之上运行的 HTTP/2 被称为 h2c,下面讨论一下 TCP 以及 TCP+TLS 建立握手过多的问题,另外还有多路复用与 TCP 队头阻塞问题:
1.1 h2c(基于 TCP 建立的 HTTP/2)示意图
Tips:基于 TCP 建立的h2c 连接需要三次握手。
1.2 h2(基于 TLS 建立的 HTTP/2)示意图
基于 TLS 建立的 h2 连接,因为 TLS 是运行在 TCP 连接之上的,除了需要建立 TCP 握手之外,还要需要建立多次 TLS 握手:
Tips:基于 TLS 建立的h2 连接需要 TLS+TLS 多次握手。
1.3 多路复用与 TCP 队头阻塞示意图
如下图 红色、蓝色、绿色分别对应三个不同的 Stream,它们之间是在同一个 TCP 连接之上,就会存在队头阻塞的问题:
Tips:另外还会存在操作系统内核版本更新缓慢的问题。
2.QUIC 协议示意图
为了解决上述问题,谷歌制定了一种基于 UDP 协议的低时延的互联网传输层协议 QUIC 协议,示意图如下图:
3.Chrome 浏览器如何支持 QUIC
在 Chrome 浏览器输入 chrome://flags/#enable-quic,将 Experimental QUIC protocol 这一栏设置改为 Enabled 可以开启 QUIC(HTTP3) 协议的支持:
打开有支持 QUIC 的站点开始抓包(之前 bilibili 支持能抓到包,现在好像抓不到了):
Wireshark 抓取到未解密的报文:
Wireshark 抓取基于 GQUIC 解密报文:
Tips:IETF QUIC 协议草案地址 https://tools.ietf.org/html/draft-ietf-quic-http-20。
4.HTTP3 新特性-连接迁移
在客户端 ip 地址和端口号变了(如手机流量切换到 wifi),不需要断开连接,可以复用之前的连接,QUIC 相关的格式如下:
5.HTTP3 解决 TCP 队头阻塞问题示意图
Tips:QUIC 基于 UDP 实现这正意义的多路复用,并且 QUIC 大大优化了握手流程。