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

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

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 捎带ACKdrop samplereturn
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*mssreset_timer(RTO_MIN - rto) // 可能真的发生了 Delay ACK,回退到原本
elselost_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。

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

相关文章:

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

TCP 对 RTO 有个最小值限制&#xff0c;一般限制为 MIN_RTO 200ms。之所以有这个限制&#xff0c;在于要适应 Delay ACK&#xff0c;而 Delay ACK 的意义&#xff0c;不多说&#xff0c;摘自 RFC1122&#xff1a; MIN_RTO 应该足够大&#xff0c;以覆盖 Delay ACK 的影响&…...

MySQL与常见面试题

目录 事务概述ACIDAUTOCOMMIT总结并发一致性问题丢失修改读脏数据不可重复读幻读原因和解决方法隔离级别未提交读(READ UNCOMMITTED)提交读(READ COMMITTED)可重复读(REPEATABLE READ)可串行化(SERIALIZABLE)加锁封锁粒度封锁类型读写锁意向锁...

FFmpeg进阶: 采用音频滤镜对音频进行转码

文章目录采样位数采样率声道布局码率使用FFmpeg音频滤镜进行转码参考链接很多时候为了让视频文件适应不同的播放领域&#xff0c;我们需要对音频文件进行转码操作&#xff0c;转码操作其实主要就是修改音频文件的各种参数包括:采样位数、采样率、音频布局、码率等等。下面分别介…...

C++:AVL树

AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下&#xff0c;时间复杂度为O&#xff08;N&#xff09;&#xff1b; 两位俄罗斯的数学家G.M.Ade…...

Docker中安装Oracle-12c

前言 MySQL和Oracle是开发中常用到的两个关系型数据库管理系统&#xff0c;接上一期内容&#xff0c;这一期在Docker中完成oracle-12c的安装和配置。 安装oracle-12c 1、拉取oracle-12c镜像 启动Docker Desktop后在cmd窗口中执行docker search oracle命令&#xff0c;搜索O…...

教你如何用Python分析出选注双色球号码

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 数据集介绍 找从19年到现在的开奖历史数据&#xff0c;我们首先要把这个历史数据拿到&#xff0c; 拿到我们再进行做分析&#xff0c;分析每个号码出现的频率是多少&#xff0c; 哪个多&#x…...

elasticsearch映射及字段类型

查询映射关系类型上对字段的类型进行映射&#xff0c;我们前面知道可以通过get方法请求_mapping查询指定类型的映射关系&#xff1a;此语句可以查询get-together索引下的group类型的映射关系更新映射关系使用put方法可以更新类型的映射这里指定了new-events类型的字段映射关系&…...

1493围圈报数(队列)

题目描述 有&#xff4e;个人依次围成一圈&#xff0c;从第&#xff11;个人开始报数&#xff0c;数到第&#xff4d;个人出列&#xff0c;然后从出列的下一个人开始报数&#xff0c;数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部出列为止。…...

【ArcGIS Pro二次开发】(2):创建一个Add-in项目

Add-In即模块加载项&#xff0c;是一种能够快速扩展桌面应用程序功能的全新扩展方式。 一、创建新项目 1、打开VS2002&#xff0c;选择创建新项目。 2、在搜索框中输入“arcgis pro”&#xff0c;在搜索结果中选择【ArcGIS Pro 模块加载项】创建项目&#xff0c;注意选择语言应…...

浏览器缓存是如何提升网站访问速度的

提升速度&#xff0c;降低负载 浏览器访问一个页面时&#xff0c;会请求加载HTML、CSS和JS等静态资源&#xff0c;并把这些内容渲染到屏幕上。 对浏览器来说&#xff0c;如果页面没有更新&#xff0c;每次都去请求服务器是没有必要的。所以&#xff0c;把下载的资源缓存起来&…...

Linux中几个在终端中有趣的命令

uhh…最近我不知道该更新些什么&#xff0c;所以就更新Linux几个很有趣的命令 文章目录前言1.命令&#xff1a;sl安装 sl输出2. 命令&#xff1a;telnet命令&#xff1a;fortune安装fortune4.命令&#xff1a;rev&#xff08;反转&#xff09;安装rev5. 命令&#xff1a;factor…...

快来来试试SpringBoot3 中的新玩意~

你还在用OpenFeign嘛&#xff1f;快来试试 SpringBoot3 中的这个新玩意&#xff01;声明式HTTP调用 1、由来 Spring Boot3 去年底就已经正式发布&#xff0c;我也尝了一把鲜&#xff0c;最近有空会和小伙伴们慢慢聊聊 Spring Boot3 都给我们带来了哪些新东西。 今天我们就先…...

【寻人启事】达坦科技持续招人ing

​​​​​​​ ❤️一起来探索前沿科技&#xff0c;做有意思的事情~ 我们是谁 达坦科技&#xff08;DatenLord&#xff09;专注于打造新一代开源跨云存储平台。通过软硬件深度融合的方式打通云云壁垒&#xff0c;实现无限制跨云存储、跨云联通&#xff0c;建立海量异地、异构…...

【C/C++基础练习题】简单函数练习题

&#x1f349;内容专栏&#xff1a;【C/C要打好基础啊】 &#x1f349;本文内容&#xff1a;简单函数使用练习题&#xff08;复习之前写过的实验报告&#xff09; &#x1f349;本文作者&#xff1a;Melon西西 &#x1f349;发布时间 &#xff1a;2023.2.11 目录 1.给定某个年…...

【代码随想录训练营】【Day11】第五章|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值

20. 有效的括号 题目详细&#xff1a;LeetCode.20 由题可知&#xff0c;有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 那么&#xff0c;我们可以利用栈后进先出的特点&#x…...

基于云原生分布式存储ceph实现k8s数据持久化

文章目录1、初始化集群1.1 集群机器配置1.2 配置主机名1.3 配置hosts文件1.4、配置互信1.5、关闭防火墙1.6、关闭selinux1.7、配置Ceph安装源1.8、配置时间同步1.9、安装基础软件包2、安装ceph集群2.1 安装ceph-deploy2.2 创建monitor节点2.3 安装ceph-monitor2.4 部署osd服务2…...

SpringMVC获取请求参数

SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的报文对象。 RequestMapping("/testServletAPI") // request表示当前请求 public String testServletAPI(H…...

详解浏览器从输入URL到页面展示的过程

用户发出 URL 请求到页面开始解析的这个过程&#xff0c;就叫做导航。 1. 用户输入 当用户在地址栏中输入一个查询关键字时&#xff0c;地址栏会判断输入的关键字是搜索内容&#xff0c;还是请求的 URL。 当用户输入关键字并键入回车之后&#xff0c;这意味着当前页面即将要…...

【吉先生的Java全栈之路】

吉士先生Java全栈学习路线&#x1f9e1;第一阶段Java基础: 在第一阶段:我们要认真听讲,因为基础很重要!基础很重要!基础很重要!!! 重要的事情说三遍。在这里我们先学JavaSE路线&#xff1b;学完之后我们要去学第一个可视化组件编程《GUI》&#xff1b;然后写个《贪吃蛇》游戏耍…...

第二章 Opencv图像处理基本操作

目录1.读取图像1-1.imread()方法2.显示图像2-1.imshow()方法2-2.waitKey()方法2-3.destroyAllWindows()方法2-4.小总结3.保存图像3-1.imwrite()方法4.查看图像属性4-1.常见的三个图像属性1.读取图像 要对一幅图像进行处理&#xff0c;第一件事就是要读取这幅图像。 1-1.imread(…...

字节一面:在浏览器地址栏输入一个 URL 后回车,背后发生了什么?

近段时间&#xff0c;有小伙伴面试字节&#xff0c;说遇到一个面试题&#xff1a; 在浏览器地址栏输入一个 URL 后回车&#xff0c;背后发生了什么&#xff1f; 这里尼恩给大家做一下系统化、体系化的梳理&#xff0c;使得大家可以充分展示一下大家雄厚的 “技术肌肉”&#xf…...

推荐3dMax三维设计十大插件

3dMax是一款功能非常强大的三维设计软件&#xff0c;但无论它的功能多么强大&#xff0c;也不可能包含所有三维方面的功能&#xff0c;这时候&#xff0c;第三方插件可以很好的弥补和增强3dMax的基本功能&#xff0c;下面就给大家介绍十款非常不错的3dMax插件。 森林包&#xf…...

Arduino IDE 2.0.6中 ESP32开发环境搭建笔记

Arduino IDE 2.0.6中 ESP32开发环境搭建 Arduino IDE2.0 已上线一段时间&#xff0c;以后ESP32的学习转至新的IDE中 &#xff0c;需对开发环境进行。 Arduino IDE&#xff12;.&#xff10;与&#xff11;.&#xff10;有很大差异。原来环境搭建方法已完全不同。下文主要记录环…...

商品秒杀接口压测及优化

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

NFC 项目前期准备工作

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 了解项目信息,FAE联系方式,驱动源码等驱动合入内核配置DTS驱动设备节点验证Push nf…...

(C语言)数据的存储

问&#xff1a;1. 数据类型有哪五大类&#xff1f;2. 数据类型的作用是什么与什么&#xff1f;3. 整型又可以具体分为哪五个&#xff1f;为什么字符char也归属于整型&#xff1f;4. 浮点型又可以具体分为哪两类&#xff1f;5. 构造类型就是什么&#xff1f;具体分为哪四类&…...

C语言深度剖析之文件操作

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注加关注 &#x1f31e; 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文…...

RNN神经网络初探

目录1. 神经网络与未来智能2. 回顾数据维度和神经网络1. 神经网络与未来智能 2. 回顾数据维度和神经网络 循环神经网络&#xff0c;主要用来处理时序的数据&#xff0c;它对每个词的顺序是有要求的。 循环神经网络如何保存记忆功能&#xff1f; 当前样本只有 3 个特征&#x…...

【flinkx】【hdfs】【ing】Cannot obtain block length for LocatedBlock

一. 任务描述 使用flinkx去跑HDFS到HIVE的任务时&#xff0c;出现如下报错&#xff1a; CannotObtainBlockLengthException com.dtstack.flinkx.throwable.FlinkxRuntimeException: cant get file size from hdfs, file hdfs://xxx/.data/540240453caeb6fe4b3f118410a05315_2…...

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

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

西安年网站建设/重庆网站建设与制作

基于springboot和vue实现地方美食分享网站演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包…...

网站建设策划书的撰写/seo推广优化外包公司

--来自WEB开发者 我收集了很多编程语录&#xff0c;基本上都跟程序员的生活有关。这些语录涉及软件开发&#xff0c;代码维护&#xff0c;调试纠错&#xff0c;软件bug&#xff0c;系统设计、文档&#xff0c;代码质量&#xff0c;测试和软件开发团队管理等方面。下面的这59条语…...

阿里云 个人网站备案/谷歌浏览器安卓下载

简析-commonJS&AMD&CMD 大概说下三者区别: 历史流水线&#xff1a; CommonJS ---> AMD ---> CMD 共同点&#xff1a; 都是使用字符串命名方式&#xff0c;让模块作用域只存在于当前模块作用域内&#xff0c;解决了命名空间的问题&#xff0c;且遵循一个模块代表一…...

保定全员核酸检测/太原整站优化排名外包

本篇文章是对MySQL游标的具体使用进行了详细的分析介绍&#xff0c;需要的朋友参考下测试表 level 代码如下: create table test.level (name varchar(20)); 再 insert 些数据 ;初始化 代码如下: drop procedure if exists useCursor // 建立 存储过程 create代码如下: CREATE…...

传媒公司 网站开发/青岛seo关键字排名

平时工作中公司发的一些文件资料都会添加上水印&#xff0c;为了防止资料泄密外传&#xff0c;所以加水印能让员工知道资料的重要性&#xff0c;那么在Word中加水印很简单&#xff0c;但是换做是Excel表呢&#xff1f;有人说在Excel中是无法添加水印了&#xff0c;其实是可以的…...

网站模块建设中/手机端关键词排名优化

https://github.com/kformeck89/Mirror https://github.com/toidiu/Mirror转载于:https://www.cnblogs.com/eustoma/p/4469161.html...