当前位置: 首页 > 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. 块、存储过程和触发器 五、实验结论及思考题 实验结论: 思考题: 六、总结及心得体会 七、对本实验过程及方…...

华为开源自研AI框架昇思MindSpore数据变换:Transforms

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、数据变换 TransformsCommon TransformsComposeVision TransformsRescaleNormalizeHWC2CWHText TransformsBasicTokenizerLookupLambda Transforms通常情况下,直接加载的原始数据并不能直接送入…...

软件测试之边界值测试法

边界值测试法 1. 介绍 边界值分析法就是对输入或输出边界值进行测试的,也是一种黑盒测试. 边界值分析法通常作为等价类划分法的补充,其测试用例来自等价类的边界;长期的经验得知,大量的错误是发现在输入或输出范围的边界上,而不是发生再输入输出范围的内部&#…...

【华为OD机试模拟题】用 C++ 实现 - 最近的点(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明最近的点题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址…...

Qt windeployqt.exe 打包qml

Qt系列文章目录 文章目录Qt系列文章目录前言一、遇到的坑二、参考前言 我们在QtCreator下面开发程序,一般都会遇到工程发布给客户使用的情况。我们通常会使用Qt自带的打包工具:windeployqt.exe。 windeployqt.exe是Qt自带的工具,用于创建应用…...

【人脸识别】CurricularFace:自适应课程学习人脸识别损失函数

论文题目:《CurricularFace: Adaptive Curriculum Learning Loss for Deep Face Recognition》 论文地址:https://arxiv.org/pdf/2004.00288v1.pdf 代码地址:https://github.com/HuangYG123/CurricularFace 建议先了解下这篇文章&#xff1a…...

springmvc之rest风格(RESTFUL)

目录 一、介绍 1.什么是REST? 2.REST的实质 3.REST风格的优点 4.REST风格的缺点 3.什么是RESTful? 二、代码理解 一、介绍 1.什么是REST? 答:REST(Representational State Transfer) ,表现形式转…...

django项目实战十四(django+bootstrap实现增删改查)进阶混合数据使用modelform上传

目录 一、启用media 1、URL设置 2、settings.py配置 二、url 三、upload.py 新增upload_modelform方法 四、form.py新增UpModelForm 五、创建city表 六、创建city_list.html 接上一篇《django项目实战十三(djangobootstrap实现增删改查)进阶混合数据f…...

2023年CDGA考试模拟题库(1-100)

2023年CDGA考试模拟题库(1-100) 1.以下哪种活动中 ,混淆是不足以保护数据 的?[1分] A.数据共享 B.数据转换 C.数据脱敏 D.以上都正确 答案C 2.关于受控词表描述不正确的是?[1分] A.系统地组织文件档案和内容离不开受控词表 B.受控词表的一个例子是用于出版物分类的都…...

HTML常用基础内容总结

文章目录一、对HTML的感性认知前置知识什么是web前端,什么是web后端前端技术栈、后端技术栈开发与运行的区别浏览器的功能是什么简介写一个简单可运行的的html代码前端开发方式二、VSCode的简单使用三、常用的HTML标签最最基本的HTML结构HTML代码特点注释标签标题标…...

Gorm-学习笔记

1 基本使用 2 创建数据 2.1 如何使用Upsert 使用clause.OnConflict处理数据冲突 2.2 如何使用默认值 通过使用default标签为字段定义默认值 3 查询数据 3.1 First与Find 使用First时,需要注意查询不到数据会返回ErrRecordNotFound。 使用Find查询多条数据&#x…...