为什么 QUIC 优于 TCP?

@高效码农  June 14, 2024

介绍

在过去的三十年里,HTTP (超文本传输​​协议)一直是互联网的支柱。借助 HTTP,我们能够浏览网页、下载文件、播放电影等。多年来,该协议不断发展,并取得了重大改进。

HTTP 协议是一种应用协议,在TCP(传输控制协议上运行。TCP 协议存在一些限制,导致 Web 应用程序响应速度较慢。

为了克服 TCP 的缺点,谷歌开发了一种名为 QUIC 的改变游戏规则的传输协议。几年前,QUIC被标准化并添加到IETF (互联网工程任务组)。

过去几年中,QUIC 的采用率呈指数级增长。谷歌、Facebook、Pinterest 等大多数科技公司都已开始采用 HTTP/3.0,该协议在传输层使用 QUIC。这些公司的网站性能在使用 HTTP/3.0 和 QUIC 后得到了显著改善。

让我们开始了解 QUIC 将如何取代 TCP。我们将首先介绍 TCP 和 UDP 的一些基本网络概念。然后,我们将研究 HTTP 的演变以及每个版本如何克服上一个版本的局限性。然后我们将了解 QUIC 是什么以及它是如何工作的。我们将探讨为什么 QUIC 比 TCP 具有更高的性能。

Engineering At Scale 是一份由读者支持的出版物。要接收新帖子并支持我的工作,请考虑成为免费或付费订阅者。

订阅

TCP 和 UDP 如何工作?

TCP(传输控制协议)和 UDP(用户数据报协议)是传输层协议。这些协议管理往返于任何电子设备的互联网数据包流。让我们详细了解这两种协议的工作原理。

TCP

TCP是一种基于连接的协议。客户端与服务器建立连接,然后发送数据。TCP 连接通过称为三路握手的机制建立。下图说明了三路握手过程:

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c300571-8484-49d2-86b0-cb5c33481072_1724x1494.png)

TCP 三次握手过程

该过程包括三个步骤:-

  1. SYN—客户端向服务器发送SYN数据包。
  2. ACK - 收到SYN后,服务器通过ACK数据包向客户端发送回确认。
  3. SYN-ACK-在收到服务器的ACK数据包后,客户端最终通过SYN-ACK向服务器发送确认。

TCP 是一种有状态且可靠的协议。它保证将所有数据包从一个设备传送到另一个设备。此外,它允许客户端和服务器使用相同的连接进行通信。

UDP

UDP是一种无连接协议。与 TCP 不同,客户端和服务器之间不需要三方握手。客户端将数据包发送到服务器,而不等待服务器的确认。

UDP 无法保证 100% 的数据包传输。数据包可能会丢失,可能无法到达其他设备。UDP 不像 TCP 那样可靠。

由于没有初始握手,UDP 比 TCP 快得多。出于性能原因,UDP 主要用于音乐/视频等流数据应用。

这是一个流行的网络梗,它对 TCP/UDP 进行了一番嘲讽:-

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423f9433-ac7c-4966-b57b-3aa7dc25fd2f_930x718.png)

TCP 和 UDP 的对比

到目前为止,我们已经了解了 TCP 和 UDP 协议的工作原理。现在让我们探索 HTTP 协议,它是一个应用程序级协议。

HTTP 的演变

HTTP 的第一个版本由Tim Berners-Lee于 1989 年欧洲核子研究中心开发。自那时起,该协议经过多次优化和性能改进。大多数现代设备使用HTTP 1.1 / HTTP 2.0HTTP 3.0。让我们回顾一下 HTTP 的历史,了解该协议经历的重大变化。

HTTP/1.0

在最初的 HTTP/0.9 版本之后,HTTP/1.0 开始支持 Header、请求体、txt 文件等。客户端每次使用 HTTP 从服务器获取数据时都必须建立 TCP 连接。这导致建立连接的资源浪费严重。

HTTP/1.1

该协议增加了对重用客户端和服务器之间现有 TCP 连接以获取新数据的支持。这是在 HTTP 标头的帮助下实现的keep-alive

如果客户端想要获取 10 个 Javascript 文件,那么它将与服务器建立一个连接。然后,它将重用相同的连接并获取这 10 个文件,而不是为每个文件创建新的连接。

这样可以减少资源浪费并提高性能,因为它避免了创建冗余连接。然而,一个主要缺点是所谓的线头阻塞问题

下图说明了队头阻塞问题。

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe239fd66-e262-40f3-98c0-a10ed5b5a6b8_2142x820.png)

队首阻塞

让我们通过一个例子来理解这个概念。如上图所示,您有三个文件 - 图像、文本和视频。视频文件较大,传输时间较长。由于视频文件需要更多时间,因此会阻止图像和文本文件的发送。

HTTP/2.0

HTTP 2.0通过多路复用解决了队头阻塞问题。借助多路复用,可以通过同一个TCP连接发送多个文件。

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa585b69a-d486-4f2d-8d01-d6abe448f1ab_2220x862.png)

HTTP/2.0 中的多路复用

这带来了性能提升,并在应用层解决了队头阻塞问题。然而,在 TCP 层,如果出现数据包丢失,则必须等待数据包重新传输。

在数据包丢失的情况下,多路复用解决方案无法按预期发挥作用。事实上,如果数据包丢失率超过 5%,HTTP 1.1 的性能要优于 HTTP 2.0。线头阻塞问题从应用层转移到了传输层。

下图说明了单个数据包丢失如何导致多个流延迟:-

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaad5291-4f50-4f30-83a5-808f89cf4463_2220x862.png)

HTTP/2.0 中的数据包丢失会导致重传和流延迟

当单个数据包丢失时,TCP 会将后续数据包存储在其缓冲区中,直到收到丢失的数据包。然后 TCP 使用重传来获取丢失的数据包。HTTP 无法看到 TCP 重传。因此,在这种情况下,不同的流会出现传输延迟。

什么是 QUIC?

在过去的几节中,我们看到 TCP 具有某些固有的限制,例如三次握手和线头阻塞。这些限制可以通过增强 TCP 或用新协议替换 TCP 来解决。

虽然增强 TCP 很简单,但 TCP 位于与操作系统紧密耦合的最低层。简而言之,TCP 的代码存在于内核层,而不是用户空间。考虑到设备数量庞大,在内核空间实施更改需要大量时间才能覆盖所有用户。

因此,Google 提出了一种新协议QUIC来替代 TCP。与 TCP 一样,QUIC 也是传输层协议。但是,它位于用户空间而不是内核空间。与 TCP 不同,这使得它易于更改和增强。

QUIC 在 UDP 之上工作。它通过使用 UDP 克服了 TCP 的局限性。它只是 UDP 之上的一层或包装器。包装器添加了 TCP 的功能,例如拥塞控制、数据包重传、多路复用等。它在内部使用 UDP,并在其之上添加了 TCP 的最佳功能。

下图展示了 QUIC 如何适应网络堆栈:

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb86cac74-5afc-4929-b2b9-08a793e481f9_1646x1606.png)

使用 QUIC 的网络堆栈

既然我们现在了解了 QUIC 的基础知识,让我们深入研究该协议的工作原理。

QUIC 如何工作?

QUIC 握手

QUIC 在 UDP 上运行,无需经过三次握手过程。三次握手过程会增加额外的开销并增加延迟。因此,QUIC 通过减少连接延迟来提高性能。

对于 TCP,TLS 需要额外的握手,这会增加延迟。QUIC 将 TLS 握手和 QUIC 握手合并到一个调用中。从而优化了握手过程并提高了性能。

可靠性

您可能想知道“由于 QUIC 在 UDP 上工作,数据包会丢失吗?”。答案是不会。QUIC 在 UDP 堆栈之上增加了可靠性。它实现了数据包重传,以防它没有收到必要的数据包。例如:- 如果服务器没有从客户端收到数据包 5,协议将检测到它,服务器将要求客户端重新发送相同的数据包。

多路复用

与 TCP 类似,QUIC 也实现了多路复用。客户端可以使用单个通道同时传输多个文件。QUIC 为每个流(要传输的文件)创建一个 UUID。它使用 UUID 来标识流。然后通过单个通道发送多个流。

下图说明了 QUIC 中的多路复用工作原理:

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f118e3-a72e-4311-9d2f-940a0d92d58a_2538x926.png)

QUIC 中的多路复用

QUIC 还通过多路复用解决了 TCP 面临的队头阻塞问题。如果某个流出现数据包丢失,则只有该流会受到影响。QUIC 中的流是独立的,不会影响彼此的工作。

安全

此外,QUIC 还支持 TLS 1.3(传输层安全性)。这保证了数据的安全性和保密性。TLS 加密了 QUIC 协议的大部分内容,例如数据包编号和连接关闭信号。

为什么选择 QUIC?

  • 减少延迟- QUIC 通过将 TLS 握手与连接设置相结合来最大限度地减少延迟。这也称为0-RTT (零往返时间)。它可以更快地建立连接并提高 Web 应用程序的性能。
  • 多路复用- 通过多路复用,QUIC 可以通过单个通道发送多个数据流。它极大地帮助了下载多个文件(即图像、Javascript、CSS 等)的客户端应用程序。
  • 连接迁移- 使用 QUIC,您可以毫无障碍地从一个网络接口切换到另一个网络接口(从 wifi 切换到移动数据)。这对于移动设备非常重要,可以改善用户体验。
  • 安全性增强- QUIC 可在 TLS 1.3 上运行,可提供更好的安全性。此外,它还会加密协议的大部分内容,而 TCP 和 TLS 则仅加密 HTTP 负载。与 TCP 相比,QUIC 更能抵御安全攻击。
  • 广泛支持- 自推出以来,其采用率不断上升。这进一步增强了其有效性。

HTTP/3 和 QUIC

HTTP/3 是超文本传输​​协议 (HTTP) 的最新版本。它在内部使用 QUIC 而不是 TCP。它旨在为现代网络提供更高效、更安全的基础。它具有 QUIC 提供的所有优势。

HTTP/3 由 IETF 标准化。如今,很大一部分互联网流量都依赖于 HTTP/3。以下图表显示了 HTTP/3 的采用率:

[

](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7240b5e-0df8-46eb-ae1f-c1a87632f44e_1254x1192.png)

采用HTTP/3.0

从上图可以看出,采用率已飙升至 30%,并逐渐超过HTTP/1.1 。按照给定的增长率,HTTP/3.0将在未来几年逐渐超过HTTP/2.0 。

结论

自三十年前 HTTP 诞生以来,互联网已经取得了长足的进步。HTTP 的发展使在线体验更加高效、响应更快。随着现代应用程序需求的不断增长,我们意识到 TCP 等底层协议的固有局限性。

Google 开发了改变游戏规则的协议 QUIC。它利用了 UDP 并解决了 TCP 的所有缺点。降低延迟、多路复用、增强安全性和连接迁移是 QUIC 的一些显著特点。QUIC 带来的创新解决了诸如队首阻塞等问题。

谷歌和 Facebook 等大型科技公司通过在 HTTP/3 中采用 QUIC 实现了性能的大幅提升。随着采用率的提高和支持的不断增长,HTTP/3 将成为互联网通信的标准。在未来几年,互联网将发展并过渡到 HTTP/3,以提高效率、可靠性和性能。

  1. 与 Google 对等连接 - QUIC


评论已关闭