一、概述
6月6日,IETF QUIC、比利时的HTTP工作组成员Robin Mark在Twitter上宣布: 历时 5 年,HTTP 3终于被标准化为RFC 9114。将与RFC 9204(QPACK header 压缩)和 RFC 9218 (可扩展的优先级)一起开启 Web 的新篇章!
这意味着HTTP 3协议已经进入了稳定的状态,与此同时,HTTP 2也更新为新的RFC 9113标准。
不同于HTTP 1、HTTP 2,HTTP 3 是基于UDP的QUIC协议。
相比HTTP 1.x和HTTP2而言,HTTP3主要是集中在如何提高传输效率。众所周知,HTTP2协议虽然大幅提升了HTTP 1.1的性能,基于TCP实现的HTTP2遗留下3个问题:
- 有序字节流引出的队头阻塞(Head-of-line blocking),使得HTTP2的多路复用能力大打折扣;
- TCP与TLS叠加了握手时延,建链时长还有1倍的下降空间;
- 基于TCP四元组确定一个连接,这种诞生于有线网络的设计,并不适合移动状态下的无线网络,这意味着IP地址的频繁变动会导致TCP连接、TLS会话反复握手,成本高昂。
而HTTP3协议解决了上述的问题:
- HTTP3基于UDP协议重新定义了连接,在QUIC层实现了无序、并发字节流的传输,解决了队头阻塞问题;
- HTTP3重新定义了TLS协议加密QUIC头部的方式,既提高了网络攻击成本,又降低了建立连接的速度;
- HTTP3 将Packet、QUIC Frame、HTTP3 Frame分离,实现了连接迁移功能,降低了5G环境下高速移动设备的连接维护成本。
二、QUIC协议
QUIC 协议层就实现了可靠的数据传输,拥塞控制,加密,多路数据流。至于 QUIC 为什么使用了 UDP 协议,作用是频繁的用户态和核心态切换会效率问题。
理论上说,将应用层的东西迁移到内核从而提升效率是可行的,但是这么做会带来操作系统稳定性的问题。另一方面,我们可以选择将这部分内容迁移到用户空间。比如目前流行的 DPDK,当网卡将数据包传输过来时,它是绕过内核在用户空间进行控制和应用。
那为什么QUIC 使用了 UDP协议呢?
- 避免 ossification(僵化):QUIC 协议加密负载,也是避免协议僵化一种方式,比如当中间层处理 UDP 数据时,只需要按照数据包的方式去处理即可,不需要去关注内部层的具体信息。
- 放弃改进 TCP 本身,效率上得到完全的提升;
- QUIC 是由谷歌提出的,所以 UDP 是以浏览器为出发点,从协议、从浏览器方向来进行创新。
Quic(QuickUDP Internet Connections)是一种新的传输方式,与TCP相比,它减少了延迟。表面上,Quic非常类似于在UDP上实现的TCP TLS HTTP/2。由于TCP是在操作系统内核和中间件固件中实现的,因此对TCP进行重大更改几乎是不可能的。然而,由于Quic是构建在UDP之上的,所以它没有受到这样的限制。
- Quic在现有TCP TLS HTTP 2上的关键特性包括:
- 大大缩短连接建立时间
- 改进的拥塞控制
- 无线头阻塞的多路复用
- 前向纠错
- 连接迁移
下图是使用Quic协议的HTTP3的工作流程图:
三、HTTP3协议
通过前文的介绍,相信大家对HTTP3已经有了一个初步的了解。总的来说,HTTP3协议使用的QUIC提供的多路复用提高了传输效率,而本身并没有更改HTTP的语义。
HTTP 3与HTTP2一样,采用二进制、静态表、动态表与Huffman算法对HTTP Header编码,不只提供了高压缩率,还加快了发送端编码、接收端解码的速度。不过,由于HTTP1协议不支持多路复用,这样高并发只能通过多开一些TCP连接实现。因此,HTTP2与HTTP3都在应用层实现了多路复用功能。
HTTP2协议基于TCP有序字节流实现,因此应用层的多路复用并不能做到无序地并发,在丢包场景下会出现队头阻塞问题,下图演示了HTTP2协议中报文丢失造成的阻塞。
当网络繁忙时,丢包概率会很高,多路复用受到了很大限制。因此,HTTP3采用UDP作为传输层协议,重新实现了无序连接,并在此基础上通过有序的QUIC Stream提供了多路复用,如下图所示:
可以看到,相比HTTP2,HTTP3对传输层和表示层进行了重新改造,改造后在多路复用后,丢包阻塞的问题得到了解决,虽然某个包丢失了,但是并不会影响其他包的传递。
总的来说,HTTP3创造出Connection ID概念实现了连接迁移,通过融合传输层、表示层,既缩短了握手时长,也加密了传输层中的绝大部分字段,提升了网络安全性。
同时,HTTP3在Packet层保障了连接的可靠性,在QUIC Frame层实现了有序字节流,在HTTP3 Frame层实现了HTTP语义,这彻底解开了队头阻塞问题,真正实现了应用层的多路复用。
参考:https://zhuanlan.zhihu.com/p/431672713