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

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题,闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。

TLP,先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO,但如果 sender 发送的一系列数据包中尾包被丢弃,就没有触发 dupack,sack 的可能,于是就有了 TLP,它的目的是在原始序列被丢了尾部没有机会触发 FR 时通过发送探测包来触发 FR,避免跌入 RTO。

那么问题就是如何选择探测包。

如果有新数据,当然以发送新数据为主,如果没有新数据,则重传队列中最后一个报文,如果该探测包能顺利到达对端,可以覆盖所有的丢包场景,触发 FR,draft 中总结了所有的几种情况,如下:

       number of  scoreboard afterlosses     TLP retrans ACKed mechanism           final outcome--------   ----------------- -----------------   -------------(1) AAAL       AAAA              TLP loss detection  all repaired(2) AALL       AALS              early retransmit    all repaired(3) ALLL       ALLS              early retransmit    all repaired(4) LLLL       LLLS              FACK fast recovery  all repaired(5) >=5 L      ..LS              FACK fast recovery  all repairedkey:A = ACKed segmentL = lost segmentS = SACKed segment

无论如何,紧着越后面的数据包发送,可避免重传浪费,最值得注意的是,TLP 的核心目标是通过这次探测来诱导对端携带足够的 sack 以触发 FR,ER,enhanced ER(这些不再赘述,详见 TCP-TLP,ER),而不是通过这次探测来补洞。核心一句话,它的目的不是重传,而是探测。

相反,TLP 还要额外区分成功捎带的重传。如果发送的是新数据,该新数据诱导了对端足够的 sack 并触发了 FR,那么没有任何无用功,但如果没有新数据,重传了队列中最后一个数据包,而该数据包恰好补足了空洞,它没有触发 FR,但确实发生了丢包恢复,按照 congestion control 原则,此时应该执行收敛降窗动作:ssthresh = β*cwnd & cwnd = ssthresh。

因此要识别这种探测补洞,以满足并执行拥塞控制收敛原则,即降窗。

用新数据进行探测当然无需任何额外检查,因为它并没有重传任何东西,需要检查的是重传最后一个数据包的情形。TLP draft 没有规定重传探测包发送的次数,但限制在 2(约数,为什么不是 3?) 次以内:

   (2) Conditions for scheduling PTO:...(c) Number of consecutive PTOs <= 2.(3) When PTO fires:...(d) If conditions in (2) are satisfied:-> Reschedule next PTO.Else:-> Rearm RTO to fire at epoch 'now+RTO'.

这意味着它可以发送好多遍,这就需要计数器管理这些重传探测包的功效,即是否发生了补洞。只要有一次发生了补洞,就应该执行收敛降窗。

那么如何界定检查时机,draft 规定 after(ack, TLPHighRxt) 是合理的,如果不满足,可能马上下一个 ack = HighRxt 就来了,至于何时,又不好确定,因此 ack 越过 HighRxt 就很合理,在此之前,通过下面的规则计数 TLPRtxOut:

   (3) Upon sending a TLP retransmission:if (TLPRtxOut == 0)TLPHighRxt = SND.NXT;TLPRtxOut++;(4) Upon receiving an ACK:(a) Tracking ACKsWe define a "TLP dupack" as a dupack that has all the regularproperties of a dupack that can trigger fast retransmit, plus the ACKacknowledges TLPHighRxt, and the ACK carries no new SACK information(as noted earlier, TLP requires that the receiver supports SACK).This is the kind of ACK we expect to see for a TLP transmission ifthere were no losses.  More precisely, the TLP sender considers a TLPprobe segment as acknowledged if all of the following conditions aremet:(a) TLPRtxOut > 0(b) SEG.ACK == TLPHighRxt(c) the segment contains no SACK blocks for sequence rangesabove TLPHighRxt(d) the ACK does not advance SND.UNA(e) the segment contains no data(f) the segment is not a window updateIf all of those conditions are met, then the sender executes thefollowing:TLPRtxOut--;

最后,当满足 after(ack, TLPHighRxt),只要 TLPRtxOut > 0,就执行降窗:ssthresh = β*cwnd & cwnd = ssthresh。

为了一碟醋,包了一顿饺子,这个判定 “是否探测包补足了空洞” 过程有点复杂,着实让人觉得有什么深意,但理解了 TLP 的根本目的就觉得其实没什么大不了的。在大多数情况下,TLP 探测后带来足够的 sack 足以触发 FR,丢包重传流程自然交给 FR,只有在极小概率下,即这个重传探测包恰好补足了空洞,且恰好只有重传探测包这一个包丢失的情形下,这一大坨才起作用。

所以说回到写这篇文章最初的原因,为什么 Linux TCP 没有实现多次重传探测,而仅仅实现了一次(这是允许的):

   Implementations MAY use one or two consecutive PTOs.

我以为 Linux 是对的,首先这种复杂判定发生的概率并不高,其次它的实现非常复杂,特别是定时器管理。如果一次 PTO 超时都没能搞定尾部丢包问题,再来一次大概率还是无解,不如交给 RTO 兜底更加简洁,所以你会发现Linux TLP 的实现非常简单,核心十几行代码就完事了。
再者说,TCP 非常难以精确区别原始包和重传包,以至于 TLP 必须谨慎行事:

(5) Senders must only send a TLP loss probe retransmission if all theconditions from section 2.1 are met and the following condition alsoholds:(TLPRtxOut == 0) || (SND.NXT == TLPHighRxt)This ensures that there is at most one sequence range withoutstanding TLP retransmissions.  The sender maintains this invariantso that there is at most one TLP retransmission "episode" happeningat a time, so that the sender can use the algorithm described abovein this section to determine when the episode is over, and thus whenit can infer whether any data segments were lost.

而 QUIC 做这件事非常简单,QUIC 对每包编号,可轻松区别一次重传是不是无效的,因此它的实现就非常简单,多一行代码不多,这又是结构决定行为的例子。

最后,说说 TLP 初衷。

较大的 RTO 通常是由测量 RTT 的差异引起,这在无线环境和低密度统计复用环境尤其明显。大 RTO 造成了统计长尾。但简单减少 RTO 时间并不能解决问题。首先,它增加了统计意义上虚假重传,其次,更重要的是,RTO 一旦发生,将极大影响性能。这对现代 TCP 传输影响巨大,在此背景下,TLP 是对 RTO 的精细化优化,它做了更多的事,以避免 RTO 发生。当然,这又是一次买卖。

   To get a sense of just how long the RTOs are in relation toconnection RTTs, following is the distribution of RTO/RTT values onGoogle Web servers. [percentile, RTO/RTT]: 50th percentile, 4.375th percentile, 11.390th percentile, 28.995th percentile, 53.999th percentile, 214  Large RTOs, typically caused by variance in measured RTTs, can be a result of intermediate queuing, and service variability in mobile channels.  Such large RTOs make a huge contribution to the long tail on the latency statistics of short flows.  Note that simply reducing the length of RTO does not address the latency problem for two reasons: first, it increases the chances of spurious retransmissions.  Second and more importantly, an RTO reduces TCP's congestion window to one and forces a slow start. Recovery of losses without relying primarily on the RTO mechanism is beneficial for short TCP transfers.

今天除夕夜,祝各位经理和工人,新年快乐!

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

相关文章:

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…...

linux学习之网络编程

一、两个模型及其对应关系 OSI七层模型 TCP/IP 四层模型 -------------------------------------------------------------------------- 应用层 表示层 ----> …...

scrol家族 offset家族 client家族学习

Scroll 系列属性 scrollTop & scrollLeft scrollTop: 返回元素的内容已向上滚动的部分的高度。scrollLeft: 返回元素的内容已向左滚动的部分的宽度。 scrollHeight & scrollWidth scrollHeight: 返回元素的实际高度&#xff0c;包括由于溢出而在屏幕上不可见的内容…...

css-background-color(transparent)

1.前言 在 CSS 中&#xff0c;background-color 属性用于设置元素的背景颜色。除了基本的颜色值&#xff08;如 red、blue 等&#xff09;和十六进制颜色值&#xff08;如 #FF0000、#0000FF 等&#xff09;&#xff0c;还有一些特殊的属性值可以用来设置背景颜色。 2.backgrou…...

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格&#xff0c;并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码&#xff08;部分&#xff09; 本文测试代码已上传&#xff0c;路径如下&#xff…...

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…...

gradle和maven的区别以及怎么选择使用它们

目录 区别 1. 配置方式 2. 依赖管理 3. 构建性能 4. 灵活性和扩展性 5. 多项目构建 如何选择使用 选择 Maven 的场景 选择 Gradle 的场景 区别 1. 配置方式 Maven&#xff1a; 使用基于 XML 的 pom.xml 文件进行配置。所有的项目信息、依赖管理、构建插件等都在这个文…...

360大数据面试题及参考答案

数据清理有哪些方法? 数据清理是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。常见的数据清理方法有以下几种: 去重处理:数据中可能存在重复的记录,这不仅会占用存储空间,还可能影响分析结果。通过对比每条记录的关键属性,若所有关键…...

Myeclipse最新版本 C1 2019.4.0

Myeclipse C1 2019.4.0下载地址&#xff1a;链接: https://pan.baidu.com/s/1MbOMLewvAdemoQ4FNfL9pQ 提取码: tmf6 1.1、什么是集成开发环境? ★集成开发环境讲究-站式开发&#xff0c;使用这个工具即可。有提示功能&#xff0c;有自动纠错功能。 ★集成开发环境可以让软件开…...

MySQL 9.2.0 的功能

MySQL 9.2.0 的功能 MySQL 9.2.0 的功能新增、弃用和删除内容如下&#xff1a; 新增功能 权限新增12&#xff1a;引入了CREATE_SPATIAL_REFERENCE_SYSTEM权限&#xff0c;拥有该权限的用户可执行CREATE SPATIAL REFERENCE SYSTEM、CREATE OR REPLACE SPATIAL REFERENCE SYSTEM…...

接口 V2 完善:分布式环境下的 WebSocket 实现与 Token 校验

&#x1f3af; 本文档详细介绍了如何使用WebSocket协议优化客户端与服务端之间的通信&#xff0c;特别是在处理异步订单创建通知的场景中。通过引入WebSocket代替传统的HTTP请求-响应模式&#xff0c;实现了服务器主动向客户端推送数据的功能&#xff0c;极大地提高了实时性和效…...

微前端架构在前端开发中的实践与挑战

随着单页面应用&#xff08;SPA&#xff09;和前端框架如 React、Vue、Angular 的快速发展&#xff0c;现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时&#xff0c;单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战&#xff0c;微前端架构…...

【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】

天气时钟&#xff1a;软硬件准备、串口模块开发 软硬件准备接线及模块划分ESP8266开发板引脚图软件准备 串口模块编写串口介绍Serial库介绍 近期跟着网上一些教学视频&#xff0c;编写了一个天气时钟&#xff0c;本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件…...

macbook安装go语言

通过brew来安装go语言 使用brew命令时&#xff0c;一般都会通过brew search看看有哪些版本 brew search go执行后&#xff0c;返回了一堆内容&#xff0c;最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…...

代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换

太难了 但听了前面再听这道题感觉递推公式也不是不难理解 动规五部曲 dp[j]代表装满容量为j&#xff08;也就是目标值&#xff09;的背包最少物品数量递推公式&#xff1a;dp[j] std::min(dp[j], dp[j - coins[i]] 1)当使用coins[i]这张纸币时&#xff0c;要向前找到容量为…...

小阿卡纳牌

小阿卡纳牌 风&#xff1a;热湿 火&#xff1a;热干 水&#xff1a;冷湿 土&#xff1a;冷干 火风&#xff1a;温度相同&#xff0c;但是湿度不同&#xff0c;二人可能会在短期内十分热情&#xff0c;但是等待热情消退之后&#xff0c;会趋于平淡。 湿度相同、温度不同&#x…...

DDD 和 TDD

领域驱动设计&#xff08;DDD&#xff09; DDD 是一种软件开发方法&#xff0c;强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合&#xff0c;以便更好地解决复杂的业务问题。 DDD 的关键概念&#xff1a; 1. 领域模型 …...

Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)

JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中&#xff0c;插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下&#xff1a; INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名&#xff1a;需要插入记录的表的名称。列1, 列2, …,…...

Linux文件基本操作

Linux 的设计哲学 在 Linux 中&#xff0c;一切皆文件&#xff01; 什么是文件&#xff1f; 文件是具有永久存储性&#xff0c;按特定字节顺序组成的命名数据集 文件可分为&#xff1a;文本文件&#xff0c;二进制文件 文本文件&#xff1a;每个文件存放一个 ASCII 码 存储…...

React 路由导航与传参详解

随着单页面应用&#xff08;SPA&#xff09;已经成为主流。React 作为最流行的前端框架之一&#xff0c;提供了强大的路由管理工具 react-router-dom&#xff0c;帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...