不要迷信 QUIC
很多人都在强调 QUIC 能解决 HoL blocking 问题,不好意思,我又要泼冷水了。假设大家都懂 QUIC,不再介绍 QUIC 的细节,直接说问题。
和 TCP 一样,QUIC 也是一个基于连接的,保序的可靠传输协议,TCP 的问题,QUIC 本质上都存在,只是看谁的处理方式更合理更优雅些,不存在彻底解决。QUIC 并没有解决 HoL blocking,只是缓解。里外高低都得先从多路复用开始说。
QUIC 多路复用指的是可以将多条 stream 封装在同一个 QUIC packet 中,或换句话说,多条 stream 可以通过同一条 QUIC connection 承载。
至于为什么非要多路复用,与 HTTP 相关,参考从【这里】开始往后的段落。
若只有 1 条 stream A,QUIC 与 TCP 无异,传输 A1~A100 这 100 个 packet,若 A2 丢了(or 乱序),传输会停滞,receiver 在 hole 未补充前无法交付数据,这就是 HoL blocking。
若一条 QUIC connection 承载 3 条 stream,记为 A,B,C,可有以下典型布局:
第一种布局,只要丢一个 packet,3 条 stream 全部 HoL blocking,第二种,第三种布局下丢一个 packet 只影响一条 stream,但它并不比多条 TCP 好多少,虽确实减少了握手开销,但也带来了问题。第二种情况属于 fair sharing,它延迟了所有 stream,将每条流的传输延时摊派到所有 3 条流的总传输延时,第三种情况属于 run-to-completion,只是简单将 3 条路串行化。
有两种典型丢包模式,随机丢和密集丢,随机丢情况下,按照中心极限定理,所有 stream 同等概率遭遇 HoL blocking,而密集丢情况下,中心极限定理依然起作用,只是影响时间跨度更大。无论如何,采用单条多路复用 QUIC connection 和采用多条 TCP 相比,在传输层面没有任何改变。
TCP 的问题在于它无法获取网络快照,在同样背景信息下,QUIC 也好不到哪里去。 无法预知网络丢包模式,千万不要猜测或假设网络丢包模式,这只会让结果偏离统计期望。采用随机布局是最好的,比如 AABBBACCCBCAABBAAAABCCBBA,这和多条 TCP 有什么不同呢?
QUIC 并没有解决 HoL blocking,只是缓解。但即便是缓解 HoL blocking,QUIC 多路复用也不如 receiver 的 Out-Of-Order Queue 作用更大,ofo Queue 提供了一个 buffer 用来松散保序约束,这才是抓住了本质,若非如此,GBN 才是真正受 HoL blocking 之大害。
此外,实际场景中,stream 数量倾向于少,而丢包乱序倾向于多,这往两边拉,QUIC 解决 HoL blocking 的解释更苍白无力。
那么 QUIC 多路复用的意义到底在哪里?
【这里】我曾说过,QUIC 是从 HTTP 协议演化而来的,当然适配它诞生的水土,HTTP 请求的一个页面上有 jpg,text,javascript 等多种元素,将这些打包在一起再合适不过。QUIC 并不适合传输单个大文件,它简直就是针对 HTTP 的。HTTP/2 提出了二进制分帧,多个资源可以整合在一起传输,但依然沿用了 TCP,整个请求被单一 TCP 连接承载,HoL blocking 问题非常明显。
解决 HTTP/2 HoL blocking 的思路是既然分帧层自己知道多路复用细节,就让分帧层自己处理单独 stream 的 HoL blocking,而不是 TCP 去处理,TCP 不识别 stream,它自身只是一条 stream。就这样,QUIC 诞生了。收到 p2,p3,p4,p5,p8,p10,丢了 p1,p6,p7,p9,对于 TCP,这些数据一个字节也没法交付,全堵在 rcvbuff,而对于 QUIC,也许可交付一部分数据,比如恰好同一个 stream 在收到的 packet 中而没包含在丢失的 packet 中,但也只是也许可以交付,不能保证。
QUIC 只是缓解了 HTTP/2 的 TCP HoL blocking。可为什么不用多条 TCP?为什么不能为每个资源创建一条 TCP 连接?
用进程/线程,协程来解释再恰当不过。指令流是一条需保序可靠执行的串行流。
TCP 和进程/线程一样,是系统感知的,创建一条 TCP 连接,需要握手时间开销,还需要生命周期内连接状态的空间开销,就好比创建一个进程需要生成 PCB 的时间开销,保存 PCB 需要空间开销,都是系统开销,它们的时空复杂度都是 O(n),无论 TCP 连接还是进程/线程,都不可扩展。
因此,为每个请求创建一个进程或线程的 MPM 方案基本都被淘汰了,工人们倾向于在固定数量的进程中处理任意数量的请求,比如 Nginx 就是这种架构。在编程 API 层面上,这就是协程。
协程是系统不感知的,因此也就没有系统开销。QUIC 中的 stream 就是传输协议中协程,QUIC 就是基于 “协-stream” 的多路复用传输协议。
在执行过程中,协程并不比多进程/多线程更快,在很矬的 CPU 上,协程的效果可能还要更差,协程的优势在于资源整合和调度,而非执行效率。与此一致,QUIC 并不比多条 TCP 更快,QUIC 可能确实修正了 TCP 的一些硬伤,比如 SACK blocking 的限制,rwnd 的限制等,但这种 patch 式修正终究改变不了太多,QUIC 的优势亦在资源整合和调度。
我来梳理一下整个故事,TCP 故事里纯背锅。
1997 年 RFC2068 定义的 HTTP/1.1 并没有强制 HTTP 一定要被 TCP 承载:
HTTP communication usually takes place over TCP/IP connections. The default port is TCP 80, but other ports can be used. This does not preclude HTTP from being implemented on top of any other protocol on the Internet, or on other networks. HTTP only presumes a reliable transport; any protocol that provides such guarantees can be used; the mapping of the HTTP/1.1 request and response structures onto the transport data units of the protocol in question is outside the scope of this specification.
注意关键句子 “HTTP only presumes a reliable transport”,彼时除了 TCP 并没有任何成熟的 “reliable transport”(当然,现在也就多了个 QUIC),只好借 TCP 承载 HTTP/1.1。
是 HTTP/1.1 先遭遇了 HoL blocking 而不是 TCP,即时不丢包场景,在 1G 的 text 后跟一个 1K 的 jpg 是一个典型的 HoL blocking case,因为 HTTP Request/Response 必须串行,而 Request 并不知道 text 和 jpg 的大小。如果 Request 知道 jpg 只有 1K,肯定会先请求 jpg,从而解除 HoL blocking。
为 HTTP/1.1 加个二进制分帧层,将文件分片混合传输,就解决了问题,由于此时依然没有除 TCP 外的 reliable transport,加上 HTTP over TCP 已默认成准则,HTTP/2 沿用了 TCP 作为承载协议。这时才遇到 TCP 的 HoL blocking 问题。
缓解(再也不要说解决) TCP HoL blocking 的直接方案就是创建多条 TCP 连接。虽然粒度较粗,但和 “多线程解决单线程 IO 等待的 HoL blocking” 的方法如出一辙。紧接着,出现新的问题,创建多条 TCP 的开销过大,这和多进程,多线程系统开销过大也是同样的嘈点。可以预料,解决问题的思路也一样。
HTTP/3 选择 QUIC 作为传输层,和多条 TCP 连接缓解 HoL blocking 效果相当,但解决了可扩展性问题,消去了 O(n) 增长的 TCP 连接管理开销。
这就是整个故事梗概,TCP 从最开始作为受命托付者,承载 HTTP 20 年,最后却被吐槽,被 QUIC “取而代之”。但实际上,这哪是 TCP 的锅,这是 HTTP 的锅啊。
保序传输本身就是顺序依赖,必须串行解除,这意味着 HoL blocking 是其内秉属性,而非问题。事实上,假如(只是假如)为 HTML 超链接资源加上 size 属性,浏览器便可在少量 TCP 连接上按某种策略 “调度” 资源的 Request,比如 SRPT(Shortest Remaining Processing Time),优先请求最小的资源,就像在 4 个 CPU 上调度 N 个进程一样,总有最优解。
超链接资源支持 size 显然很难,动态获取则需额外一个 RTT,但创建多条 TCP,并行请求多个资源,依然还是调度问题。HTTP 缺的不是一个解决 HoL blocking 问题的传输协议,因为没有这样的协议,HTTP 是个资源池,缺的是调度器。
在公网,QUIC 取代 TCP 的呼声高涨,而老教授 John Ousterhout 也在喷 TCP 不适合 DC。但 TCP 大概率不会消失,无论是 HTTP-Oriented QUIC,or RPC-Oriented Homa,都无法取代 Everything-Oriented TCP,TCP 不假设任何先验,它的意义不是在资源充盈的时候表现得多好,而是最坏的情况下它不至于太糟糕。
当然,QUIC 有很多相对 TCP 的优势,不然它就没有存在的必要了,本文的主旨是,看到不足,才知进步。
HoL blocking 是串行流的内在属性,无论对指令流的执行还是 byte stream 的传输,本质都一样,都是保序流,保序流意味着顺序依赖,且这种顺序只允许唯一一种可能性,降低了容错空间,HoL blocking 对效率的影响显而易见。但经常听到 “QUIC 解决了 HoL blocking” 的说法,需要澄清一下了。最近在读 《布匿战争》,执政官 A 从墨西拿海峡率领 2 个军团纵贯狭长的意大利半岛赶去阿尔卑斯山南麓驰援执政官 B,如何行军最快?列队行军吗?执政官 A 对军团下令,就地解散,个人或结伴自行北上,到达执政官 B 附近后重新列队。这就是乱序传输了,解除了顺序依赖,效率自然高。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:

不要迷信 QUIC
很多人都在强调 QUIC 能解决 HoL blocking 问题,不好意思,我又要泼冷水了。假设大家都懂 QUIC,不再介绍 QUIC 的细节,直接说问题。 和 TCP 一样,QUIC 也是一个基于连接的,保序的可靠传输协议,T…...

【28】Verilog进阶 - RAM的实现
VL53 单端口RAM 1 思路 简简单单,读取存储器单元值操作即可 2 功能猜想版 说明: 下面注释就是我对模块端口信号 自己猜测的理解。 因为题目并没有说清楚,甚至连参考波形都没有给出。 唉,这就完全是让人猜测呢,如果一点学术背景的人来刷题,指定不容易!! 好在,我有较为…...

【MySQL】聚合查询
目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始…...

初时STM32单片机
目录 一、单片机基本认知 二、STM系列单片机命名规则 三、标准库与HAL库区别 四、通用输入输出端口GPIO 五、推挽输出与开漏输出 六、复位和时钟控制(RCC) 七、时钟控制 八、中断和事件 九、定时器介绍 一、单片机基本认知 单片机和PC电脑相比…...

debian部署docker(傻瓜式)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 debian10部署dockerdebian10部署docker(傻瓜式)一、准备工作二、**使用 APT 安装,注意要先配置apt网络源**1.配置网络源2.官方下载三、安装…...

JS判断是否为base64字符串如何转换为图片src格式
需求背景 : 如何判断后端给返回的 字符串 是否为 base-64 位 呢 ? 以及如果判断为是的话,如何给它进行转换为 img 标签可使用的那种 src 格式 呢 ? 1、判断字符串是否为 base64 以下方法,可自行挨个试试,…...

【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 向域对象共享数据一、使用 原生ServletAPI二、…...

本科课程【移动互联网应用开发(Android开发)】实验3 - Activity及数据存储
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...

为何在 node 项目中使用固定版本号,而不使用 ~、^?
以语雀 文档为准 使用 ~、^ 时吃过亏希望版本号掌握在自己手里,作者自己升级(跟随官方进行升级,就算麻烦作者,也不想麻烦使用者)虽然 pnpm 很好用,但是不希望在项目中用到(临时性解决问题可以选…...

leetcode -- 876.链表的中间节点
文章目录🐨1.题目🐇2. 解法1-两次遍历🍀2.1 思路🍀2.2 代码实现🐁3. 解法2-快慢指针🌾3.1 思路🌾3.2 **代码实现**🐮4. 题目链接🐨1.题目 给你单链表的头结点head&#…...

企业网络安全防御策略需要考虑哪些方面?
随着企业数字化转型的加速,企业网络安全面临越来越多的威胁。企业网络安全不仅仅关乎企业数据的安全,还关系到企业的声誉和利益,因此,建立全面的网络安全防御策略至关重要。 企业网络安全防御策略的实现需要考虑以下几个方面&…...

文心一言 vs. GPT-4 —— 全面横向比较
文心一言 vs. GPT-4 —— 全面横向比较 3月15日凌晨,OpenAI发布“迄今为止功能最强大的模型”——GPT-4。我第一时间为大家奉上了体验报告《OpenAI 发布GPT-4——全网抢先体验》。 时隔一日,3月16日下午百度发布大语言模型——文心一言。发布会上&…...

【进阶数据结构】二叉搜索树经典习题讲解
🌈感谢阅读East-sunrise学习分享——[进阶数据结构]二叉搜索树 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注💙我们一起进步 🌈我们在之前已经学习…...

PyTorch 之 神经网络 Mnist 分类任务
文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…...

如何实现用pillow库来实现给图片加滤镜?
使用Pillow库可以非常容易地给图片加滤镜。Pillow库是Python图像处理的一个强大库,提供了多种滤镜效果,如模糊、边缘检测、色彩增强等。 下面是使用Pillow库实现给图片加滤镜的简单步骤: 安装Pillow库:首先需要安装Pillow库。可…...

微分中值定理
极值 目录 极值 费马引理 编辑 罗尔定理 拉格朗日中值定理 例题: 例2 例3 两个重要结论: 编辑 柯西中值定理: 如何用自己的语言理解极值呢? 极大值和极小值的类似,我们不再进行说明 极值点有什么特点吗&…...

redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?
文章目录 redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?Java 中 怎么 实现?方案一: Jedis方案二: Lettuce方案三: Redisson方案四: Jedisson方案五: RedisTemplate那种方式 效率最高 ?拓展:结语redis 存储一个map 怎么让map中其中一个值设置过…...

LeetCode:704. 二分查找
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱704. 二分查找 题目描述:给定一个 n 个元素有序的ÿ…...

Java 到底是值传递还是引用传递?
C 语言是很多变成语言的母胎,包括 Java。对于 C 语言来说,所有的方法参数都是通过 “值” 传递的,也就是说,传递给被调用方法的参数值存放在临时变量中,而不是存放在原来的变量中。这就意味着,被调用的方法…...

Apollo 配置变更原理
我们经常用到apollo的两个特性:1.动态更新配置:apollo可以动态更新Value的值,也可以修改environment的值。2.实时监听配置:实现apollo的监听器ConfigChangeListener,通过onChange方法来实时监听配置变化。你知道apollo…...

聊聊「订单」业务的设计与实现
订单,业务的核心模块; 一、背景简介 订单业务一直都是系统研发中的核心模块,订单的产生过程,与系统中的很多模块都会高度关联,比如账户体系、支付中心、运营管理等,即便单看订单本身,也足够的复…...

血细胞智能检测与计数软件(Python+YOLOv5深度学习模型+清新界面版)
摘要:血细胞智能检测与计数软件应用深度学习技术智能检测血细胞图像中红细胞、镰状细胞等不同形态细胞并可视化计数,以辅助医学细胞检测。本文详细介绍血细胞智能检测与计数软件,在介绍算法原理的同时,给出Python的实现代码以及Py…...

高速PCB设计指南(十五)
掌握IC封装的特性以达到最佳EMI抑制性能 将去耦电容直接放在IC封装内可以有效控制EMI并提高信号的完整性,本文从IC内部封装入手,分析EMI的来源、IC封装在EMI控制中的作用,进而提出11个有效控制EMI的设计规则,包括封装选择、引脚结…...

GPT-4:我不是来抢你饭碗的,我是来抢你锅的
目录 一、GPT-4,可媲美人类 二、它和ChatGPT 有何差别? 01、处理多达2.5万字的长篇内容 02、分析图像的能力,并具有「幽默感」 03、生成网页 三、题外话 四、小结 GPT-4的闪亮登场,似乎再次惊艳了所有人。 看了GPT-4官方的…...

Scala环境安装【傻瓜式教程】
文章目录安装scala环境依赖Java环境安装下载sacla的sdk包安装Scala2.12检查安装是否成功idea配置idea安装scala插件项目配置新建maven项目添加框架支持选择scala创建测试类安装scala环境依赖 Java环境安装 sacla环境安装之前需要先确认Java jdk安装完成 java具体安装步骤略&…...

js实现一个简单的扫雷
目录先看下最终的效果:首先来分析一个扫雷游戏具有哪些功能分析完成后我们就开始一步步的实现1. 相关html和css2. 我们使用类来完成相应功能3. 之后我们则是要定义一个地图4. 对地图进行渲染5. 对开始按钮添加点击事件6. 现在我们可以实现鼠标左击扫雷的功能7. 给单…...

禁用非必需插件,让 IDEA 飞起
文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech IDEA 为我们提供了众多的插件,但是这些插件并不都是必须的。如果电脑的性能不够强,反而会带来一些不必要的资源消耗。 因此这里整理了一些不常用的插件,可以…...

解决win10任何程序打开链接仍然为老旧IE的顽固问题[修改默认浏览器]
文章目录一、问题与修改原因1、着手修改吧2、弯路上探索3、发现祸根二、后话文章原出处: https://blog.csdn.net/haigear/article/details/129344503一、问题与修改原因 我们发现,很多程序默认的网页打开浏览器都是IE,这个很是郁闷ÿ…...

计算机网络体系结构——“计算机网络”
各位CSDN的uu们你们好呀,今天小雅兰来学习一个全新的知识点,就是计算机网络啦,下面,开始虚心学习。 计算机网络的概念 计算机网络的功能 计算机网络的组成 计算机网络的分类 标准化工作 计算机网络的性能 计算机网络的概念 …...

基于微信小程序的校园二手交易平台小程序
文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…...