实现较低的计时器粒度以重传TCP(RTO):时间轮算法如何减少开销
《TCP/IP协议栈:TCP超时重传机制》
Table of Contents
计时器轮算法
使用计时器轮算法实现RTO
概要
AIX®传输控制协议(TCP)为每个连接维护七个计时器:
- 建立连接
- 重传
- 延迟确认(ACK)
- 持久
- 活着
- FIN_WAIT_2
- 时间的等待
为了实现这些每连接计时器,TCP使用提供两种粒度的全局计时器功能:
tcp_fasttimo
:每200毫秒调用一次,并实现快速计时器。tcp_slowtimo
:每500毫秒调用一次,并实现慢速计时器。
使用TCP的重传计时器实现,重传超时以tick单位存储在TCP的控制块中,其中一个tick = 500ms。当TCP的慢速计时器每500ms到期时, tcp_slowtimo
将被调用。该例程遍历TCP控制块表,并且对于每个连接,它将超时(以滴答为单位指定)减1。当计时器的滴答数达到零时,它将调用超时处理程序例程以处理该连接的相应超时。此实现对TCP计时器施加了500ms的下限。
如您所知,TCP根据TCP测量的往返时间动态计算超时。当前,TCP重传超时至少需要三秒钟。但是,对于诸如千兆以太网和10千兆以太网的高速网络,往返时间(因此重传超时)预计会大大降低。您未传输的每秒丢失每秒120MB的吞吐量。需要一种更好的方法来处理高速和低延迟网络。
使用重传计时器来实现较低粒度的一种方法是使用TCP的快速计时器(200毫秒),该计时器可以默认为50毫秒而不是200毫秒。这种方法的缺点是以较高的速率处理扫描所有协议控制块(PCB)的开销。PCB是保存连接控制信息的内部结构。本文介绍了一种基于计时器轮算法实现TCP重传计时器的替代方法。
计时器轮算法
同步轮有N个插槽。时隙代表时间单位,例如si
(时隙间隔)。计时轮中的光标会在每个时间单位上移动一个位置,就像时钟上的秒针一样。每当光标移动到某个插槽(例如cs
(当前插槽))时,它都意味着该插槽中的计时器列表(如果有)在该瞬间或在随后的周期中光标到达同一插槽时到期。
当ti
要将具有计时器间隔(例如(时间间隔))的新计时器添加到此转轮时,新计时器的插槽 ts
(计时器插槽)的计算如下:
ts = ( cs + (ti / si)) % N
假定任何计时器承担的最大计时器间隔值不超过上限(tmax
)。如果N足够大以适应tmax
当前光标位置的旋转,则当光标移动到特定插槽时,该插槽中的所有计时器都在同一时刻到期(没有后续周期)。这样可以避免遍历列表来检查哪些计时器现在到期,以及哪些计时器在随后的周期中到期。
例如,在 下面的图1所示的定时轮中,有8个插槽,从0到7。您将看到计时器条目已枢转到插槽1、3、5、4和6。当前,光标位于插槽1上。在该瞬间或当光标在随后的循环中到达相同的插槽时,枢转到该插槽的三个计时器将终止。
图1.正时轮
使用计时器轮算法实现RTO
本节说明在AIX上使用计时器轮算法的重传超时(RTO)实现。在AIX上,计时器轮中的插槽数选择为N = 7000。si
计时器轮实现的插槽间隔()可使用no
带有的选项进行配置timer_wheel_tick
。的值范围 timer_wheel_tick
是0到100个刻度,其中一个刻度= 10ms。因此,如果timer_wheel_tick
设置为1,例如10ms,则每个周期的计时器周期为N x si = 70秒。由于最大值(tmax
)(对于AIX TCP RTO是64秒),这足够大以确保插槽中的所有重传计时器在同一时间到期,而不是在随后的周期中到期。
RTO值可以使用no
带有选项的 配置tcp_low_rto
。的值范围tcp_low_rto
是0到3000毫秒。如果已配置,则将RTO值设置为系统上所有TCP连接的初始重传超时。
即使tcp_low_rto
已配置,该算法也只有在遇到丢包情况时才对连接生效,如下 图2所示。否则,使用此算法效率不高。在不经历数据包丢失的连接的传统重传计时器实现方法中,您要做的就是设置TCP控制块中的滴答数,以启动重传计时器。确认到达时,通过将该值设置为零来停止重传计时器。此方法最适合重传计时器永不过期的开始或停止情况。
您可以继续使用传统的重传计时器实现方法,直到出现以下任何一种情况:
- 重传计时器到期
- 快速重发阶段已打开以进行连接
图2.低粒度连接
A.触发低RTO功能
重传计时器第一次过期,直到连接成功, 或者快速重传阶段已打开。您为此连接的重传计时器启用较低的粒度,然后重新发送数据包。由于这是重传,因此您无需为此段计时,以进行响应时间跟踪(RTT)计算。通过将计时器插入计时器轮中的适当插槽来启动重传计时器。
B.确认收据
接收到对重发数据包的确认。取消重传计时器(从计时器轮上卸下计时器)。
C.时间段
按顺序发送一个段,'b'
然后启动重传计时器。您可以通过存储时间戳为RTT计算计时此段。通过将计时器插入计时器轮中的适当插槽来启动重传计时器。
D.处理在一个定时段收到的ACK
确认'c'
大于 'b'
收到的ACK 。您可以通过从计时器轮上卸下计时器来停止重传计时器。您将新RTT度量为当前时间减去'b'
发送带有序列的段时的存储时间戳 。测得的RTT用于计算新的重传超时值。
E.传输具有根据低RTO功能计算的RTO的段
重传计时器插入计时器轮的适当插槽中。
F.重传计时器到期
对于使用计时器轮算法的连接,重传计时器到期。光标将移至计时器轮中先前已插入重传计时器的插槽中。调用计时器处理例程以处理重传计时器到期。
概要
使用计时器轮方法,启动和停止计时器变得昂贵。如果将插槽中的计时器实现为链接列表,则必须使用插槽链锁同步在列表中添加计时器或从中删除计时器。
另一方面,使用定时器轮算法来实现重发定时器提供了减少每笔交易处理开销的优点。使用计时器轮时,插槽中只有那些计时器会在光标到达该计时器时到期。您无需扫描所有PCB即可检查为每个连接设置了哪个计时器。
较低的计时器粒度实现使管理员可以将RTO值配置为低至10ms。这对于运行在高速和低延迟网络(例如千兆位和10千兆位以太网)上的偶尔遇到丢包的TCP连接特别有用。
可下载资源
- 此内容的PDF
相关话题
- AIX和UNIX®:AIX和UNIX developerWorks专区提供了大量有关AIX系统管理的各个方面以及扩展UNIX技能的信息。
- AIX Wiki:发现有关AIX的技术信息的协作环境。
- 按主题搜索AIX和UNIX库:
- 系统管理
- 应用开发
- 性能
- 移植
- 安全
- 提示
- 工具和实用程序
- Java™技术
- Linux®
- 开源的
实现较低的计时器粒度以重传TCP(RTO):时间轮算法如何减少开销相关推荐
- 高性能计时器Timer的设计(时间轮和时间堆两种方式)
时间轮 前文提到,基于排序链表的定时器存在一个问题:添加定时器的效率偏低.一种简单的时间轮如图所示: 在这个时间轮中,实线指针指向轮子上的一个槽(slot).它以恒定的速度顺时针转动,每转动一步就指向 ...
- 约束优化:低维线性时间线性规划算法(Seidel算法)、低维线性时间严格凸二次规划算法
文章目录 约束优化:低维线性时间线性规划算法(Seidel算法).低维线性时间严格凸二次规划算法 带约束优化问题的定义 带约束优化问题的分类及时间复杂度 低维线性规划问题 定义 Seidel线性规划算 ...
- linux tcp 阻塞时间,TCP的阻塞和重传机制
网络拥堵 现在网络上大部分的网络请求都是以TCP的方式进行传输的了.网络链路是固定的,各种链路情况也是不一样的.网络拥堵一直是TCP协议设计和使用的时候尽力要避免的.比如,从TCP协议的网络包协议设计 ...
- #时间预测算法_基于超级学习者机器学习算法预测ICU患者急性低血压发作
点击"蓝字"关注,更多精彩内容! 背景 急性低血压发作(AHE),定义为平均动脉压下降至<65mmHg且至少持续5分钟,是重症监护病房(ICU)最严重的不良事件,往往导致重症 ...
- SQL Server时间粒度系列----第9节时间粒度示例演示
本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表 准备测试数据 为了提供不同时间粒度示例的演示,就需要测试数据 ...
- 8086汇编语言实现8253计时器对时且实时定点显示时间(全注释)
作为微机原理终极大作业的一部分,个人感觉这个模块是最难的,花了我一个晚上+一个上午.因为有计时中断,也没办法开调试,Debug难度上了一个新高度,而且有时代码一点没动,运行的结果还不一样,甚至会闪退卡 ...
- android低电量提示,Android P系统低电量提醒功能 根据使用情况判断充电时间
Android P系统是谷歌近几年以来变化最大的一个安卓系统,在I/O 2018上,谷歌已经正是宣布了Android P系统,并且面向vivo.OPPO.小米.一加.诺基亚等8个品牌的11款手机开放公 ...
- 计时器(视频的计时:时间码)
计时器 效果:时间码
- backtrader利用小时间粒度数据动态合成大时间粒度数据:replay功能
扫地僧backtrader技术教程获取方法 =========================== 看过我教程的同学都知道,backtrader中可以用重采样resample功能来将小粒度数据合成大粒 ...
最新文章
- WCF服务一:WCF服务简介
- Elasticsearch 在互联网公司大量真实的应用案例
- TfidfVectorizer(stop_words='english',ngram_range=(1,1))中ngram_range的意义
- 《啊哈!算法》笔记_Day02
- DCMTK:使用dcmsr API创建示例结构化报告
- Linux 网络层收发包流程及 Netfilter 框架浅析
- 第十二届蓝桥杯JavaB组省赛H题 杨辉三角形
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
- 代码分析-DataGrid实现自增列、单选、多选
- 计算机网络学习笔记(29. DNS概述)
- 【aspnetcore】模拟中间件处理请求的管道
- iOS 使用自定义字体
- 被Gartner评为十大安全技术的IAST是什么
- 二进制转十六进制的详细步骤
- 02H5C3-11. Nginx中部署静态网站
- Excel函数完整列表(Excel Function Full List)
- Ptyhon 入门:通过高德地图获取经纬度
- React-高级教程完整版
- 项目外包 质量把控从头理
- 怎么制作AI绘画?学会这几个技巧就能制作AI绘画
热门文章
- 文献阅读005【精读】
- English trip -- MC(情景课)3 C Do you have a sister?
- java 关于JDBC和DAO模式使用
- nyoj 作业题 dp
- 数据库设计 Assignment 02
- linux裁剪内核和移植,嵌入式Linux内核裁剪及移植的研究与实现
- usb连接不上 艾德克斯电源_工程师,USB与SPI之间如何通信?什么芯片方案可以实现...
- python怎么安装xlrd库_Python第三方库xlrd/xlwt的安装与读写Excel表格
- python登录验证程序_Python模拟用户登录验证
- mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...