HTTP 3规范正式发布

·  阅读 1659

一、概述

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标准。

image.png

不同于HTTP 1、HTTP 2,HTTP 3 是基于UDP的QUIC协议。

image.png

相比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的工作流程图:

3.gif

三、HTTP3协议

通过前文的介绍,相信大家对HTTP3已经有了一个初步的了解。总的来说,HTTP3协议使用的QUIC提供的多路复用提高了传输效率,而本身并没有更改HTTP的语义。

HTTP 3与HTTP2一样,采用二进制、静态表、动态表与Huffman算法对HTTP Header编码,不只提供了高压缩率,还加快了发送端编码、接收端解码的速度。不过,由于HTTP1协议不支持多路复用,这样高并发只能通过多开一些TCP连接实现。因此,HTTP2与HTTP3都在应用层实现了多路复用功能。

image.png

HTTP2协议基于TCP有序字节流实现,因此应用层的多路复用并不能做到无序地并发,在丢包场景下会出现队头阻塞问题,下图演示了HTTP2协议中报文丢失造成的阻塞。

1.gif

当网络繁忙时,丢包概率会很高,多路复用受到了很大限制。因此,HTTP3采用UDP作为传输层协议,重新实现了无序连接,并在此基础上通过有序的QUIC Stream提供了多路复用,如下图所示:

image.png

可以看到,相比HTTP2,HTTP3对传输层和表示层进行了重新改造,改造后在多路复用后,丢包阻塞的问题得到了解决,虽然某个包丢失了,但是并不会影响其他包的传递。

2.gif

总的来说,HTTP3创造出Connection ID概念实现了连接迁移,通过融合传输层、表示层,既缩短了握手时长,也加密了传输层中的绝大部分字段,提升了网络安全性。

同时,HTTP3在Packet层保障了连接的可靠性,在QUIC Frame层实现了有序字节流,在HTTP3 Frame层实现了HTTP语义,这彻底解开了队头阻塞问题,真正实现了应用层的多路复用。

参考:zhuanlan.zhihu.com/p/431672713

分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改