HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?

TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”TCP成为基础协议,TCP究竟“输”在哪里?

 HTTP/3 采用了谷歌多年探索的基于 UDP 的 QUIC 协议,原名叫 HTTP-over-QUIC,在 2018 年被 IETF 批准更名为 HTTP/3。目前,Cloudflare、Google Chrome、Firefox Nightly 均表示支持 HTTP/3。为什么我们需要 HTTP/3?很多人可能都会有这样一个疑问,为什么在 2015 年才标准化了 HTTP/2 ,这么快就需要 HTTP/3?事实上,我们并不是真的需要新的 HTTP 版本,而是需要对底层传输控制协议(TCP) 进行升级。

TCP与HTTP的不解之缘

HTTP(超文本传输协议 1.0)的第一个正式版本在 1996 年完成。但是HTTP/1.0 没有充分考虑分层代理、缓存、长连接的需求和虚拟主机的影响。所以在一年后HTTP/1.1发布,这也是使用最广泛的版本。在 HTTP/1.1 中, 浏览器通过 TCP 连接一次只能下载一个文件, 如果一个页面需要 10 个 js 文件, 那么这些文件将会按顺序下载。一个文件的延迟就会阻塞后面的其他内容, 也就是我们常说的队头阻塞。2015年, HTTP 协议迎来了更新, HTTP/2发布。HTTP/2 的一大特点是多路复用。引入了二进制帧和流机制,允许使用单个 TCP 连接, 通过 Stream 并行下载资源, 提高了传输效率。然而HTTP/2的多路复用技术使得多个请求其实是基于同一个TCP连接的,因此在HTTP/2中,TCP队头阻塞造成的影响会更大,如果某一个请求造成了TCP队头阻塞,那么多个请求都会受到影响。事实上,在丢包率高的环境中,HTTP/1.1 性能更好。此外,发起 HTTP 请求时,需要经过 TCP 三次握手和四次挥手的过程,整个过程共需要 3 个 RTT 的时延才能发出请求数据。如果客户端和服务器相距遥远,则每RTT可能会花费超过 100 毫秒,从而导致明显的延迟。> RTT:往返时间(Round Trip Time),指一个请求从客户端浏览器发送一个请求数据包到服务器,再从服务器得到响应数据包的这段时间。RTT 是反映网络性能的一个重要指标。

 几十年来,TCP 一直是网络的基石,但种种问题让大家不得不思考取代它的方法,这就是——QUIC,QUIC在几个关键方面与 TCP 有很大不同,直接在其上运行 HTTP/2 将非常困难。因此,HTTP/3 本身是对 HTTP/2 的一个相对较小的改编,以使其与新的 QUIC 协议兼容。

 

相关视频推荐

5个(tcp/udp)网络问题,了解网络协议栈那些不为人知的八股文

C++网络面试题:TCP/UDP应用场景分析,UDP如何实现可靠性设计

网络原理tcp/udp,网络编程epoll/reactor,面试中正经“八股文”

免费学习地址:c/c++ linux服务器开发/后台架构师

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

 

什么是QUIC协议

QUIC是一种通用、安全、多路复用的传输层新型网络协议,它的目标是取代TCP。

2012年,QUIC协议由当时还在谷歌任职的Jim Roskind开发。

2013年,QUIC正式对外公布。

2015年,QUIC被提交给IETF进行标准化。

但是直到六年以后,也就是2021年5月,IETF才发布了第一版标准化的QUIC,被命名为RFC 9000。同时,IETF还发布使用了QUIC的HTTP/3标准化版本。QUIC吸纳了很多与TCP类似的属性,还有TLS加密,将它们置于UDP传输之上的应用层中。

QUIC与 TCP 非常相似,除了 HTTP 和网页加载之外,还可以将其用于许多用例。例如,DNS、SSH、SMB、RTP 等都可以在 QUIC 上运行。 

UDP+QUIC=最佳拍档

UDP 是最基本的传输协议。除了端口号(例如,HTTP 使用端口 80,HTTPS 使用 443,DNS 使用端口 53)之外,它实际上不提供任何特性。它不通过握手建立连接,也不可靠:如果UDP包丢失,它不会自动重传。UDP 的“尽力而为”方法不保证可靠性,无需等待握手,也没有 HoL 阻塞。在实践中,UDP协议主要用于实时性要求很高,但不要求完整性的应用,例如实时视频会议或者游戏等。它对于需要较低的预先延迟的情况也很有用,例如,DNS域名查找只需要一个来回就可以完成。在 UDP 之上,QUIC 结合了 TCP 数十年的部署和实践经验,能够实现几乎所有的 TCP的特性。QUIC 的传输是绝对可靠的,可以通过流量控制和拥塞控制机制来防止过载,并且以比 TCP 更智能、更高效的方式实现了这些功能。QUIC 对于TCP 的改进主要可归结为四个方面:QUIC 与 TLS 深度集成、QUIC 支持多个独立的字节流、QUIC 使用连接 ID、QUIC 使用帧(frame)。QUIC 与 TLS 深度集成

TLS(传输层安全协议)负责保护和加密通过 Internet 发送的数据。当使用 HTTPS 时,纯文本 HTTP 数据首先由 TLS 加密,然后由 TCP 传输。1.2 及更低版本的TLS通常需要两次RTT,新版本的 TLS 1.3 只需一次RTT。

 在互联网早期,加密流量在处理方面的成本很高,因此很多情况下并不是必要的。TLS 是一个完全独立的协议,可以选择是否在 TCP 之上使用,这也是区分 HTTP(没有TLS)和 HTTPS(有TLS)的原因。随着时间的推移,我们对互联网安全的态度已经转变为“默认安全”。因此QUIC的设计者选择将加密深深地嵌入到 QUIC 本身中。虽然 TLS 1.3 仍然可以在 TCP 之上独立运行,但 QUIC 封装了 TLS 1.3。换句话说,没有 TLS 就无法使用 QUIC;QUIC(以及 HTTP/3)始终是完全加密的。此外,QUIC 还加密了几乎所有的数据包头字段。这为 QUIC 提供了几个好处:

  • QUIC 对用户来说更安全:QUIC没有办法明文运行,因此网络攻击者的选择也更少。
  • QUIC 的连接设置更快:虽然对于 TLS-over-TCP,两种协议都需要各自单独的握手,但 QUIC 将传输和加密握手合二为一,从而节省了一次往返时间。
  • QUIC 更容易更新:如果在未来想为 QUIC 添加新功能,我们只必须更新终端设备,而不是所有的中间件。

QUIC 支持多个独立的字节流

对于 HTTP/1.1,资源加载过程非常简单,因为每个文件都有自己的 TCP 连接。例如,如果我们有文件 A、B、C,我们将有三个 TCP 连接。第一个将看到 AAAA 的字节流,第二个 BBBB,第三个 CCCC(每个字母重复都是一个 TCP包)。这可行,但也非常低效,因为每个新的连接都会产生一些开销。HTTP/2 的主要目标之一就是改善这种情况。HTTP/2 协议不再为每个文件打开一个新的 TCP 连接,而是通过单个 TCP 连接下载不同的资源。这是通过多路复用不同的字节流来实现的。举例来看,同样是传输A、B、C三个文件,我们将获得一个 TCP 连接,传入的数据形式可以是 AABBCCAABBCC等。通常情况下,使用HTTP/2 跟HTTP/1.1 一样快或快一点,但开销要少得多。

 

HTTP/2的多路复用机制解决了HTTP层的队头阻塞问题,但是在TCP层仍然存在队头阻塞问题。TCP协议在收到数据包之后,这部分数据可能是乱序到达的,但是TCP必须将所有数据收集排序整合后给上层使用,如果其中某个包丢失了,就必须等待重传,从而出现某个丢包数据阻塞整个连接的数据使用。例如,HTTP 级别的 AABBCCAABBCC,在TCP 眼里它只是 XXXXXXXXXXXX ,如果此时B丢失,它不会发现到底是谁丢失,而是整个重传。解决传输层的队头阻塞是 QUIC 的主要目标之一。与 TCP 不同,QUIC 清楚地意识到它正在复用多个独立的字节流。因此,QUIC 可以在每个流的基础上执行丢包检测和恢复逻辑。在上述场景中,QUIC 只会保留 B 的数据,并且尽快将 A 和 C 的数据传递到 HTTP/3 层。

 

QUIC 使用连接 ID

一个 TCP 连接是由四元组(源 IP 地址,源端口,目标 IP 地址,目标端口)确定的,这意味着如果 IP 地址或者端口变动了,就会导致需要 TCP 与 TLS 重新握手,这不利于移动设备切换网络的场景,比如 4G 网络环境切换成 WIFI。这些问题都是 TCP 协议固有的问题。

 为了解决这个问题,QUIC 引入了一个名为连接ID(connection identifier,CID)的新概念。每个连接在 4 元组之上分配了另一个编号,该编号在两个端点之间唯一标识它。

 更重要的是,因为这个 CID 是在 QUIC 本身的传输层定义的,所以在网络之间移动时它不会改变。通过这种设置,即使 4 元组中的某一项发生了变化,QUIC 服务器和客户端只需查看 CID即可知道它是同一个旧连接,可以继续使用它。不需要重新握手,下载状态可以保持原样。这个功能通常称为连接迁移。

QUIC 使用帧(frame)

与 TCP 不同,QUIC 不使用单个固定的数据包头来发送所有协议元数据。相反,QUIC 具有短的数据包头,并在数据包有效载荷内使用各种“帧”来传达额外信息。例如,一个ACK帧(用于确认)、一个NEW_CONNECTION_ID帧(用于帮助建立连接迁移)和一个STREAM帧(用于承载数据),如下图所示。

 这主要是一种优化,因为不是每个包都携带所有可能的元数据(因此TCP包头通常会浪费相当多的字节)。使用帧还有一个好处,在未来将新帧类型定义为QUIC的扩展将非常容易。例如,一个非常重要的框架是DATAGRAMframe,它允许通过加密的 QUIC 连接发送不可靠的数据。

总 结

总的来说,QUIC相较于TCP有许多优点,但是想要真正实现全面推广也是存在一些困难的。很多企业、运营商和组织对53端口(DNS)以外的UDP流量会进行拦截或者限流(这些流量常被滥用于攻击),因此基于UDP的QUIC协议的传输可能会受到屏蔽。此外,很多中间设备对于UDP的支持和优化程度也并不高。不过,尽管还存在一些未知的困难,但HTTP/3.0的时代一定会到来的!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

< CSS小技巧:那些不常用,却很惊艳的CSS属性 >

文章目录👉 前言👉 一. background-clip: text - 限制背景显示(裁剪)👉 二. user-select - 控制用户能否选中文本👉 三. :focus-within 伪类👉 四. gap - 网格 / 弹性布局间隔设置👉…

【C++笔试强训】第三十一天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 选择题 &#x…

Golang每日一练(leetDay0005)

目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…

我从功能测试到python接口自动化测试涨到22k,谁知道我经历了什么......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 常见的接口&#xf…

C++高并发内存池的设计和实现

一、整体设计 1、需求分析 池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题,但是传统的内存池也存在一定的缺陷,高并发内存池相对于普通的内存池它有自己…

卷王都在偷偷准备金三银四了...

年终奖没发; 简历石沉大海; 发消息只读不回 打开某招聘,看了看岗位,这个厂还不错,可是要求好高,我啥都不会。 “哎,算了,我简历还没更新呢,我躺到6月份拿到年终奖再跑…

3-1 SpringCloud快速开发入门: Ribbon 是什么

接上一章节Eureka 服务注册中心自我保护机制,这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡: **硬件负载均衡:**比如 F5、深信…

记第一次面试的过程(C++)

说实话三月份上旬过得很充实,而且感觉蛮值,但还有不足的地方,今晚特地看完资料分析来复盘复盘。 时间还要回到3.2中午13.35(别问我为什么那么准确,刚刚掏手机看的),我正在吃着饭看着王者荣耀的直…

STL sort 分析

前言 STL 中提供了很多算法,sort 是我们经常使用的,那它究竟是如何实现的呢? STL 的 sort 算法,数据量大时采用快速排序,分段递归。一旦分段的数据量小于某个门槛,为避免快速排序的递归调用带来过大的额外…

三天吃透计算机网络面试八股文

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

Linux常用命令

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

C++STL 容器案例 员工分组 实现步骤与代码分析与展示 实现步骤的注意事项

STL容器 员工分组案例 文章目录STL容器 员工分组案例1 案例描述2 实现步骤3 案例代码与分析1 案例描述 公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在哪个部门工作员工信息有: 姓名 工资组成&#xf…

CANoe中使用CAPL刷写流程详解(Trace图解)(CAN总线)

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

史上最全最详细的Java架构师成长路径图,程序员必备

从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚重的技术专家?本文将为你带来一张程序员发展路径图,但你需要知道的是,天下没有普适的道理,具体问题还需具体分析,实践才…

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。组合逻辑电路比较简单,仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时,输出几乎(信号在电路中传递时会有一小段延迟)立即就发生…

马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?

最近这段时间 ChatGPT 掀起了一阵 AI 热潮,目前来看网上大部分内容都是在调戏 AI,很少有人写如何用 ChatGPT 做正事儿。 作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员,第一次和 ChatGPT 促膝长谈后,基本认定了一个事…

AI又进化了,突破性革命来了

大家好,我是 Jack。 2023 年,AI 真的杀疯了。短短不到一年的时间,当我们还在感慨 AI 一键生成的二次元画作精美万分的时候,它已经进化到了写实美照也能手到擒来的地步。 更多的效果,可以看刚刚发布的视频,…

爽,我终于掌握了selenium图片滑块验证码

因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路: 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

十大经典排序算法(上)

目录 1.1冒泡排序 1. 算法步骤 3.什么时候最快 4. 什么时候最慢 5.代码实现 1.2选择排序 1. 算法步骤 2. 动图演示 3.代码实现 1.3 插入排序 1. 算法步骤 2. 动图演示 3. 算法实现 1.4 希尔排序 1. 算法步骤 2. 动图演示 3.代码实现 1.5 归并排序 1. 算法步骤 2…

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…