大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议,会发生什么。

所谓松弛感,意思是它允许 “漏洞”,允许可靠传输的不封闭,大致就是:“不求 100% 可靠,只要 90%(或多或少) 可靠,另外 10% 的错误可检测到” or “不实现 100% 可靠逻辑,只负责 99%(或多或少) 大概率事件,忽略 1% 的小概率事件,由上层协议处理或不处理”。

前文谈到 tcp timewait,我说只需一个按连接递增的 16bit 全局 version option 就能不用 timewait 和 timestamps 而解决 segment 归属问题,timewait 可以直接取消,timestamps 另作他用。如此可卸载大量复杂性。

这题还有更松弛的解法,比如为每个连接随机生成一个 16bit 标识,或用当前时间生成一个摘要作为 tcp option 替代全局递增 version 做连接区分。如果没有松弛理念,经理肯定会说 “16bit 容易碰撞,要么你用 32bit 或 64bit?”,但相反的问题拉僵了他也考虑不到,问题是,旧连接 seg 进入新连接的概率比 16bit 摘要碰撞的概率更大吗,连续两次旧连接 seg 侵入新连接的平均时间比连续两次 16bit 摘要碰撞的时间更短吗?

不管怎样,真发生了怎么办,如何甄别?应用层校验啊。

设计一个绝对可靠的传输协议初衷是好的,但如果为保证绝对可靠而引入概率很低但复杂的机制使代码膨胀,就是坏的。综合来看,协议的可靠性是收益,而 cpu,内存的时空成本,人员维护成本都是开销。

保证交通工具 99.99% 的可靠性,剩下的交给保险公司,否则就要在飞机上挂巨型降落伞并防止降落伞故障而在地面铺巨型气垫了。

再来看保序。

保序指结果而不是过程,是目标管理,应该用内存拷贝(memcpy)而不是队列(queuing)的过程理解传输协议。

如果你有 100 个 cpu(就不扯 gpu 了),要把 10GB 的内存从一处拷贝到另一处,你会怎么做。这是一个非常经典的 “在规定时间内到某地集合” 的问题,逾期未到者会被催促,或干脆就不等了。因此,传输协议应交互的控制信息类似内存 bitmap(增量交互 or 差分交互,whatever) 而不是一个连续序列号空间(tcp scoreboard)。

要传输 10GB 数据,有 100 条路径可达目的地,协议应该可在这 100 条路径上随意喷洒 byte,效果是,对面的内存 bitmap 越来越密集,最终全部变成 1。而不是像 tcp 那样同时只能沿着其中一条路径传输 byte stream,然后发现这样效率很低后搞什么 mptcp,无非是缩小了问题而没有改变问题。

传输层属于端到端视角,不该看到 queuing,网络层的路由和转发才关注 queuing,传输协议要面向接口而不是面向实现。就像 memcpy,无论正着拷贝,反着拷贝,分若干块多个 cpu 一起拷贝均 ok,传输协议不必关注 byte 具体在哪条路径上传输,至于 byte stream 语义,就看你如何管理 buffer 以及如何交互 bitmap,这些反而是小事。

tcp 保序不松弛的原因在于它内置了 byte stream 语义,对 byte 间的相对位置就有了假设,如果假设先 x 后 y,则一旦先收到 y 而不是 x,就一定要做出 “修正逻辑”,对 tcp 而言,这就是 update scoreboard & mark lost & update reordering 那一块巨复杂的根源,等等,什么是 reordering,你看这就是过程管理而不是目标管理了吧。

再看拥塞控制。

传统意义上狭义的拥塞控制就是 tcp 拥塞控制,它本质上是在控制 inflight,比如通过控制 cwnd 将 inflight 限制在合理范围内,通过 pacing 减缓突发,显然控制的是报文数量是标量。然而 tcp 将这标量绑在 scoreboard 上,这意味着必须在 scoreboard 这个连续序列号空间把标量一个个数出来,但重传报文重传一次后就不能识别乱序,控制 inflight 的标量还没数完可能 scoreboard 就失效了,于是被迫跌入 rto retrans。后来 rack 为 scoreboard 上的报文贴上了时间戳,才能在时间维度区分同一个报文的多次传输,当然,rack 也并非只用于 tcp。

将一个标量绑在 scoreboard 序列号空间有个最大的问题现在才提,这种耦合事实上自己断送了拥塞控制的另一条路,除了控制 inflight 外,还可以换另一条路或多路径负载均衡,而 tcp 一旦这样做就必然会打乱 scoreboard 上报文相对顺序假设,造成 sender 采用更多 “修正逻辑”,后果就是大量乱序导致的不必要重传,甚至假 rto。

若采用 bitmap 交互应答确认,拥塞控制就能彻底独立出来。receiver 只需在应答中用特定字段标识收到的报文数量,标量的事直接用标量表示,sender 自然可以直接算出 inflight,从 bitmap 中选出下一批报文填充 inflight 维持守恒律即可。

端到端拥塞控制的本质从不是什么端到端的 qos,而是用 inflight 适配网络管道,管道并不局限于单条路径,至于你是追求管道效能最高(E = bw / delay 最大),还是追求吞吐最高(bw 最大),或管道利用率最高(bw * min_delay 最大),以此来区分你使用哪种拥塞控制算法。

更有用的是,bitmap 而不是顺序序列号交互应答确认可以让协议更加柔性,receiver 可自行决定这次传输是可靠的还是允许有损的。

不针对 tcp,下图是一个传输协议的统一描述,可用于 quic,rdma 以及各种 rpc:
在这里插入图片描述

历史上,由于 buffer 小,带宽低,惜字如金多交互,时间换空间,tcp 等协议不得不如此设计,但悲哀的是这些历史遗留的传统理念却深深影响了几乎所有现代传输协议的设计和实现。

tcp 协议,无论从 rfc 规范,linux 实现还是日常运维,包含很多很贱很小概率很恶心的 issue,这些 issue 仅在两种场景下最有用,一个是面试,一个是业务咨询,并且如果你花了大量时间解决一个业务咨询后一般会将此问题用于面试,反过来也一样。大致可归为 “timewait 类”,“为什么乱序”,“为什么被 reset”,“窗口上不去” 几个恶心点,但这些问题大多不会严重影响业务,我本人被这类问题恶心了 18 年,期间曾做的一个 dcn transport 就是针对 tcp 的最大反驳,只有三千行代码,竟至少与三万行的 tcp 等效而无不及。本文借几个典型 issue 探讨一番。

浙江温州皮鞋湿,下雨进水不会胖。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Al Agent:开启智能化未来的关键角色,让机器更智能的为我们服务

文章目录 🚀Al Agent是什么📕Al Agent的工作原理与技术💪Al Agent应用领域🚀智能家居应用🌈医疗健康领域⭐金融服务行业🌂交通运输管理🎬教育培训应用 🔒Al Agent优势与挑战✊Al Age…

OurBMC开源大赛企业获奖队伍专访来啦!

精彩纷呈的 OurBMC 开源大赛已告一段落,经历为期四个月的实战,各个参赛队伍也积淀了丰富的实践经验与参赛心得。本期,社区特别邀请 OurBMC 开源大赛获奖企业团队分享「走进OurBMC开源大赛,共同践行开放包容、共创共赢的开源精神」…

洗地机主要看什么参数,618买家用洗地机什么品牌好些?

当我们步入现代化的家居生活,清洁工作已不再是单一的扫帚与拖把的交织,而是各种智能清洁工具的舞台。其中,洗地机以其高效、方便的特性,逐渐成为家庭清洁的必备神器。那么,如何挑选洗地机变成了大家非常关注点问题&…

划重点!PMP报考条件、报考步骤、考试内容、适合人群

参加PMP认证的好处,可以从几个方面来认识: 一、参加PMP认证与考试的过程,同时是一个系统学习和巩固项目管理知识的过程 二、参加PMP认证,您可以获得由PMI颁发的PMP证书 而拥有PMP认证表示你已经成为一个项目管理方面的专业人员…

基于springboot+vue+Mysql的影城管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

官方教程来啦!上手体验YashanDB主备部署、同步延迟和自动切换能力

在上一篇深度干货 | 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术中,我们深入探讨了YashanDB高可用的架构设计原理和关键技术,本文将聚焦于实践操作,快速体验YashanDB的主备高可用能力。 概要 YashanDB提供了不同部署形…

CTK库编译-01

地址 官网地址:Commontk github地址:https://github.com/commontk/CTK 编译环境 Qt套件: IDE:VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块,所以需要把部分模块…

Linux磁盘IO、网络IO、零拷贝详解

一、什么是I/O? 在计算机操作系统中,所谓的I/O就是输入(input)和输出(output),也可以理解为读(read)和写(write),针对不同的对象,I/O模式可以划分…

(✌)粤嵌—2024/5/7—除自身以外数组的乘积

代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* productExceptSelf(int *nums, int numsSize, int *returnSize) {// 左乘积int l[numsSize];l[0] 1;for (int i 1; i < numsSize; i) {l[i] l[i - 1] * nums[…

git commit 提交报错pre-commit hook failed (add --no-verify to bypass) 解决方法,亲测有效

问题截图 今天在执行 git commit 命令时报错&#xff1a;pre-commit hook failed (add --no-verify to bypass) 解决 参考文章&#xff1a;git commit报错&#xff1a;pre-commit hook failed的解决方法 具体原理什么的就不解释了&#xff0c;可以看看上面的参考文章 解决方…

Spring 当中的Bean 作用域

Spring 当中的Bean 作用域 文章目录 Spring 当中的Bean 作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域&#xff0c;一个线程一个 Bean 2. 总结:3. 最后&#xff1a; 每…

【计算机网络】计算机网络的性能指标

计算机网络的性能指标被用来从不同方面度量计算机网络的性能。常用的八个计算机网络性能指标&#xff1a;速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率。 一.速率 (1) 数据量 比特&#xff08;bit&#xff0c;记为小写b&#xff09;是计算机中数据量的基…

JavaScript逆向技术

JavaScript逆向之旅&#xff1a;深入解析与实践 在数字时代&#xff0c;前端技术的迅速发展使得Web应用变得更加丰富和复杂。JavaScript&#xff0c;作为前端的核心语言&#xff0c;其安全性和隐私保护问题也逐渐浮出水面。JavaScript逆向&#xff0c;作为一种从前端代码中提取…

抖音小店个人店和个体店有什么不同?区别问题,新手必须了解!

哈喽~我是电商月月 新手开抖音小店入驻时会发现&#xff0c;选择入驻形式时有三个选择&#xff0c;个人店&#xff0c;个体店和企业店 其中&#xff0c;个人店和个体店只差了一个字&#xff0c;但个人店不需要营业执照&#xff0c;是不是入驻时选择个人店会更好一点呢&#x…

图像处理之PCA(C++)

图像处理之PCA&#xff08;C&#xff09; 文章目录 图像处理之PCA&#xff08;C&#xff09;前言一、PCA原理1.原理思想2.实现步骤 二、代码实现总结 前言 在科研、工程应用中&#xff0c;我们往往所获取的数据都包含着很多冗余的信息&#xff0c;这些冗余的信息会对我们分析数…

卷价格不如卷工艺降本增效狠抓模块规范化设计

俗话说&#xff0c;“卷价格不如卷工艺”&#xff0c;这意味着在追求成本控制和效率提升的过程中&#xff0c;蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新&#xff0c;而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…

【超好用的前端表单辅助功能】

前端表单辅助功能 1. 根据模块自动生成目录锚点定位2. 描点定位动态组件3. 隔离组件&#xff0c;组件内部实现校验逻辑&#xff0c;交给提交按钮统一处理4. 选择不同的类型需要重组不同的模块展示&#xff0c;并整合数据传给后端 最近做了一个复杂的表单&#xff0c;涉及到的技…

深入Django:用户认证与权限控制实战指南

title: 深入Django&#xff1a;用户认证与权限控制实战指南 date: 2024/5/7 18:50:33 updated: 2024/5/7 18:50:33 categories: 后端开发 tags: AuthDecoratorsPermissionsGuardianRESTAuthSessionMgmtMFA 第1章&#xff1a;入门Django与设置 1.1 Django安装与环境配置 在…

3399 ubuntu系统启动后,gpio已被初始化问题查找

问题描述: 使用cat /sys/kernel/debug/gpio后发现,gpio-55已经被设备树初始化了。 如果要找到这个引脚的设置代码,需要一点点查找。这里记录了比较快速的办法 gpio引脚变换 gpio-55需要转换成对应的引脚编号 根据https://blog.csdn.net/ch122633/article/details/120233…

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…