QUIC 和 TCP: 深入解析为什么 QUIC 更胜一筹

引言

在过去的三十年里,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 连接通过一种称为三次握手的机制建立。下图说明了三次握手过程:

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

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

HTTP 的发展历史

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

HTTP/1.0

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

HTTP/1.1

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

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

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

图片.png

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

HTTP/2.0

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

图片.png

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

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

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

图片.png

当一个数据包丢失时,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 中多路复用的工作机制:

图片.png

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。

图片.png

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

  • 源于:https://engineeringatscale.substack.com/p/how-quic-is-displacing-tcp-for-speed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451279.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电商客服日常必备的快捷回复软件

在数字化时代,客户服务的质量和效率直接影响着企业的品牌形象和客户满意度。尽管智能机器人自动回复功能日益强大,但人工客服的个性化服务和问题解决能力仍然不可或缺。 今天,我向大家推荐一款电商客服日常必备的快捷回复软件——客服宝聊天…

Unity资源 之 最受欢迎的三消游戏开发包 - Bubble Shooter Kit 【免费领取】

三消游戏开发包 - Bubble Shooter Kit 免费领取 前言资源包内容领取兑换码 前言 如果你是一名 Unity 游戏开发者,并且正在寻找一种快速、简单的方式来创建自己的三消游戏,那么 Bubble Shooter Kit 就是你所需要的。 资源包内容 Bubble Shooter Kit 是…

数据结构 实验 2

题目一:遍历二叉树 一、实验目的 熟练掌握指针变量、链表的含义掌握二叉树的结构特性,以及二叉链表的存储方式的特点掌握用递归的方法处理二叉树的基本算法掌握二叉树的四种遍历方式(先序、中序、后序、按层次) 二、实验步骤 …

java(JVM)

JVM Java的JVM(Java虚拟机)是运行Java程序的关键部件。它不直接理解或执行Java源代码,而是与Java编译器生成的字节码(Bytecode)进行交互。下面是对Java JVM更详尽的解释: 1.字节码: 当你使用J…

【elementui源码解析】如何实现自动渲染md文档-第一篇

文章目录 目录 背景 获取源码 代码分析 背景 之前基于vant3的源码开发过二次开发过组件,其中vant实现了将md文档渲染到界面上,有天突发奇想想知道这是如何实现的将md文档渲染到界面上的,因为平时开发中使用elementui占多数,所…

【kaggle量化交易第一名方案】Trading at the Close

2024 1st Place Solution Overview 最终模型(CV/Private LB为5.8117/5.4030)是CatBoost(5.8240/5.4165)、GRU(5.8481/5.4259)和Transformer(5.8619/5.4296)的组合,权重分别为0.5、0.3、0.2,从验证集中搜索得到。这些模型共享相同的300个特征。 此外,在线学习(On…

docker的教程长亭

把我的常用docker写在这里 之前用 vul - hub 靶场经常用 现在docker不知道为什么挂了 开启 docker-compose up -d 关闭 docker-compose down docker ps 只是运行 docker ps -a 所有 包括停止 docker ps -q 只看id docker stop <container_name_or_id> docker 的容器…

Linux Debian12使用podman安装xss-labs靶场环境

一、xss-labs简介 xss-labs靶场是一个专门用于学习和练习跨站脚本攻击&#xff08;XSS&#xff09;技术的在线平台。它提供了一系列的实验场景和演示&#xff0c;帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 二、安装podman环境 Linux Debian…

SylixOS下UDP组播测试程序

SylixOS下UDP组播测试 测试效果截图如下: udp组播发送测试程序。 /********************************************************************************************************* ** ** 中国软件开源组织 ** ** …

vite配置unocss

在vue3vitetseslintprettierstylelinthuskylint-stagedcommitlintcommitizencz-git介绍了关于vitevue工程化搭建&#xff0c;现在在这个基础上&#xff0c;我们增加一下unocss unocss官方文档 具体开发中使用遇到的问题可以参考不喜欢原子化CSS得我&#xff0c;还是在新项目中使…

H5单点登录分析介绍(登录状态检验状态透传分析)

文章目录 1、单点登录解决方案1.1、后端保存登录状态1.2、token模式 2、user服务-登录接口2.1、UserController2.2、UserInfoServiceImpl2.3、载荷2.4、响应2.5、Redis Desktop Manager 3、user服务-登录成功获取用户信息回显3.1、UserController3.2、UserInfoServiceImpl3.3、…

【kubernetes】k8s中包管理工具-----Helm 超详细解读

目录 一、Helm 1.1什么是 Helm 1.2Helm 有三个重要的概念 1.2.1Chart 1.2.2Repository&#xff08;仓库&#xff09; 1.2.3Release 1.3Helm3 与 Helm2 的区别 二、Helm 部署 2.1安装 helm 2.2命令补全 2.3使用 helm 安装 Chart 2.3.1添加常用的 chart 仓库 2.3.2…

【springBoot学习篇】springBoot集成mybatis

目录 第一步&#xff1a;新建spring项目的时候&#xff0c;需要勾选mybatis框架和jdbc连接数据库的包 第二步&#xff1a;在resource目录下面的配置文件当中添加以下的内容&#xff1a;配置数据源 第三步&#xff1a;配置实体类 第四步&#xff1a;添加一个对象的增删改查方…

鸿蒙轻内核Kconfig使用笔记

鸿蒙轻内核使用Kconfig进行图形化配置&#xff0c;本文专门讲解下鸿蒙轻内核LiteOS-M和LiteOS-A的图形化配置方法。本文中所涉及的源码&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 、 https://gitee.com/openharmony/kernel_liteos_m 获取。本…

Ubuntu系统设置中文输入法

重新设置超级用户权限(root)密码(非必要) sudo passwd root 需要注意的是Ubuntu的root密码不能少于8个字符 设置成功后输入命令和新的密码即可无需输入sudo启用root命令 su - 更新软件包列表 sudo apt update sudo apt upgrade 安装fcitx5输入法框架 个别情况需要卸载旧的…

EC20通信模块升级失败 Quectel QDLoader 9008

这里写自定义目录标题 usb驱动下载固件和升级软件下载开始升级上述过程升级失败&#xff0c;出现Quectel QDLoader 9008寻找解决方案&#xff0c;事了QPS t不行&#xff0c;最终使用这个Quectel_Customer_FW_Download_Tool软件解决下载链接&#xff1a; 所有下载驱动、固件、软…

【在线OJ】发帖功能前后段代码实现

一、页面布局 二、前端代码 <template><div id"app"><div style"height: 100vh"><div style"display: flex" ><el-input style"width: 95%" v-model"title" placeholder"输入标题"&g…

【Spine学习07】之跑步动作制作思路总结

前几节试着做了待机和走路动画 现在开始尝试做跑步动作 注意跑步动作和走路一样 暂时不需要使用IK约束但是会用到塞贝尔曲线&#xff08;模拟裙子飞起动效&#xff09; 第一步&#xff1a; 先将人物整体斜放置&#xff08;因为人跑步的时候&#xff0c;身体前倾&#xff09; …

『大模型笔记』主成分分析(PCA)解释:简化机器学习中的复杂数据!

主成分分析(PCA)解释:简化机器学习中的复杂数据 文章目录 一. 主成分分析(PCA)解释:简化机器学习中的复杂数据!二. 参考文献一. 主成分分析(PCA)解释:简化机器学习中的复杂数据! 主成分分析(Principal Component Analysis,简称PCA)通过 将大型数据集中的维度减少…

借助ollama实现AI绘画提示词自由,操作简单只需一个节点!

只需要将ollama部署到本地&#xff0c;借助comfyui ollama节点即可给你的Ai绘画提示词插上想象的翅膀。具体看详细步骤&#xff01; 第一步打开ollama官网&#xff1a;https://ollama.com/&#xff0c;并选择models显存太小选择的是llama3\8b参数的instruct-q6_k的这个模型。 运…