大历史下的 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://www.mzph.cn/web/7633.shtml

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

相关文章

Python扩展模块的开发

有关python C扩展开发的教程可以参考概述 — Python 3.12.3 文档。项目已经发布至python官方的pypi里了。具体详情请见AdroitFisherman PyPI。目前该项目还处在测试阶段。尚有部分模块需要开发和测试。 项目结构 项目结构见下图: 代码展示与说明 以单链表(SingleL…

5.7代码

1.环境治理 分析:最开始进入了一个误区,觉得都有通路了直接算通路就可以,后来才发现居然是最小路径的总和,所以大概是每减一次都要算一次各点之间的最小路径了,然后是循环,到需要的条件为止 总的来说思路不…

昂科烧录器支持Infineon英飞凌的三相电机驱动器TLE9877QXA40

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中Infineon英飞凌的三相电机驱动器TLE9877QXA40已经被昂科的通用烧录平台AP8000所支持。 TLE9877QXA40是一款单芯片三相电机驱动器,集成了行业标准的ARMCortex™M3 内…

【前端】实现表格简单操作

简言 表格合并基础篇 本篇是在上一章的基础上实现,实现了的功能有添加行、删除行、逆向选区、取消合并功能。 功能实现 添加行 添加行分为在上面添加和在下面追加行。 利用 insertAdjacentElement 方法实现,该方法可以实现从前插入元素和从后插入元…

安卓通信方式简介

目录 一、Binder二、Socket三、Binder与Socket四、Handler 一、Binder Binder作为Android系统提供的一种IPC机制,无论从系统开发还是应用开发,都是Android系统中最重要的组成。 二、Socket Socket通信方式也是C/S架构,比Binder简单很多。在…

Llama3-Tutorial之Llama3 Agent能力体验+微调(Lagent版)

Llama3-Tutorial之Llama3 Agent能力体验微调(Lagent版) 参考: https://github.com/SmartFlowAI/Llama3-Tutorial 1. 微调过程 使用XTuner在Agent-FLAN数据集上微调Llama3-8B-Instruct,以让 Llama3-8B-Instruct 模型获得智能体能力…

期权怎么开户?

今天期权懂带你了解期权怎么开户?近年来,随着股市的持续低迷,市场交易痛点越发明显的氛围中,所以有人看到了双向交易的期权。 期权怎么开户? 1、首先是证券账户内的资金需要满足50万保留20个交易日; 2、其…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下: 只粘贴了js方法哦, methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

Google Play开发者账号为什么会被封?如何解决关联账号问题?

Google Play是Google提供的一个应用商店,用户可以在其中下载并安装Android设备上的应用程序、电影、音乐、电子图书等。Google Play是Android平台上较大的应用市场,包含了数百万个应用程序和游戏。但是谷歌对于上架应用的审核越趋严格,开发者…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致); 实时时钟是很常用的一个外设,通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

CSS学习笔记之基础教程(二)

上节内容CSS学习笔记之基础教程&#xff08;一&#xff09; 6、边距 6.1 外边距&#xff1a;margin 6.1.1 外边距 marginmargin-topmargin-leftmargin-bottommargin-right <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

Linux网络—PXE高效批量网络装机

目录 一、部署PXE远程安装服务 1、搭建PXE远程安装服务器 1&#xff09;安装并启用 TFTP 服务 2&#xff09;安装并启用 DHCP 服务 3&#xff09;准备 Linux 内核、初始化镜像文件 4&#xff09;准备 PXE 引导程序 5&#xff09;安装FTP服务&#xff0c;准备CentOS 7 安…

从简单逻辑到复杂计算:感知机的进化与其在现代深度学习和人工智能中的应用(下)

文章目录 第一章&#xff1a;感知机的局限性1.1 异或门的挑战1.2 线性与非线性问题 第二章&#xff1a;多层感知机2.1 已有门电路的组合2.2 实现异或门 第三章&#xff1a;从与非门到计算机 文章文上下两节 从简单逻辑到复杂计算&#xff1a;感知机的进化与其在现代深度学习和人…

unity基础(一)

内容概要&#xff1a; 生命周期函数vector3 位置 方向 缩放旋转等信息Vector3欧拉角和Quaternion四元素unity脚本执行顺序设置 一 生命周期函数 方法说明Awake最早调用,所以一般可以再此实现单例模式OnEnable组件激活后调用,在Awake后会调用一次Start在Update之前调用一次&a…

软件架构的艺术:探索演化之路上的18大黄金原则

实际工作表明&#xff0c;一步到位的设计往往不切实际&#xff0c;而演化原则指导我们逐步优化架构&#xff0c;以灵活响应业务和技术的变化。这不仅降低了技术债务和重构风险&#xff0c;还确保了软件的稳定性和可扩展性。同时&#xff0c;架构的持续演进促进了团队协作&#…

java:递归实现的案例

//求第20个月兔子的对数 //每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8 public class Test {//求第20个月兔子的对数//每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8pu…

Linux进程——Linux进程与进程优先级

前言&#xff1a;在上一篇了解完一部分常见的进程状态后&#xff0c;我们先来把剩下的进程状态了解一下&#xff0c;再来进入进程优先级的学习&#xff01; 如果对前面Linux进程不太熟悉可以先阅读&#xff1a; Linux进程 本篇主要内容&#xff1a; 僵尸进程和孤儿进程 Linux进…

LLM——用于微调预训练大型语言模型(LLM)的GPU内存优化与微调

前言 GPT-4、Bloom 和 LLaMA 等大型语言模型&#xff08;LLM&#xff09;通过扩展至数十亿参数&#xff0c;实现了卓越的性能。然而&#xff0c;这些模型因其庞大的内存需求&#xff0c;在部署进行推理或微调时面临挑战。这里将探讨关于内存的优化技术&#xff0c;旨在估计并优…

LTE的EARFCN和band之间的对应关系

一、通过EARFCN查询对应band 工作中经常遇到只知道EARFCN而需要计算band的情况&#xff0c;因此查了相关协议&#xff0c;找到了他们之间的对应关系&#xff0c;可以直接查表&#xff0c;非常方便。 具体见&#xff1a; 3GPP TS 36.101 5.7.3 Carrier frequency and EAR…

单细胞|GeneTrajectory·基因轨迹

跑完了&#xff0c;记录一下&#xff0c;顺便写写我在使用中遇到的问题&#xff0c;欢迎讨论&#xff5e; 声明&#xff1a;我是用自己数据跑的&#xff0c;因为还未发表所以就还是借用官网的图啦&#xff5e; 1.准备 library(GeneTrajectory) library(Seurat) library(dply…