抛弃 TCP 和 QUIC 的 HTTP
下班路上发了一则朋友圈:
周四听了斯坦福老教授 John Ousterhout 关于 Homa 的分享,基本重复了此前那篇 It’s Time To Rep… 的格调,花了一多半时间喷 TCP…
Ousterhout 关于 Homa 和 TCP 之间的论争和论证,诸多反复回执,非常精彩:Is It Time to Replace TCP in Data Centers? && Response to Ivan Pepelnjak’s Blog Post && …
但本文我要说点和 Homa 有关又无关的东西,关于 HTTP 的。我觉得 HTTP 非常适合用 Message-Based protocol 传输。从 RFC2068 1.4 说起:
HTTP only presumes a reliable transport; any protocol that provides such guarantees can be used;
紧接着下面一段多余了:
In HTTP/1.0, most implementations used a new connection for each request/response exchange. In HTTP/1.1, a connection may be used for one or more request/response exchanges, although connections may be closed for a variety of reasons.
上面这段话的 connection 关键词深入人心,让人觉得理所当然。
HTTP 是个无状态协议,天然应被 Message-Based transport 承载,非常自然且合理,why not?所以根本不需要 QUIC,甚至不再需要 TCP。
Homa 号称 RPC-Oriented,但也可以 HTTP-Oriented,每一对 Request/Response 类似一次 RPC。不限于 Homa,任何一个 Message-Based transport 承载 HTTP 都是高尚的。
采用 Message 承载 HTTP,其生命周期和 HTTP 的无状态对应,限制在一次 Request/Response,也就再也无需 TCP 连接管理了。
传输层为每次 Request/Response 生成单机唯一的 Message ID,将 Request/Response 映射到 Message,将 Message 映射到 packet 完成 packetization,以 Message ID 区分,即可并行多个 Request/Response。走这条路线,可直接消除 TCP 的问题,也就没了 QUIC 存在的必要。
HTTP/1.0 多条 TCP 连接并行处理多个 Request/Response,考虑 TCP 连接开销不可扩展,HTTP/1.1 允许多个 Request/Response 复用同一条 TCP 连接,但连接复用引入了 HTTP HoL blocking,比如短 Response 跟在长 Response 后面,为解决 HTTP HoL blocking,HTTP/2 引入二进制分帧多路复用,但引入了 TCP HoL blocking,为了解决 TCP HoL blocking,搞出了 QUIC。
若一开始使用 Message 模式并行处理 Request/Response,问题消失,就没有创建多条 TCP 的必要,自然就不会遭遇连接开销过大问题,接下来的一连串问题都不存在。遗憾的是,HTTP/1.0 一开始采用了 TCP。
这一切的根源在于一开始用一个有状态的 byte stream 协议去承载一个无状态的 Message 交互,结果最终 QUIC 虽然 UDP-Based,却也成了 TCP-Like,造化弄人。
Message 承载 HTTP 可能让人觉得奇怪,可将 HTTP 换成 RPC 就变得很自然,明明一回事,这就是先入为主的力量。
随便就是两个问题,若 Response 有 2GB,Message 如何装得下,若 Response 只 1KB,丢了就没有足够的 packet 触发 fast retransmit。说到底还是在用 TCP 思维解决 Message 问题。
必须要明确,TCP fast retransmit 是大量报文一起发送时顺带的恩惠,不是必须的,如果 TCP 只发生 1 个报文,便不会触发 fast retransmit。至于 2GB 的 Response,虽然怎么看它都像一条流,但它其实还是 Message:
采用 Message 承载 HTTP 并不仅仅因为它解决了连接管理问题,更不是因为它看起来更合理,还有一个很重要的优势,Ousterhout 在分享 Homa 时也提到了,Message-Based 可以利用多核优势并行处理,提高计算资源利用率。
至于说 Message-Based 拥塞控制,今晚没时间写了,明天详细聊下 L4S。
好归好,但历史和现实的力量往往更强大。
HTTP 标准化前,只有 TCP 满足 “reliable” 需求,著名的 Web Server 全假设 HTTP 被 TCP 承载,浏览器根本没有动力和动机偏向 UDP,到 HTTP 标准化时,就有了 “most implementations used a new connection…” ,注意修饰词,most implementations,但实际上是 all implementations。
之前说过,若不是 Google 同时掌控 App Server 和 Chrome Browser,QUIC 同样很难演进,可即便是 QUIC,依然还是 TCP-Like,还是没能突破老路子。
TCP 的影响力渗透到了每一根汗毛,即使 Amazon SRD 也在 “纠正 TCP 的问题”,各个新的旧的 transport 都在被 TCP 牵绕,却几乎从来没能另辟蹊径解决根本核心的问题,也许这个问题和 TCP 根本就没关系,就像本文说的 HTTP。
任何一个新协议都要试图解决 TCP 的某个或某些问题而不是解决 TCP 上层逻辑真正的问题,这才是真正的问题。
以前就了解过 Homa,但只有听 Ousterhout 亲自讲的时候才会有仪式感,他不止一次提到 Message 如何如何比 byte stream 好,比如边界清晰,并行处理,负载均衡…但他也说了,Homa 是专治 DataCenter 的各种不服的,而不打算去卷公网… 可我 don’t think so. 我觉得 Message-Based protocol 可以更好承载 HTTP 在公网上传输(运营商友好性是问题,但这是后话),我觉得 HTTP 和 RPC 是一回事,无状态乒乓协议真不适合用 byte stream 承载,无论 TCP 还是 QUIC。我还是觉得现在几乎所有 transport 都被 TCP 影响了,任何一个新协议都要试图解决 TCP 的某个问题而不是解决 TCP 上层逻辑真正的问题。回头看,很多使用 TCP 的应用并不是非要用 TCP,而是没有别的选择借用 TCP,时间久了就成事实上的 TCP-Based。重新审视这些 “借用” 是高尚的。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:

抛弃 TCP 和 QUIC 的 HTTP
下班路上发了一则朋友圈: 周四听了斯坦福老教授 John Ousterhout 关于 Homa 的分享,基本重复了此前那篇 It’s Time To Rep… 的格调,花了一多半时间喷 TCP… Ousterhout 关于 Homa 和 TCP 之间的论争和论证,诸多反复回执&…...
未来公寓智能化设计平台项目(下)
创业场景通过在社区入口附近建设共享办公室,带动海慧园和众汽佳苑创业氛围,也让社区出了居住以外有其它功能,并且结合教育、邻里模块让社区更有活力。住户可通过app查看共享空间的使用情况,以及可以远程控制各种设备。 顺应未来生活与就业、创业融合新趋势,构建“大众创新…...
常见分布式消息队列综合对比
本文将从,Kafka、RabbitMQ、ZeroMQ、RocketMQ、ActiveMQ 17 个方面综合对比作为消息队列使用时的差异。 1. 资料文档 Kafka:中,有 kafka 作者自己写的书,网上资料也有一些。 rabbitmq:多,有一些不错的书…...
怎么邀请主流媒体到现场报道
传媒如春雨,润物细无声,大家好 主流媒体通常是指央媒,报纸杂志,电视台,地方重点媒体等,采访形式包括现场取材报道,媒体专访,群访等。通常主流媒体对选题要求较严格,因此在…...

2023年最强手机远程控制横测:ToDesk、向日葵、Airdroid三款APP免Root版本
前言 随着远程办公和远程协作的日益普及,跨设备、系统互通的远程控制软件已经成为职场人士不可或缺的工具之一。在国内,向日葵和ToDesk是最著名的远程控制软件;而在国外,则有微软远程桌面、AirDroid、TeamViewer、AnyDesk、Parse…...

用SQL语句操作oracle数据库--数据查询(上篇)
SQL操作Oracle数据库进行数据查询 Oracle 数据库是业界领先的关系型数据库管理系统之一,广泛应用于企业级应用和数据仓库等场景中。本篇博客将介绍如何使用 SQL 语句对 Oracle 数据库进行数据查询操作。 1.连接到数据库 在开始查询之前,需要使用合适的…...

模板学堂|DataEase图表样式解析
DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板,并…...

STM32看门狗
目录 独立看门狗 IWDG 什么是看门狗? 独立看门狗本质 独立看门狗框图 独立看门狗时钟 分频系数算法: 编辑 重装载寄存器 键寄存器 溢出时间计算公式 独立看门狗实验 需求: 硬件接线: 溢出时间计算࿱…...

什么是划分子网?网络工程师划分子网有啥技巧?
随着互联网的快速发展,越来越多的组织和企业在其内部建立了复杂的网络系统来满足日常的信息传输和资源共享需求。而在这些网络系统中,划分子网(也称为子网划分)作为一种常见的网络管理方法,为组织和企业提供了更加灵活…...

制作两栏布局的 6+5 种方法:从相当合理到完全错误
一个挑战 假设您需要创建一个两列布局。是的,最简单的那种:左边一列,右边一列,中间有一些空隙。有一个明显的现代解决方案: .columns {display: grid;grid-template-columns: 1fr 1fr;gap: 20px; }完毕!当…...
nvidia-smi 各种命令
各种命令网站 点 主频 显卡就像一家工厂,工厂的工人是GPU。而主频就相当于工人的工作效率,主频越高,意味着工人的工作效率越高,能在单位时间内完成更多的任务。但同时,工作效率越高,工人们就越容易疲劳&…...

实验6 TensorFlow基础
1. 实验目的 掌握TensorFlow低阶API,能够运用TensorFlow处理数据以及对数据进行运算。 2.实验内容 ①实现张量维度变换,部分采样等; ②实现张量加减乘除、幂指对数运算; ③利用TensorFlow对数据集进行处理。 3.实验过程 题目…...

Python爬虫基础之如何对爬取到的数据进行解析
目录1. 前言2. Xpath2.1 插件/库安装2.2 基础使用2.3 Xpath表达式2.4 案例演示2.4.1 某度网站案例3. JsonPath3.1 库安装3.2 基础使用3.2 JsonPath表达式3.3 案例演示4. BeautifulSoup4.1 库安装4.2 基础使用4.3 常见方法4.4 案例演示参考文献原文地址:https://www.…...

【Python游戏】坦克大战、推箱子小游戏怎么玩?学会这些让你秒变高高手—那些童年的游戏还记得吗?(附Pygame合集源码)
前言 下一个青年节快到了,想小编我也是过不了几年节日了呢!! 社交媒体上流传着一张照片——按照国家规定“14岁到28岁今天都应该放半天假!”不得不说, 这个跨度着实有点儿大,如果按整自然年来算年龄&…...

python3 DataFrame一些好玩且高效的操作
pandas在处理Excel/DBs中读取出来,处理为DataFrame格式的数据时,处理方式和性能上有很大差异,下面是一些高效,方便处理数据的方法。 map/apply/applymaptransformagg遍历求和/求平均shift/diff透视表切片,索引&#x…...
如何从 PowerPoint 导出高分辨率(高 dpi)幻灯片
如何从 PowerPoint 导出高分辨率(高 dpi)幻灯片更改导出分辨率设置将幻灯片导出为图片限制你可以通过将幻灯片保存为图片格式来更改 Microsoft PowerPoint 的导出分辨率。 此过程有两个步骤:使用系统注册表更改导出的幻灯片的默认分辨率设置&…...
JAVA数据结构之冒泡排序,数组元素反转,二分查找算法的联合使用------JAVA入门基础教程
//二分查找与冒泡排序与数组元素反转的连用 int[] arr2 new int[]{2,4,5,8,12,15,19,26,29,37,49,51,66,89,100}; int[] po new int[arr2.length]; //复制一个刚好倒叙的数组po for (int i arr2.length - 1; i > 0; i--) {po[arr2.length - 1 - i] arr2[i]; }//arr2 po…...
linux对动态库的搜索知识梳理
一.动态库优先搜索路径顺序 之前的文章我有整理过,这里再列出来一次 1. 编译目标代码时指定的动态库搜索路径; 2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径; 4. 默认…...

R -- 用psych包做因子分析
因子分析 因子分析又称为EFA,是一系列用来发现一组变量的潜在结构的办法。它通过寻找一组更小的,潜在的结构来解释已观测到的显式的变量间的关系。这些虚拟的、无法观测的变量称为因子(每个因子被认为可以解释多个观测变量间共有的方差&…...
既然操作系统层已经提供了page cache的功能,为什么还要在应用层加缓存?
Page Cache是一种在操作系统内核中实现的缓存机制,用于缓存文件系统中的数据块。当一个进程请求读取一个文件时,操作系统会首先在Page Cache中查找数据块,如果找到了相应的数据块,则直接返回给进程;如果没有找到&#…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...