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

TCP 的演化史-sack 与 reordering metric

就着 TCP 本身说事,而不是高谈阔论关于它是如何不合时宜,然后摆出一个更务虚的更新。
从一个 case 开始。

按照现在 Linux TCP(遵守 RFC) 实现,以下是一个将会导致 reordering 更新的 sack 序列:
在这里插入图片描述
考虑一种情况,这两个携带 sack block 的 ack 本身乱序,而不是被 sack 确认的 data 乱序, 以上的 reordering 更新就是误判,而 reordering 是单调更新的,递增的 reordering 将影响 mark lost 的数量,进而影响 retransmit 效率。

reordering 误判对 rate-based cc 影响非常大,因为 rate-based cc 要求即使在 loss recovey 状态也要源源不断地发送数据以支撑测量,而 reordering 可能会造成 sender 等待,减少 retransmit。

上述误判情况由下图所示(sack block 上的数字标识 sack block 生成的顺序):
在这里插入图片描述
reordering 误判的依据在于,考虑 sender 发送 1~10,其中 1,3,5,7,9 丢失,receiver 依次收到 2,4,6,8,10. 假设 receiver 由于被其它 option 挤占空间,只能支持 max = 3 个 sack block 段,它 “一般”(下面解释为何不是一定) 会按照以下序列生成 sack block:

收到 2,发送 ack 1,携带 sack 2;
收到 4,发送 ack 1,携带 sack 4-2;
收到 6,发送 ack 1,携带 sack 6-4-2;
收到 8,发送 ack 1,携带 sack 8-6-4;
收到 10,发送 ack 1,携带 sack 10-8-6;

如果收到 8 或者 10 后发送的 ack 比收到 2 后发送的 ack 先到达 sender,就会出现第一幅图所示的场景。

为什么这么明显问题,Linux TCP 没处理呢?

因为 RFC 并未规定 sack block 的顺序一定是 LRR(Least Recently Received,类似 LRU,Least Recently Used) 链表的形式。在 RFC2018 第 4 小节 Generating Sack Options: Data Receiver Behavior 中有以下描述:

The SACK option SHOULD be filled out by repeating the most recently reported SACK blocks (based on first SACK blocks in previous SACK options) that are not subsets of a SACK block already included in the SACK option being constructed. This assures that in normal operation, any segment remaining part of a non-contiguous block of data held by the data receiver is reported in at least three successive SACK options, even for large-window TCP implementations [RFC1323]). After the first SACK block, the following SACK blocks in the SACK option may be listed in arbitrary order.

既然不是 MUST,sender 就不能对 sack block 假设任何时间序。对 receiver 而言,由于无法区分原始 seg 和重传 seg,如果是重传 seg,这个 LRR 时间序就不准了。

如果(仅如果) RFC 要求 sack block 保持 LRR 强序,那么 sender 收到的 sack block 就一定是这个强序,便不再受 ack 反向路径乱序影响。

我想的是,虽然 RFC 并未要求 MUST,但事实上应该非常大比例的 receiver 实现了 LRR 强序,这样做最简单。不然因为 RFC 的 maybe 摆布一个 arbitrary order 动机呢,图什么呢?

因此,管它 MUST or SHOULD/MAYBE,sender 假设 sack block 是 LRR 强序,如果真的大部分 receiver 命中了我的猜测,reordering 误判将会减少很多。当然,这个假设需要现网数据支撑。

如果真将 sack block 的 LRR 序从 SHOULD/MAYBE 改为 MUST,根据收到 sack option 中 sack block 的顺序,可更加精确处理 reordering 更新。后文基于该假设继续。

同样上面的 case,加入强序后,就更加精确且清晰:
在这里插入图片描述
显然,sender 可根据不同的 sack block 序列,判断出不同的 reordering metric,进而将 reordering 更新成不同值。

LRR 强序前,不能确保 sack block 顺序一定有确切含义,对 sender 就更不能确定其意义,sender 只简单将收到的 sack block 进行升序排序,用这个序列去 mask 所有 rtxq(retransmit queue),求两个区间链表的交集:区间列表的交集

LRR 强序后,sender 实现更简单了。按照 sack block 在 sack option 的天然顺序匹配发送顺序即可精确判断 reordering。dsack 亦可统一处理。

引入 rack 之后事情变得更简单,sender 可用 sack block 的 LRR 时间序与 rack 时间序做比对来精确判断 reordering:
在这里插入图片描述

照 sack block 顺序比对 rack 环,倒排即乱序,reordering 单调递增,rto 复位(rto 意味着路由可能发生了重收敛)。

由于重传歧义硬伤,sender 仍需稍微的启发判断,dsack 一个 seg 后,相信自然序(原始 seg 带来第 1 个 sack,重传 seg 带来第 2 个 sack),重传后的 sack 相信重传而非乱序,当然,也可以配置信任度量。

无论如何,sack block LRR 强序对 sender 带来更加确定的信息,该信息对 sender 的 cc 决策有益。并且实现更简单了,为什么不呢?

回到 RFC2018,看看初衷。

The SACK option SHOULD be filled out by repeating the most recently reported SACK blocks that are not subsets of a SACK block already included in the SACK option being constructed.

sack block 被安排成 LRR 弱序(may be listed in arbitrary order),原因二,首先 sack option 长度有限,要为最新的接收事件的数据生成 sack block,其次 sack option 长度又不是那么有限,安排冗余信息可以抵御 ack/sack 丢失,提高鲁棒性:

  • Sending a selective acknowledgment for the most recently received data reduces the need for long SACK options.
  • The redundant blocks in the SACK option packet increase the robustness of SACK delivery in the presence of lost ACKs.

按照现代的观点,考虑到 sack block 以及反向 ack 本身的乱序对 reordering 的影响,sack block 数量越多越容忍反向路径 ack 乱序,确实如此,4 个 block 够了(如果被其它 option 挤占可能不足 4 个),况且就算最多只有 4 个 block,只要能零散接收,sack block 就能像滑动窗口(最大 4 段)一样一直滑下去,覆盖所有 ofo(out of order) seg,由于每个 seg 最多可出现4次,即可提供冗余。sack 的该机制是好的,非常好的。

演化过程是见招拆招的过程,远不是全局视角下的设计过程。遇到问题,痛点是解决这个问题,看看初衷问题和 RFC2018 的来源:
在这里插入图片描述
sack 解决了问题,sack 就是好的。RFC2018 引入时的 loss recovey 算法依然如旧:
在这里插入图片描述
彼时 sack 仅仅可区分对待了 sacked seg,避免不必要的重传。新式的 loss recovey 算法要等后续发布。

标识 sack 相关 loss recovey 算法的 RFC6675 以及前身 RFC3517 均未引入 reordring 的影响,直到 RFC4737 才引入 reordering 度量:Packet Reordering Metrics,这是 2006 年的事,sack 被引入 TCP 时尚无 reordering issue,更谈不上为它提供精准信息。但无论如何,现在 sack 和 reordering 以及 rack 可以结合,并且高尚。
说下本文的缘起。

我用 packetdrill 做 sack 测试,构造了本文图 1 的 ack 乱序 case,触发了 reordering 更新后 mark lost 便不及时了(按照 scoreboard update 算法,保留 reordering 个 sacked seg),影响了 retransmit 效率。

So?若做 TCP 双边,我觉得一定要确保 receiver 生成 LRR 强序 sack block,多些确切信息总不会错,TCP 就是不确定信息太多才复杂。若做 TCP 单边,我觉得要假设 receiver 生成 LRR 强序 sack block,就算它不是,损失也不多,况且大概率它是,不然对它有什么好处呢?

对了,reordering 的更新不仅和 sack 有关,和 cumulative ack 也有关系。此外,关于反向路径对正向 rate-based 发送的影响,我还有另外一个建议:TCP 时间戳的妙用 以及 TCP 拥塞识别。

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

相关文章:

TCP 的演化史-sack 与 reordering metric

就着 TCP 本身说事,而不是高谈阔论关于它是如何不合时宜,然后摆出一个更务虚的更新。 从一个 case 开始。 按照现在 Linux TCP(遵守 RFC) 实现,以下是一个将会导致 reordering 更新的 sack 序列: 考虑一种情况,这两个…...

【Spring6】| Spring的入门程序、集成Log4j2日志框架

目录 一:Spring的入门程序 1. Spring的下载 2. Spring的jar文件 3. 第一个Spring程序 4. 第一个Spring程序详细剖析 5. Spring6启用Log4j2日志框架 一:Spring的入门程序 1. Spring的下载 官网地址:https://spring.io/ 官网地址&…...

包子凑数(完全背包)

小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼,其中第 i种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若…...

Spring超级全家桶,学完绝对是惊艳面试官的程度

前言Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。有人亲切的称之为:Spring 全家桶。很多研发人员把spring看作心目中最好的java项目,没有之一。所以这是重点…...

Redis主要数据类型

Redis 是一个数据结构服务器。 Redis 的核心是提供一系列本机数据类型,可帮助您解决从缓存到队列再到事件处理的各种问题Redis主要数据类型:String(字符串),Lists(列表),Sets&#x…...

【Linux | ELK 8.2】搭建ELKB集群Ⅰ—— 实验环境说明和搭建Elasticsearch集群

目录1. 实验环境1.1 实验工具1.2 操作系统1.3 架构版本、IP地址规划与虚拟机配置要求1.4 拓扑图1.5 其他要求2. 实验步骤2.1 安装Elasticsearch(单节点)(1)检查系统jdk版本(2)下载elasticsearch&#xff08…...

不同情况下*p和*p的区别(指针)

一说到指针,不少同学就会觉得云里雾里。首先要明白,指针和地址是一个概念;然后明白指针和指针变量的区别。先理解地址和数据,想象内存里面是一个个的小盒子,每个盒子对应一个编号,这个编号就是地址&#xf…...

Vuex基础语法

Vuex vuex官网 文章目录Vuexvuex的工作原理图2.vuex的环境搭建3.vuex的使用1.actons2. mutations3.getters4.vuex中的map映射属性4.1 mapState和mapGetters4.2 mapMutations和mapActions5.vuex多组件通信1.通过计算属性获得2.通过mapState获得6.vuex模块化和命名空间6.1模块化…...

刚上岸字节测试开发岗,全网最真实的大厂面试真题

首先我来解释一下为什么说是全网最真实的面试题,相信大家也发现软件测试面试题在网上流传也已不少,但是经过仔细查看发现了两个很重要的问题。 第一,网上流传的面试题的答案并不能保证百分百正确。也就是说各位朋友辛辛苦苦花了很多时间准备…...

Mac监控键盘输入并执行动作

最新内容在我的另一个博客:Mac监控键盘输入并执行动作 背景 电脑的安全是非常重要的,特别是里面的敏感数据,若是被有心之人利用,那后果不堪设想。 所以我们部门定下了一个规矩,谁离开工位要是不锁屏,就可以…...

Transformer输出张量的值全部相同?!

Transformer输出张量的值全部相同?!现象原因解决现象 输入经过TransformerEncoderLayer之后,基本所有输出都相同了。 核心代码如下, from torch.nn import TransformerEncoderLayer self.trans TransformerEncoderLayer(d_mode…...

港科夜闻|全国政协副主席梁振英先生率香港媒体高管团到访香港科大(广州)...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、全国政协副主席梁振英先生率香港媒体高管团到访香港科大(广州)。2月21日下午,在全国政协副主席、广州南沙粤港合作咨询委员会顾问梁振英先生的带领下,香港20余家媒体的高管及知名媒体人士到访香港科大…...

XML调用 CAPL Test Function

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...

Linux网络配置(NAT)

在搭配好一台虚拟机的时候想要下载,安装些什么但一直失败这个时候就可以检查一下网络是否连接这里我们使用centos7举例子使用命令——ifconfig由此可见我们的系统中目前有3个网卡ens33——用于接入外网,该网卡默认关闭lo——用于访问本地网络&#xff0c…...

数据结构——第二章 线性表(8)——线性表总结

线性表总结 线性表是线性结构的基本形式,用于描述一组同类型而具有1:1线性关系的数据对象。将此类数据对象存放在计算机的内存中时,必须考虑数据元素的存放和数据元素之间关系的存放。常用的存储结构有顺序存结构和链式结构。 顺序表存储特点是用一维数…...

3.7寸按键翻页工牌

产品参数 产品型号 ESL_BWR3.7_BLE 产品尺寸 (mm) 62.51066.5 显示技术 E ink 显示区域 (mm) 47.32(H)81.12(V) 分辨率 (像素) 280480 像素尺寸(mm) 0.1690.169 150dpi 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 500mAh ( Type-C 充电…...

西北工业大学大学物理(II)选填解析2019-2020期末

2 又是考查“一个电子和一个光子具有相同的波长,则二者动量相等。”4 斯特恩盖拉赫实验,原子的自旋磁矩取向量子化。7 通常我们感受不到电子的波动性。因为其波长短,其实也就是粒子运动速率高。10 考查无限长直导线周围B分布。常见的模型要记…...

[计算机网络(第八版)]第一章 概述(章节测试/章节作业)

随堂作业 练习版(无答案版) 1.2 因特网概述 1【单选题】因特网的前身是1969年创建的第一个分组交换网 A、internetB、InternetC、NSFNETD、ARPANET 2【单选题】因特网采用的核心技术是 A、TCP/IPB、局域网技术C、远程通信技术D、光纤技术 1.3 三种交换方式:电路…...

华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典

文章目录2023 年用 Python 语言解华为 OD 机试题,一篇博客找全。华为 OD 机试题清单(机试题库还在逐日更新)2023 年用 Python 语言解华为 OD 机试题,一篇博客找全。 在 2023 年,Python 已成为广泛使用的编程语言之一&…...

电子科技大学数据库与软件工程三

适用于网工和物联网专业 目录 一、实验目的 二、实验内容 三、实验软件 四、实验步骤及数据记录 1.子查询 2. 伪列 3.数据库对象 4. 块、存储过程和触发器 五、实验结论及思考题 实验结论: 思考题: 六、总结及心得体会 七、对本实验过程及方…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

使用ch340继电器完成随机断电测试

前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...

循环语句之while

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为&#xff1a; i); i i 1; } 下面的例子是一个无限循环&#xff0c;因…...

GC1808:高性能音频ADC的卓越之选

在音频处理领域&#xff0c;高质量的音频模数转换器&#xff08;ADC&#xff09;是实现精准音频数字化的关键。GC1808&#xff0c;一款96kHz、24bit立体声音频ADC&#xff0c;以其卓越的性能和高性价比脱颖而出&#xff0c;成为众多音频设备制造商的理想选择。 GC1808集成了64倍…...