当前位置: 首页 > news >正文

不要迷信 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 个元素有序的&#xff…...

Java 到底是值传递还是引用传递?

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

Apollo 配置变更原理

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

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...