一个原教旨的多路径 TCP
前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based LB 的短突发,老鼠流又无法承受 TCP 的建连开销,向后兼容的普遍刚性意味着几乎所有基础设施若不迁就 TCP,其崭新特性难尽其功。
虽在广域网领域很难改变现状,但在数据中心,仔细读上段文字,理解了掣肘间前因后果之后,在做双边传输优化或自研新协议之时,我们将获得启发。下面以最小修改 TCP 为例描述一个原教旨多路径 TCP 的构建过程。
我们的目标不是多路径,多路径只是手段,我们的目标是充分利用基础设施的并发能力,提高资源利用效率,只不过在数据中心普遍的 CLOS 架构下,多路径的策略非常合理且容易实现,因为 CLOS 在拓扑上本身就是 ECMP 原生的。问题转化为如何让 TCP 支持按 packet 分发,在宏观上充分利用 ECMP 能力,在微观上让转发节点解除流约束,充分利用硬件多处理能力,让硬件变得更简单,自然也就更高效。
若要 TCP 数据分发可按 packet 而不是 5-tuple-flow 执行,如何最小化修改 TCP?这个问题很有趣。
MPTCP 的路子显然把问题复杂化了,因为 MPTCP 是以 TCP 为基准的多路径协议,而不是以底层网络为基准的。交换机和服务器处理 MPTCP 的行为不能有任何不同,每一个 subflow 仍是一个 5-tuple-flow,这在底层的视角看,和标准 TCP 并无不同。TCP 流式约束只约束端,并不约束网络转发节点,TCP 又无法区分乱序和丢包,所以 TCP 在对待乱序需要非常谨慎而严格,避免无效重传。
TCP 的方式是维护一个 reordering 度量,在该度量的约束下,TCP 以重复 ACK 或 SACK 立即回复乱序状态,将处理收敛到 sender 的 update scoreboard 算法。
若以底层资源为基准来分析,自然就会有另一种不同于 reordering 度量但却更自然的方法处理乱序。如果底层网络是严格按照 packet 分发数据包的,那跑在该网络上的传输协议天然就是多路径的,因为乱序几乎是必然的,所以必须对乱序宽容,而宽容的方式自然就是提供一个时间窗口 w,在该时间窗口 w 之后再以重复 ACK 或 SACK 回复乱序状态。
这将是最简单的支持 packet-based 多路径分发的方法,sender 端无需任何改动,这才是真正的多路径 TCP,无论底层网络如何实现,这种 w-based MPTCP 都可兼容,例如,在传统的 5-tuple-flow 分发的网络中,w 将等于 0,相当于标准 TCP 收到乱序报文后立即回复 ACK/SACK。问题转化为 w 的计算问题。
设带宽为 B,已知的或测得的,RTT 为 T,已知的或测得的,若单路径送达,C = (B*T)/MSS 则为单路径报文容量,若 n 路径送达,每条路径承担 C / n 报文,到达时间为 T / n,因此需容忍等待 w = T - T / n 时间,n 可通过测量实际 delivery_rate 和 B 之比获得。
除了在延迟 w 之后按照标准 TCP 的方式发送重复 ACK/SACK 外,还可以直接发 NACK,但这就要修改更多代码了。
如果底层网络是一个不丢包的无损网络,将不再需要区分乱序和丢包,而在现实中,底层网络的误码丢包率本就很低,加之 w-based MPTCP 充分利用 ECMP 路径,反过来极大均匀分发了流量,几乎避免了拥塞,因此这种方式大有可为。
最后,这是一个思想,不针对 TCP,只是用 TCP 最容易讲明白,记住,若不是 TCP,可在双边交互更多信息,这需要设计更好的协议头。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
一个原教旨的多路径 TCP
前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based …...
跟着AI学vue第十三章
第十三章:技术传承与行业影响力塑造 到了这个阶段,你已经在Vue技术领域积累了深厚的经验,拥有了较强的技术实力。此时,你的重点将是把自己的知识和经验传递给更多人,在行业内树立起影响力,推动整个Vue技术…...
labview中VISA串口出现异常的解决方案
前两天在做项目时发现,当用VISA串口读取指令时出现了回复异常的情况,不管发什么东西就一直乱回,针对这个情况,后面在VISA串口中加了一个VISA寄存器清零的函数。加了之后果然好多了,不会出现乱回的情况,但是…...
StableDiffusion本地部署 2
StableDiffusion本地部署 为了做这个事,这是第5篇文章了,可谓是做足了准备。开干! 强烈建议把我之前发的文章看一看,不然你会有点迷迷糊糊的。 整体思路 捋一捋思路: 下载三个东西,webui,py…...
unity学习61:UI布局layout
目录 1 布局 layout 1.1 先准备测试UI,新增这样一组 panel 和 image 1.2 新增 vertical layout 1.3 现在移动任意一个image 都会影响其他 1.3.1 对比 如果没有这个,就会是覆盖效果了 1.3.2 对比 如果没有这个,就会是覆盖效果了 1.4 总结…...
BRD4缺失通过GRP78灭活内质网应激,延缓脱氢表雄酮诱导的卵巢颗粒细胞凋亡
近日,一项由宁波大学医学院附属妇女儿童医院与同济大学附属东方医院妇产科合作的研究,揭示了BRD4(Bromodomain-containing protein 4)在PCOS中的重要作用,以及其与内质网应激(ERS)的复杂关系。值…...
Jmeter插件下载及安装
1、在Jmeter官网(Install :: JMeter-Plugins.org)下载所需插件 2、将下载的插件复制到jmeter文件下的lib/ext文件里(PS:D:\Jmeter\apache-jmeter-5.6.2\lib\ext) 3、打开Jmeter,选择 选项----Plugins Manag…...
【Swift 算法实战】判断数组中是否存在重复元素
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Spock框架:让单元测试更优雅的高效武器
📖 前言:为什么选择Spock? 在软件开发领域,单元测试是保证代码质量的基石。但传统的JUnit/TestNG测试框架在面对复杂测试场景时,往往会显得力不从心。Spock框架作为新一代测试框架的佼佼者,以其独特的BDD&…...
【前端基础】Day 4 CSS盒子模型
目录 1. 盒子模型 1.1 盒子模型布局 1.2 盒子模型组成 1.3 边框 1.4 表格细线边框 1.5 边框会影响盒子实际大小 1.6 内边距 1.7 外边距 1.8 外边距合并 1.9 清除内外边距 2. PS基本操作 3. 综合案例 3.1 案例1 3.2 案例2-快报模块 4. 圆角边框 5. 盒子阴影 6…...
补题蓝桥杯14届JavaB组第4题
算法:动态规划 需要两个一维数组来进行dp 一个用来记录到当前位置的最短时间,另一个用来记录到达当前位置传送门的最短时间 到达传送门的时间需要进行判断,如果上一次传送到达传送门,需要判断上一次传送到这的位置在当前传送门…...
kotlin的函数标准库使用
摘要说明 函数标准库常用的有: 1、apply: apply函数作为一个配置函数,可以传入一个接收者,然后调用一系列函数来配置它以方便使用,如果提供lambda给apply函数执行,它会返回配置好的接收者 使用介绍&#x…...
Visual Studio Code 跨平台安装与配置指南(附官方下载链接)
一、软件定位与核心功能 Visual Studio Code(简称VS Code)是微软开发的开源跨平台代码编辑器,支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块,可自动生成单元测试代码和API文档注释。 二、下载…...
STM32学习【4】ARM汇编(够用)
目录 ARM汇编语言基础写在前面 1. ARM汇编的分类2. 关于指令集指令集切换Thumb2指令集统一汇编语言(UAL)常用汇编指令 3. 汇编格式立即数与伪指令 4. 操作内存的汇编指令LDR:从内存加载数据到CPU寄存器STR:将数据从寄存器存储到内…...
Linux驱动开发实战(一):LED控制驱动详解
Linux驱动开发野火实战(一):LED控制驱动详解 文章目录 Linux驱动开发野火实战(一):LED控制驱动详解引言一、基础知识1.1 什么是字符设备驱动1.2 重要的数据结构read 函数write 函数open 函数release 函数 二…...
windows下安装pyenv+virtualenv+virtualenvwrapper
1、下载pyenv 进入git官网,打包下载zip到本地 2、解压到安装目录 解压下载好的pyenv-win-master.zip到自己的安装目录,如D:\Program Files 3、配置环境变量 右击桌面 此电脑 --> 属性 --> 高端系统设置 --> 环境变量 --> 新建系统变量…...
Cherno 游戏引擎笔记(91~111)
好久不见! 个人库的地址:(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno),可以看到我及时更新的结果。 -------------------------------Saving & Loading scene-----------------------…...
0x02 js、Vue、Ajax
文章目录 js核心概念js脚本引入html的方式基础语法事件监听 Vuevue简介v-forv-bindv-if&v-showv-model&v-on Ajax js 核心概念 JavaScript:是一门跨平台、面向对象的脚本语言,用来控制网页行为实现交互效果,由ECMAScript、BOM、DOM…...
Windows 11【1001问】删除Win11左下角小组件的6种方法
在Windows 11中,左下角的小组件功能虽然提供了天气、新闻等实用信息,但对于一些用户来说可能显得多余或干扰视线。因此,微软提供了多种方式让用户能够自定义是否显示这些小组件。以下是 6 种常见的设置方法来隐藏或关闭Windows 11左下角的小组…...
【动手学深度学习】基于Python动手实现线性神经网络
深度学习入门:基于Python动手实现线性回归 1,走进深度学习2,配置说明3,线性神经网络4,线性回归从0开始实现4.1,导入相关库4.2,生成数据4.3,读取数据集4.4,初始化模型参数…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...
【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
Nginx 是什么:高性能的HTTP和反向代理Web服务器。怎么用:通过配置文件定义代理规则、负载均衡、静态资源服务等。为什么用:提升Web服务性能、高并发处理、负载均衡和反向代理。优缺点:轻量高效,但动态处理能力较弱&am…...
