QUIC 和 TCP:了解为何 QUIC 是未来的网络协议

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 在过去的三十年里,HTTP(超文本传输协议)一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。

引言

在过去的三十年里,HTTP(超文本传输协议)一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。

HTTP 协议是一个应用层协议,它基于 TCP(传输控制协议)工作。TCP 协议有若干限制,导致 Web 应用响应较慢。

谷歌开发了一种名为 QUIC 的颠覆性传输协议,以克服 TCP 的缺点。QUIC 几年前被标准化,并加入到了 IETF(互联网工程任务组)。

近几年来,采用 QUIC 的公司数量呈指数增长。大多数技术公司,如谷歌、Facebook、Pinterest 等,已经开始采用在传输层使用 QUIC 的 HTTP/3.0。这些公司已经看到了其网站在使用 HTTP/3.0 和 QUIC 后性能的显著提升。

让我们开始我们的旅程,了解 QUIC 将如何取代 TCP。我们首先将了解 TCP 和 UDP 的一些基本网络概念。之后,我们将回顾  HTTP 的发展历程,以及每个版本是如何克服前一版本的限制的。然后我们将看看 QUIC 是什么,以及它是如何工作的。我们将探讨为什么 QUIC 比  TCP 具有更高的性能。

TCP 和 UDP 是如何工作的?

TCP(传输控制协议)和 UDP(用户数据报协议)是传输层协议。这些协议管理着来自任何电子设备的网络数据包的流动。让我们详细了解这两种协议是如何工作的。

TCP

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

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 对比模因

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

HTTP 的发展历史

HTTP 的第一个版本是 1989 年由 Tim Berners-LeeCERN 开发的。从那时起,这个协议经历了多次优化和性能改进。大多数现代设备使用 HTTP 1.1/HTTP 2.0HTTP 3.0。我们将回顾 HTTP 的历史,并了解该协议经历的主要变化。

HTTP/1.0

在最初的 HTTP/0.9 版本之后,HTTP/1.0 开始支持头部、请求体、txt 文件等。客户端每次从服务器获取数据时必须创建一个 TCP 连接。这导致了建立连接的资源大量浪费。

HTTP/1.1

此协议增加了在客户端和服务器之间重用现有 TCP 连接来获取新数据的支持。这是通过 HTTP 头 部的 keep-alive实现的。

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

这减少了资源浪费并改善了性能,因为它避免了创建冗余连接。然而,一个主要的缺点是称为队头阻塞的问题。

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

HTTP/2.0

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

这结果提升了性能并在应用层解决了队头阻塞问题。然而,在 TCP 层面,如果发生数据包丢失,则必须等待数据包重传。

多路复用解决方案在数据包丢失的情况下并未像预期那样工作。事实上,如果数据包丢失超过 5%,HTTP 1.1 的表现会优于 HTTP 2.0。队头阻塞问题从应用层转移到了传输层。

下图说明了单个数据包丢失导致多个流延迟的情况:

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

什么是 QUIC?

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

尽管增强 TCP 听起来很简单,但 TCP 存在于与操作系统紧密结合的最底层。简单来说,TCP 的代码存在于内核层而不是用户空间。考虑到庞大的设备数量,要在内核空间实施更改可能需要很长时间才能影响到所有用户。

因此,谷歌提出了一种新的协议 QUIC,作为 TCP 的替代品。与 TCP 一样,QUIC 也是一个传输层协议。然而,它位于用户空间而不是内核空间。这使得它比 TCP 更容易更改和增强。

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

既然我们现在了解了 QUIC 的基本知识,让我们深入了解这个协议的工作方式。

QUIC 是如何工作的?

QUIC 握手

QUIC 基于 UDP,并且无需经历三次握手过程。三次握手过程增加了额外的开销并增加了延迟。因此,QUIC 通过减少连接延迟来提高性能。

在 TCP 的情况下,用于 TLS 的额外握手也会增加延迟。QUIC 在单个调用中结合了 TLS 握手和 QUIC 握手。通过优化握手过程,它提高了性能。

可靠性

你可能会想:“既然 QUIC 基于 UDP,数据包会不会丢失呢?”答案是否定的。QUIC 在 UDP 堆栈上增加了可靠性。例如,如果服务器没有从客户端收到第 5 个数据包,协议将检测到这一点,服务器将要求客户端重新发送相同的数据包。

多路复用

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

下图说明了 QUIC 中多路复用的工作机制:

QUIC 中的多路复用

QUIC 通过其多路复用也解决了 TCP 面临的队头阻塞问题。如果一个流遭受数据包丢失,仅该流会受到影响。QUIC 中的流是独立的,不会相互影响。

安全性

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

为什么选择 QUIC?

  • 减少延迟 - 通过结合 TLS 握手和连接设置,QUIC 最小化了延迟。这也被称为 0-RTT(零延迟请求)。它结果在更快的连接建立和提高了 Web 应用的性能。
  • 多路复用 - 通过多路复用,QUIC 可以通过单一通道发送多个数据流。这对下载多个文件(如图片、JavaScript、CSS 等)的客户端应用程序非常有帮助。
  • 连接迁移 - 使用 QUIC,您可以在不中断的情况下从一个网络接口切换到另一个(例如从 WiFi 切换到移动数据)。这对移动设备来说很重要,提升了用户体验。
  • 提升安全性 - QUIC 运作于 TLS 1.3 之上,提供更好的安全性。此外,它还加密了协议的大部分内容,与仅加密 HTTP 负载的 TCP+TLS 相比,它对安全攻击具有更高的抵抗力。
  • 广泛支持 - 自从它推出以来,它的采纳率一直在增长。这进一步加强了其有效性。

HTTP/3 和 QUIC

HTTP/3 是超文本传输协议(HTTP)的最新版本。它在内部使用 QUIC 而不是 TCP。它旨在为现代 Web 提供一个更高效和安全的基础。它具有 QUIC 提供的所有好处。

HTTP/3 由 IETF 标准化。今天,大部分互联网流量都依赖于 HTTP/3。

从上图可以看出,采用率飙升至 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,以实现更高的效率、可靠性和性能。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
15天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
22天前
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
49 10
|
1月前
|
域名解析 缓存 网络协议
TCP传输层详解(计算机网络复习)
本文详细解释了TCP/IP协议族的分层模型、各层的功能、TCP报文的格式以及TCP连接建立的三次握手和断开的四次挥手过程。
89 2
TCP传输层详解(计算机网络复习)
|
1月前
|
域名解析 存储 网络协议
TCP套接字【网络】
TCP套接字【网络】
33 10
|
1月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
61 2
|
1月前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
65 1
|
1月前
|
XML 网络协议 算法
【TCP】网络原理
【TCP】网络原理
31 0
|
2月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
2月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
2月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。