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的时代一定会到来的!
相关文章:
HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?
TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”TCP成为基础协议,TCP究竟“输”在哪里? HTTP/3 采用了谷歌多年探索的基…...
《JavaCV从入门到实战教程合集》介绍和目录
前言 《JavaCV从入门到实战教程合集》是2016年《JavaCV开发实战教程》和2018年《JavaCV入门教程》2022年《JavaCV音视频实战宝典》三合一汇总合集,完整包含JavaCV入门教程》、《JavaCV开发实战教程》系列和《JavaCV音视频实战宝典》系列所有付费内容。 《JavaCV入…...
Form Generator扩展 文本 组件
一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…...
【C/C++】必知必会知识点大总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
【JavaScript 逆向】百度旋转验证码逆向分析
声明本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!案例目标爱企查百度安全验证百度搜索:aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS8以上均做了脱敏处理,B…...
PCL 点云投影到直线(C++详细过程版)
目录 一、算法原理二、代码实现三、结果展示1、原始点云2、投影结果一、算法原理 直线方程有三种表示法:一般式、点向式、参数式。PCL中统一采用的是点向式,直线的点向式方程为: x − x 0 m = y −...
中缀表达式转后缀表示式,及后缀表达式的运算规则
后缀表达式又称为逆波兰表达式 一,中缀表达式如何转后缀表达式 假定给出以下中缀表达式 132*2-1; 要将该表达式转为后缀表达式,我们要按照一定的规则去走,并且用到栈。 先来看规则中缀转后缀的规则: 前提&#x…...
【C++】STL简介
文章目录什么是STLSTL版本 原始版本(HP版本) P.J.版本 RW版本 SGI版本STL六大组件 容器 算法 仿函数 空间配置器 迭代器 配接器STL缺陷什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不…...
(小甲鱼python)文件永久存储(上)总结 python文件永久存储(创建打开文件、文件对象的各种方法及含义)
一、文件永久存储 如何将数据永久的存放在硬盘上,具体如下。 1.打开文件 定义:往大了讲计算机系统中由操作系统管理的具有名称的存储区域,往小了讲是生活中的PPT、Excel、word三剑客、视频文件、音频文件等。 创建打开文件: open…...
甲酸溶液除钠离子,丙酸溶液除钾离子,医药液体除钾
水是医药行业中用量大、使用 泛的一种原料,它在生产过程中和药剂药品的制备中发挥着极其重要的作用。制药用水的原水通常为自来水或深井水,原水不能直接用作制剂用水或实验用水。因为原水中含有各类盐类和化合物,溶有CO2,还存在大…...
操作系统(2.2)--进程的描述与控制
目录 二、进程的描述 1.进程的定义和特征 1.1进程的定义 1.2进程的特征 2.进程的基本状态及转换 2.1进程的三种基本状态 2.2 三种基本状态的转换 2.3创建状态和中止状态 3.挂起操作和进程状态的转换 3.1 挂起状态的引入 3.2 引入挂起操作后三个进程状态的转换 …...
Python连接es笔记四之创建和删除操作
这一篇笔记介绍一下索引和数据的创建和删除。 其实对于索引来说,如果可以接触到 kibana 的话,可以很方便的在界面进行操作,这里简单介绍一下如何使用代码来操作索引的创建和删除。 索引的创建和删除操作 使用的还是 es 的连接:…...
字符串填充到指定长度
一、需求 在传输一个文件的时候,传输的是二进制数据,整个数据文件的结构为: 文件名称 文件本身 其中文件名称固定占30个byte,存在的情况就是,有的文件名比较长,有的文件名比较短,所有要补足30…...
macOS虚拟机安装全过程(VMware)
作为一名忠实果粉,我最大的愿望就是能够拥有一台Macbook,体验macOS,但是作为学生党,这价钱,贵到离谱啊~~~ 不过,VMware这个神器,可以解决一切问题:既然macOS可以在Macbook上运行&…...
第十三届蓝桥杯A组:选数异或——三种解法(线段树、DP、ST表)
[蓝桥杯 2022 省 A] 选数异或 题目描述 给定一个长度为 nnn 的数列 A1,A2,⋯,AnA_{1}, A_{2}, \cdots, A_{n}A1,A2,⋯,An 和一个非负整数 xxx, 给定 mmm 次查询, 每次询问能否从某个区间 [l,r][l, r][l,r] 中选择两个数使得他们的异或等于 xxx 。 输入格式 输入的第一…...
【CTF】CTF竞赛介绍以及刷题网址
CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今&…...
Springboot怎么优雅实现大文件的上传
前言在软件工程里,在处理“大”的时候一直是一个难点和难点,如并发大、数据量大、文件大,对硬件进行升级可以解决一些问题,但这并不最聪明的办法,而对于老板来说,这也不是成本最小的办法。作为开发人员来说…...
2月编程语言排行榜新鲜出炉,谁又摘得桂冠?
近日,TIOBE公布了2023年2月编程语言排行榜,本月各个语言表现如何?谁又摘得桂冠?一起来看看吧! TIOBE 2月Top15编程语言: 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴…...
机器学习中的数学原理——模型评估与交叉验证
惭愧惭愧!机器学习中的数学原理这个专栏已经很久没有更新了!前段时间一直在学习深度学习,paddlepaddle,刷题专栏跟新了,这个专栏就被打入冷宫了。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一…...
JAVA开发(JSP的9大内置对象和4大作用域)
背景: 在springboot横行的javaweb开发中,现在的后端开发工程师基本不需要写前端JSP页面。但是作为web开发工程师,不懂JSP的原理和作用,几乎是不行的。 JSP技术介绍: JSP(全称Java Server Pagesÿ…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
