数据中心的 TCP-Delay ACK 与 RTO, RACK

news2024/11/16 22:19:32

TCP 对 RTO 有个最小值限制,一般限制为 MIN_RTO = 200ms。之所以有这个限制,在于要适应 Delay ACK,而 Delay ACK 的意义,不多说,摘自 RFC1122:
在这里插入图片描述
MIN_RTO 应该足够大,以覆盖 Delay ACK 的影响,如果 RTO 过小将导致过多不必要的超时重传。但又不能过大,否则将导致超时重传不及时。

这个限制在广域网不存在什么问题。广域网 RTT 一般为几十 ms 量级,200ms 的最小超时时间没有任何问题。但当 TCP 运行在数据中心时,200ms 超时时间是一段相当漫长的等待。50us 是典型的 DC 网络 RTT,4000 倍于 RTT 的等待是不合理的。但又不能在 sender 轻易取消 MIN_RTO 的限制。

DC 内部,RTO 有 MIN 限制,sender 超时重传不及时,取消了该限制,万一碰到真的 Delay ACK,又会频繁虚假超时,TLP 只能解决尾丢的部分问题,一旦 RTO 兜底,还是会进入漫长等待。取消限制也不是,不取消限制也不是。
在所有 receiver 端取消 Delay ACK 是几乎不可能的,要么就在 sender 识别 Delayed ACK,Linux TCP 已经有了一种方式:

if (pkts_acked == 1 && last_in_flight < tp->mss_cache &&
        last_in_flight && !prior_sacked && fully_acked &&
        sack->rate->prior_delivered + 1 == tp->delivered &&
        !(flag & (FLAG_CA_ALERT | FLAG_SYN_ACKED))) {
        /* Conservatively mark a delayed ACK. It's typically
        * from a lone runt packet over the round trip to
        * a receiver w/o out-of-order or CE events.
        */
        flag |= FLAG_ACK_MAYBE_DELAYED;
}

但即使识别到了,Linux TCP 也没有用这个 flag bit 做更多的事,因为有很多规范要遵守。但如果遵守这些规范,就注定要在 Delay ACK 和 RTO 的纷乱复杂的关联中纠缠。

本质在于,根据 Delay ACK 计算得到 1/8 rtt sample 以及 4*rttvar 已成了噪声,正常的做法,在计算 RTT 时应该排除掉它们,或至少限制它们,而不是限制 RTO。

为此,我建议一种更准确的 RTT 计算方法以及 RTO 的行为。

首先,我们换一种方式获取样本:
在这里插入图片描述

依上图解释,若要排除 Delay ACK 的影响,只有 ca_rtt 是唯一有效的样本,但当前 Linux TCP 却采用 seq_rtt,这里的逻辑要修改。同时,因为捎带 ACK 的主机时延不确定,要把捎带 ACK 排除掉,如果双向传输,我这个方法会导致 RTT 样本过少。

假设单向传输(绝大多数场景),以 ca_rtt 作为样本计算 RTT 和 RTO,取消 MIN_RTO 限制,算出来多少就是多少,注意,RTO 已经是 us 精度(在实现上可能会消耗过多 CPU 资源,具体尚未测试):

if (seq_rtt == ca_rtt >= 40ms || MAYBE_DELAYED)
    drop sample 
    return 
else if (PUREACK && seq_rtt > ca_rtt)
    take ca_rtt
else if (SACK)
    take ca_rtt
else if 捎带ACK
    drop sample
    return
else
    ?(可能还有一些没考虑到的...)

rtt = 7/8*rtt + 1/8*ca_rtt
rttvar = 3/4*rttvar + 1/4*|rtt - ca_rtt|
rto = rtt + 4*rttvar

其实双向传输也无所谓,照样可以舍弃 Delayed ACK 以及捎带 ACK 带来的样本,因为它们带来的是噪声,如果觉得丢掉它们造成样本过少而心里不舒服(其实还是以为违背了标准实现,和 Linux TCP 实现不一样而导致心里不舒服…),那么换个视角,宁缺毋滥!

RTO 的动作需要分两个部分,算法如下:

if inflight < 2*mss
    reset_timer(RTO_MIN - rto) // 可能真的发生了 Delay ACK,回退到原本
else
    lost_retransmit 

至于对 cc 的影响,我认为没有影响,cc 本来就使用排除了主机时延的 ca_rtt 样本测量网络时延。

圆环闭合了,既解决了 RTO 重传不及时问题,又解决了真遇到 Delay ACK 但 RTO 过小导致的虚假超时问题。

这个 RTT/RTO 算法能否在 DC 网络上线不是取决于它有多自洽,而要基于 DC 网络 TCP 传输的统计特征。receiver 发送了多少 Delayed ACK,sender 预判了多少 Delayed ACK,如果这两个值均足够大且比值接近 1,就直接采用上述算法,若 receiver 稀有发送 Delay ACK,同时 sender 也鲜有收到 Delay ACK,则可直接去除 MIN_RTT 限制,大不了就虚假超时,频度不高影响就不大,相比增加逻辑复杂性,直接去掉限制更划算。

下面是一个简单的采集脚本,Python 简单分析下即可得统计特征,或者肉眼看也行:

#!/usr/local/bin/bpftrace

#include <net/sock.h>
#include <linux/tcp.h>

kprobe:tcp_ack_update_rtt
{
	$tcps = (struct tcp_sock *)arg0;
	if ($tcps->srtt_us>>3 > 500) {
	}
	else if (arg2 > arg4) {
		printf("normal: %d  %d  srtt:%d\n", arg2, arg4, $tcps->srtt_us>>3)
	}
	else if ($tcps->srtt_us == 0) {
	}
	else if (arg2 < 1000) {
	}
	else if (arg2 == -1) {
	}
	else if (arg3 != -1) {
	}
	else if (arg1 & 0x10000) {
		printf("delay: this:%d %d %d  srtt:%d\n", arg2, arg4, arg3, $tcps->srtt_us>>3);
	} else{
		printf(" %d  %d  srtt:%d\n", arg2, arg4, $tcps->srtt_us>>3)
	}
}

根据实际数据样本的统计特征做决策,比规划一个自洽闭环的算法更高尚。

TCP 的多个 timer 为网络不确定性提供弹性容错空间,而 DC 网络相比广域网有两个明显不同:DC 网络时延不确定性更低;DC 低时延网络使时延抖动更容易被放大。要针对这两个差异改造 DC 网络 TCP。

试想 RTT = 50ms 的广域网连接,发生了拥塞后,徒增排队时延 20ms,抖动为 0.4,但在 DC 网络,RTT = 50us 的连接,同样徒增排队时延 20ms,抖动就是 400。

如何修改 TCP 以适配这种表观差异?简单说就两点,压缩动态范围,排除固定时延。

首先要压缩弹性空间,使 RTO 的操作精度与 DC 网络的 RTT 精度同量级,从而可识别抖动,因此需要将 RTO 改为 us 级别。其次,尽可能消除除传播时延以外的其它时延,如 Delay ACK 时延,捎带 ACK 时延,这些时延取决于主机而非网络,在 DC 内,这些主机时延在整个 RTT 中占比很大,因此 ca_rtt 是更优秀的样本。

更进一步,在 DC 内网这特定场景,我想能统一重传触发了,不再区分 RTO,Fast Retransmit,TLP,全归于 RACK。当然,广域网也可以,只是没有 DC 内网这么迫切需要,现有 RTO + Fast Retransmit 工作得足够好。

针对 RACK,评述几句。

TCP 的 sender 以发送时间序对报文编号,receiver 对报文编号确认才合理,而非 sender 以字节流序列编号,receiver 对字节流序号确认。现实的 TCP 采用了后面不合理的方式,导致了不少麻烦。这个已经说了不止一遍。

RACK 对此尽力做了修正。

RACK 在 sender 端维护了一个按照发送时间序排序的队列,但它没对报文编号,因为没地方可编号,所以 receiver 自然没法针对编号进行确认。但至少 sender 有了一个发送时间序,该时间序将原始报文和重传报文都包含在内。

虽然 RACK 依旧无法区分 ACK/SACK 对针对谁的,但也只是影响 RTT 采样精度,至少 RACK 可以做到平滑重传,而不是像 dupthresh 那样只有一次重传机会。因此,RACK 可以作为一切重传的触发机制,而不仅仅应用于 fast retransmit,包括不限于 RTO,TLP。

甩开 Delay ACK 这个不确定时间后,就再也没有 RTO 过大问题,TLP 不再需要,以 RTO 界定的 “未来” 时间作为 RACK timer 的超时时间,便可对尾部传输做统一的安排,逻辑反而更简单。当然,RTO 的概念还是存在的。

你看,若不是 Delay ACK,TCP 超时重传多么直白。

当然,本文只是我的一个方法,该方法是单边方案,实现起来相对简单,十几行代码搞得定。Google 有一种更正式且中规中矩的方法,参见:TCP Options for Low Latency。

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

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

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

相关文章

【Day6】合并两个排序链表与合并k个已排序的链表,java代码实现

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f680;&#x1f680;&#x1f680;&#xff0c;今天与大家一起做两道牛客网的链表题&#xff0c;好久写关于链表题的博客了&#xff0c;这两道题可以帮大家巩固一下链表知识&#xff0c;我把两道题的链接放到下面&#xf…

【C++之容器篇】造轮子:模拟实现vector类

目录前言一、项目结构1. vector的简介2. 项目结构二、vector的底层结构三、默认成员函数1. 构造函数(1)无参构造函数2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数四、迭代器1. 普通对象的正向迭代器2. const 对象的正向迭代器五、容量接口1. size()2. capacity()3. reserv…

分布式-分布式理论笔记

分布式系统的特点 分布式系统技术就是用来解决集中式架构的性能瓶颈问题&#xff0c;来适应快速发展的业务规模&#xff0c;是建立在网络之上的硬件或者软件系统&#xff0c;彼此之间通过消息等方式进行通信和协调。 特点 具有可扩展性&#xff0c;不出现单点故障、服务或者…

Hadoop之——WordCount案例与执行本地jar包

目录 一、WordCount代码 (一)WordCount简介 1.wordcount.txt (二)WordCount的java代码 1.WordCountMapper 2.WordCountReduce 3.WordCountDriver (三)IDEA运行结果 (四)Hadoop运行wordcount 1.在HDFS上新建一个文件目录 2.新建一个文件&#xff0c;并上传至该目录下…

商品秒杀接口压测及优化

目录一、生成测试用户二、jmeter压测三、秒杀接口优化1、优化第一步&#xff1a;解决超卖2、优化第二步&#xff1a;Redis重复抢购3、优化第三步&#xff1a;Redis预减库存①商品初始化②预减库存一、生成测试用户 将UserUtils工具类导入到zmall-user模块中&#xff0c;运行生…

【STM32】【HAL库】遥控关灯1主机

相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 主机需要以下功能: 接收来自物联网平台的命令发送RF433信号给从机接收RF433信号和红外信号驱动舵机动作 方案设计…

【计算机网络期末复习】第二章 物理层

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为想复习学校计算机网络课程的同学提供重点大纲&#xff0c;帮助大家渡过期末考~ &#x1f4da;专栏地址&#xff1a; ❤️如果有收获的话&#xff0c;欢迎点…

Verilog语法之数学函数

Verilog-2005支持一些简单的数学函数&#xff0c;其参数的数据类型只能是integer和real型。 Integer型数学函数 $clog2是一个以2为底的对数函数&#xff0c;其结果向上取整&#xff0c;返回值典型的格式&#xff1a; integer result; result $clog2(n); 最典型的应用就是通过…

数据库(三):行锁和表锁,共享锁和排他锁,数据库引擎MyISAM和InnoDB,乐观锁和悲观锁

文章目录前言零、数据库引擎一、封锁粒度二、行锁三、表锁四、数据库中的属性锁4.2. 意向锁五、乐观锁和悲观锁总结前言 之前我们提到了数据库的隔离性可能会出现的若干问题&#xff0c;以及数据库为了解决这些问题而提出来的若干种隔离级别。实际上&#xff0c;数据库底层实现…

代码随想录算法训练营第二十七天|● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串

39. 组合总和 看完题后的思路 本题本质上还是一个传统排列题&#xff0c;不同之处在于每个元素可以重复选取。void f&#xff08;【】&#xff0c;startIndex&#xff0c;sum&#xff09;递归终止 if&#xff08;和target&#xff09;{ 加入&#xff1b; 返回&#xff1b; }递…

HTTPS为什么就安全了?我们做了什么?

目录 一 安全概念 二 HTTPS的安全措施 三 总结 一 安全概念 网络安全是一个比较笼统的概念。我们说网络安全的时候&#xff0c;往往会包含很多安全问题&#xff0c;包括网络设备层面、通信过程、数据本身等多方面引入的安全问题。比如设备被有意无意的破坏&#xff0c;链路…

微搭低代码从入门到精通-03 创建模型应用

我们在进行低代码开发的时候&#xff0c;第一个需要建立的概念就是应用。不管你开发的是小程序还是管理系统&#xff0c;最终的承载物就是应用。 而我们创建应用是一共可以创建两种类型的应用&#xff0c;自定义应用和模型应用。自定义应用对应着一页多端&#xff0c;你开发一…

【Hello Linux】 Linux的权限以及Shell原理

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…

【C++:STL之栈和队列 | 模拟实现 | 优先级队列 】

目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 2 栈的模拟实现 3 queue的介绍和使用 3.1 queue的介绍 3.2 queue的使用 4 queue的模拟实现 5 deque的介绍 5.1deque的原理介绍 5.2 deque的缺陷 5.3 为什么选择deque作为stack和queue的底层默认容器 6 p…

nodejs+vue+elementui在线求助系统vscode

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进…

加载sklearn covtype数据集出错 fetch_covtype() HTTPError: HTTP Error 403: Forbidden解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

微搭低代码从入门到精通07-基础布局组件

低码开发不同于传统开发&#xff0c;传统开发我们通常需要编写前端代码和后端代码。前端代码由HTML、CSS和JavaScript组成&#xff0c;后端代码我们通常要用后端语言比如Java来编写接口。 低码开发的特点是可视化开发&#xff0c;在编辑器中通过组件的拖拽来完成页面的编制。如…

莽村李青都看得懂的Vue响应式原理

Vue响应式原理八股文序违背老祖宗的决定将Vue响应式原理公众于世响应式数据&#xff08;Observe篇&#xff09;dom更新&#xff08;Wacther篇&#xff09;依赖收集八股文序 开篇来一段大家都会背诵的八股文。 某面试官&#xff1a; 请你简要介绍一下Vue的响应式原理。 答&am…

leaflet 读取上传的wkt文件,转换为geojson文件(示例代码056)

第056个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传WKT文件,解析wtk文件并转换为geojson,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式本示例所用的a.wkt示例源代码(共139行)…

AirServer在哪下载?如何免费使用教程

苹果手机投屏到电脑mac是怎么弄&#xff1f;你知道多少&#xff1f;相信大家对苹果手机投屏到电脑mac能在电脑上操作不是很了解&#xff0c;下面就让coco玛奇朵带大家一起了解一下教程。AIrServer是一款ios投屏到mac的专用软件&#xff0c;可将iOS上的音频&#xff0c;视频&…