QUIC不是TCP的替代品

QUIC取代了TCP成为HTTP3的基础传输协议,不是因为QUIC能够取代TCP的所有应用场景,而是因为QUIC更适合HTTP的请求/响应业务模型。原文: QUIC Is Not a TCP Replacement

TCP新规范(RFC 9293)的发布是网络界的一件大事,值得围绕这一主题发表第二篇文章(第一篇: 下一代TCP[1]),本文我们将围绕QUIC和TCP的比较展开。


我们在上一篇关于TCP的过去和未来的文章中,谈到了QUIC可能取代TCP的可能性。本文我们想说的是,实际上QUIC解决的问题与TCP解决的问题有所不同,因此不应该被视为TCP的替代品。对于某些(甚至大多数)应用来说,QUIC很可能成为默认传输方式,但这是因为TCP被用到了原本就不适合的场景。接下来看看为什么这么说。

早在1995年Larry和我编写《计算机网络: 一种系统方法》第一版的时候,当我们编写传输协议那一章时,将其命名为"端到端协议[2]"。那时候,互联网上只有两种值得注意的传输协议,UDP和TCP,所以我们分别给它们写了独立的章节。由于那本书旨在教授网络原理而不仅仅是RFC的内容,因此我们将这两个部分框定为两种不同的通信范式: 一个是简单的多路复用服务(以UDP为例),一个是可靠字节流(TCP)。但还有第三种范式,即远程过程调用(Remote Procedure Call[3], RPC),Larry认为有必要介绍这种范式,但并没有真正知名的互联网协议示例实现了该范式。当时我们用来说明RPC的例子现在看来很奇怪,是SunRPC[4]以及Larry当时研究x-kernel[5]时自己写的一个例子。不过现在有许多基于IP的RPC实现,gRPC[6]就是最著名的例子之一。

当大多数网络书籍只涉及TCP和UDP时,为什么我们觉得需要完整的章节来讨论RPC 呢?首先,RPC在当时是分布式系统社区的关键研究领域之一,1984年Nelson和Birrell的论文[7]刺激了一代与RPC相关的项目。在我们看来,可靠字节流并不是RPC的正确抽象。RPC的核心是请求/应答范式。客户端发送一堆参数到服务器,服务器用这些参数做一些计算,然后返回计算结果。是的,可靠字节流可能有助于通过网络正确获得所有参数和结果,但对于RPC来说,还有更多东西。先不考虑通过网络传输序列化参数的问题,RPC实际上并不是传输字节流,而是发送消息并获得对应的响应。有点像数据报文服务(如UDP或IP提供的),但它需要的不仅仅是不可靠的数据报文传递,而是需要处理丢包、无序和重复的消息;需要一个标识符空间来匹配请求和响应;还需要支持消息的分片和重组,以及其他一些需求。可靠字节流可以防止乱序传递,这也是RPC所需要的。这可能是为什么在20世纪八九十年代出现了这么多RPC框架的原因,因为分布式系统需要RPC机制,而标准TCP/IP协议套件没有任何现成的东西。(RFC 1045实际上定义了一种实验性的面向RPC的传输,但从未流行起来。)当时TCP/IP是否会像今天这样占据主导地位也并不明显,因此一些RPC框架(例如DCE)被设计成独立于底层网络协议。

TCP/IP协议栈中缺少对RPC的支持,从而为QUIC奠定了基础。当HTTP在20世纪90年代初出现时,并没有试图解决RPC问题,而是试图解决信息共享问题,但它确实实现了请求/响应语义。HTTP的设计者由于缺乏明显更好的选择,决定在TCP上运行HTTP,由于每个"GET"都使用一个新连接,在早期版本中性能非常差。为了提高性能,引入了对HTTP的各种优化,如流水线(pipelining)、持久化连接以及并行连接,但是TCP的可靠字节流模型从来都不是完美适配HTTP的。随着传输层安全(TLS)的引入,又叠加了一组加密信息的双向交互,HTTP的需求和TCP的支持之间的不匹配变得越来越明显。Jim Roskind在2012年的QUIC设计文档中清晰的解释了这一点,行首阻塞、拥塞响应不佳以及TLS引入的额外RTT都被认为是在TCP上运行HTTP的固有问题。

简单介绍一下这里发生的事情: 互联网的"窄腰(narrow waist)"最初只是IP协议,旨在支持上面的各种协议。但不知何故,"腰"也开始包括TCP和UDP,这两者是唯一可用的传输协议。如果只想要数据报文服务,可以使用UDP。如果需要任何可靠传输,TCP就是答案。如果需要的东西既不能完全映射到不可靠的数据报文,也不能完全映射到可靠的字节流,那么就不走运了。但是,要让TCP支持这么多上层协议,要求就太高了。

QUIC正在做很多工作,其定义跨越三个RFC,涵盖了基本协议(RFC 9000)、TLS的使用(9001[8])和拥塞控制机制(9002[9])。但其核心是互联网缺失的第三种范式: RPC的实现。如果需要真正的可靠字节流(例如下载几个G的操作系统更新时),那么TCP确实是为这项工作而设计的,但是HTTP(S)更像RPC而不是可靠字节流。可以这样理解QUIC,它最终将RPC范式交付给了互联网协议族,而这肯定会使运行在HTTP(S)上的应用程序受益,特别是包括gRPC以及大家广为依赖的RESTful API。

之前的文章[10]提到QUIC时,我们认为这是一个很好的案例研究,可以在需求变得更清晰时重新考虑系统分层,要点是TCP(可靠字节流)满足了一组需求,并且其拥塞控制算法[11]持续演进并为这些需求服务。QUIC实际上满足了一组不同的需求。由于HTTP在今天的互联网处于绝对中心地位(确实有人争论它是否正在成为新的"窄腰"),QUIC可能成为主要传输协议(不是因为取代TCP,而是因为满足了运行其上的主要应用程序的需求)。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

参考资料

[1]

下一代TCP: https://www.mdnice.com/writing/6c05ab8e49954207a5f583268b6c4e58

[2]

端到端协议: https://book.systemsapproach.org/e2e.html

[3]

Remote Procedure Call: https://book.systemsapproach.org/e2e/rpc.html

[4]

SunRPC: https://en.wikipedia.org/wiki/Open_Network_Computing_Remote_Procedure_Call

[5]

x-kernel: https://dl.acm.org/doi/10.1145/74850.74860

[6]

gRPC: https://grpc.io

[7]

Implementing remote procedure calls: https://dl.acm.org/doi/10.1145/2080.357392

[8]

RFC 9001: https://datatracker.ietf.org/doc/html/rfc9001

[9]

RFC 9002: https://datatracker.ietf.org/doc/html/rfc9002

[10]

The Importance of Thinking Across Layer Boundaries: https://systemsapproach.substack.com/p/the-importance-of-thinking-across

[11]

TCP拥塞控制: https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU2MTgxODgwNA==&action=getalbum&album_id=2460055314927255553#wechat_redirect

- END -

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开源库

见:GitHub - eHackyd/Android_OpenSourceLibrary: Android开源库的学习笔记

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量

01 内容摘要 在竞争激烈的汽车行业,自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持,助力多个关键环节。它在汽车座位泡棉切割中提高精确度,降低浪费,提高生产效率;在汽车压铸零部…

kill -9 的用法

kill -9 是一个 Linux 命令&#xff0c;用于强制终止一个进程。当你在终端中输入 kill -9 <PID> 并按下回车后&#xff0c;系统会发送一个强制终止信号给指定进程的进程 ID&#xff08;PID&#xff09;&#xff0c;以立即终止该进程。 需要注意的是&#xff0c;使用 kil…

<泛型>带你更详细的认识泛型

了解泛型 现在有一个需求&#xff1a;写一个打印类&#xff0c;用来打印不同类型的数据 //类1 &#xff1a;打印Integer类型的数据 public class IntegerPrint {Integer content;public void Integer(Integer content) {this.content content;}public void print(){System.o…

Python3数据科学包系列(二):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 一&#xff1a;通过read_table函数读取数据创建(DataFrame)数据框 #…

在服务器上使用nginx改变前端项目请求的url

location /app-dev {rewrite ^/app-dev/(.*) /$1 break;proxy_pass http://152.136.36.251:9999;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; } location /请求后缀 { rewrite ^/app-dev/(.*) /$1 break; proxy_pass 想要的请求后端的url; …

九、GC收集日志

JVM由浅入深系列一、关于Java性能的误解二、Java性能概述三、了解JVM概述四、探索JVM架构五、垃圾收集基础六、HotSpot中的垃圾收集七、垃圾收集中级八、垃圾收集高级👋GC收集日志 ⚽️1. 认识GC收集日志 垃圾收集日志是一个重要的信息来源,对于与性能相关的一些悬而未决的…

Ubuntu22无法自动进入lightdm图像界面

问题&#xff1a;Ubuntu22无法自动进入lightdm图像界面&#xff0c;必须手动运行 lightdm start解决方案&#xff1a; 方案一&#xff1a; 运行一个终端输入 cat /etc/X11/default-display-manager /etc/init/lightdm.conf不接受lightdm作为设置&#xff0c;但是&#xff0c;/…

1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

uni-app:实现页面效果3

效果 代码 <template><view><!-- 风速风向检测器--><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class&quo…

json/js对象的key有什么区别?

1.对于JS对象来说 一个js对象如果是这样的 obj {"0": "小明","0name": "小明明", "": 18,"&#xffe5;": "哈哈"," ": "爱好广泛" }对于js对象来说&#xff0c;有时候key是不…

2023.9.23 关于 HTTP 详解

目录 HTTP 协议 认识 URL HTTP 请求 认识方法 HTTP 响应 认识状态码 总结 HTTP 请求的构造 Form 表单构造 AJAX 构造 Postman 构造 HTTP 协议 应用层使用最广泛的协议浏览器 基于 HTTP协议 获取网站是 浏览器 和 服务器 之间的交互桥梁HTTP协议 基于传输层的 TCP协…

计算机竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

下载盗版网站视频并将.ts视频文件合并

. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…

【深度学习实验】卷积神经网络(三):自定义二维卷积层:步长、填充、输入输出通道

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 步长、填充 a. 二维互相关运算&#xff08;corr2d&#xff09; b. 二维卷积层类&#xff08;Conv2D&#xff09; c. 模型测试 d. 代码整合 2. 输入输出通道 a…

aardio 读取 Excel文件,并显示在 listview

编写 main.aardio 如下 import win.ui; /*DSG{{*/ winform win.form(text"excel1";right801;bottom500) winform.add( button1{cls"button";text"读取Excel文件";left19;top14;right126;bottom44;z1}; button2{cls"button";text&quo…

AUTOSAR汽车电子嵌入式编程精讲300篇-汽车 CAN FD 总线应用研究

目录 前言 汽车总线技术概述 汽车总线的分类与对比 汽车总线发展趋势

有向图访问计数的原理及C++实现

题目 现有一个有向图&#xff0c;其中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1 。此外&#xff0c;该图还包含了 n 条有向边。 给你一个下标从 0 开始的数组 edges &#xff0c;其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。 想象在图上发生以下过程&am…

mysql的mvcc详解

一 MVCC的作用 1.1 mvcc的作用 1.MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制&#xff0c;使得在InnoDB事务隔离级别下执行一致性读操作有了保障。 2.mysql中的InnoDB中实现了MVCC主要…

前端面试:01.图中输入什么?

~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~…