2.8.1 快速 UDP 网络连接

QUIC (Quick UDP Internet Connection,快速 UDP 网络连接) 是一种基于 UDP 封装的安全、可靠传输协议,它的目标是取代 TCP 成为标准且效率更高的安全传输协议。

大部分人都会以为是 IETF(Internet Engineering Task Force,互联网工程任务组)在推动 QUIC 替换 TCP 协议,实际上推动的先驱是 Google 公司。早在 2013 年,Google 在它的服务器(如 Google.com、youtube.com)和 Chrome 浏览器中启用了名为“快速 UDP 网络连接(QUIC)”的全新传输协议,该协议业内一般称 gQUIC。

通过下述内容,概览 QUIC 演进的历程:

  • 2015 年,Google 将 gQUIC提交给 IETF,并在 IETF 的推动下对其进行规范化 ,IETF 规范后的 QUIC 协议称 iQUIC,早期 iQUIC 草案有 h3-27、h3-29 和 h3 v1 等不同版本。
  • 2018 年末,IETF 正式批准了 iQUIC 使用 HTTP/3 的版本号,将其确立为最新一代的互联网标准。
  • 2022 年 6月 6 日,历时 9 年,IETF 正式标准化基于 QUIC 协议的 HTTP/3 为 RFC9114。

图 2-26 展示了各个版本的 HTTP 协议对比,HTTP/3 最大的特点是使用 QUIC 协议,并在内部集成 TLS 协议。


图 2-26 各个 HTTP 协议对比:HTTP/3 基于 UDP,并利用 QUIC 实现了安全、可靠的数据传输

1.QUIC 出现的背景

QUIC 出现之前,HTTP 中使用 TCP 作为传输数据的底层协议。

然而,作为一个 40 年前开发的传输层通信协议,肯定没有想到今天移动设备盛行的场景。如今复杂的移动网络环境下,TCP 存在着先天的设计缺陷,这些问题集中在以下几点:

  • 建立连接时握手延迟大:HTTPS 握手初次连接至少需要 3 个 RTT 才能建立。
  • 队头阻塞问题:以 HTTP/2 为例,多个数据请求在同一个 TCP 连接上所有 stream(流,HTTP/2 传输的数据单元)都必须按顺序处理。如果一个 stream 的数据丢失,后面其他的 stream 将被阻塞,直到丢失的数据被重传。
  • TCP 协议僵化问题:作为一个运行了接近 40 多年的协议,许多中间件(例如防火墙和路由器)已经变得依赖于某些隐式规则,打补丁或者说推动 TCP 协议更新脱离现实。

2.QUIC 协议的特点

在汲取 TCP 的设计经验以及现在的网络环境因素影响,QUIC 通过 QUIC 实现了一种全新的可靠性传输机制,具有更低的延迟和更高的吞吐量。

下面列举 QUIC 的部分重要特性,这些特性是 QUIC 被寄予厚望的关键。

2.1 支持连接迁移

当用户网络环境发生变化,这在移动端相当普遍,例如 WIFI 切换到 4G 时,TCP 基于四元组的方式无法保持连接的存活。而 QUIC 由于使用 Connection ID 标识连接,当源地址发生改变时,连接不受环境变化影响,因此 QUIC 可以实现网络变化的无缝切换,从而保证连接存活和数据正常收发。


图 2-27 QUIC 支持连接迁移

2.2 低时延连接

以一个 HTTPS 的请求为例,即使升级使用 TLS1.3 ,初次连接也至少需要 2-RTT 才能开启数据传输,像 TCP Fastopen 这类补丁方案,由于协议僵化原因,根本不会在复杂网络中生效。

QUIC 内部集成了 TLS 安全协议,无需像 TCP 那样,先经过三次握手,再经过 TLS 握手才开启数据传输。QUIC 初次连接只需要 1- RTT 就能开启数据传输


图 2-28 不同协议开启数据传输时,需要的 RTT数

2.3 可插拔拥塞控制

笔者曾在工作中推进升级 TCP 拥塞控制算法,过程相当艰难,原因就是要升级系统内核。

QUIC 的特点是“构建在 UDP 之上,运行在用户态”,这意味着工程师们不关心内核或者不用深入了解内核的开发,也可以灵活地调整可靠传输机制和拥塞控制算法等。

QUIC 协议栈运行在用户态,支持可插拔的 Cubic、BBR、PCC 等拥塞控制算法[1]。大多数的 QUIC 实现,都提供了 SetSendAlgorithm 方法,通过调整该方法的参数,就能跨过内核,灵活控制使用的拥塞控制算法。

2.4 降低对丢包的敏感度

先来看 HTTP/2 Stream 的处理,如图 2-29 所示,如果一个属于 Stream2 的 TCP 数据包丢失了(图中标 5 的圆圈),那么它将阻塞后续数据包的传输。这也就是我们常说的“队头阻塞问题”(head-of-line blocking)。

而 QUIC 为每个 Stream 设计了单独控制,每个 Stream 之间没有顺序依赖。这意味着,如果一个属于 Stream2 的 UDP 数据包丢失了,它只会影响 Stream2 的处理,不会阻塞 Stream1 和 Stream3 的数据传输。这样的好处是,完全避免基于 TCP 协议出现的队头阻塞问题。


图 2-29 QUIC Stream 的设计减小了丢包的影响

此外,还要提及 QUIC 实现的另外一个特性 —— QPACK。QPACK 通过更高效的头部压缩技术减少网络传输中的冗余数据量,这种压缩机制不仅提升了数据传输的效率,也有助于缓解上述的“队头阻塞问题”。

这样,通过全方位无死角的优化设计,保证了 QUIC 在当今网络环境下比 TCP 更安全、更快速的连接、更高的传输效率。


  1. 可插拔指可以灵活的使⽤拥塞算法,⼀次选择⼀个或⼏个拥塞算法同时⼯作。不同的平台具有不同的底层和⽹络环境,⽐如环境 A 选择 Cubic 拥塞控制算法,环境 B 则选择 BBR 拥塞控制算法。 ↩︎

总字数:1532
Last Updated:
Contributors: isno