TCP系列15—重传—5、Linux中RTO的计算
之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法。在linux中维护了srtt、mdev、mdev_max、rttvar、rtt_seq几个状态变量用来计算RTO,其中linux实现中的mdev变量相当于协议中的RTTVAR变量。rtt_seq状态变量用来控制一个RTT时间窗,linux在一个RTT时间窗内部更新状态变量的方式与RTT时间窗结束更新状态变量的方式不同,rtt_seq则用来判断当前是在RTT时间窗内部,还是一个RTT时间窗已经结束。
一、RTT时间窗的判断
几个状态变量中的rtt_seq用来判断当前采样是否处于RTT时间窗内,我们简单的说一下如何判断
在TCP窗口管理时候维护发送窗口有两个状态变量,一个是snd.una,另外一个是snd.nxt。其中snd.una表示还没有被ACK确认的数据包里面最早的系列号,snd.nxt表示下一个待发送的数据包。初始的时候设置rtt_seq =snd.nxt,随着数据包的发送和ACK报文的接收,snd.una和snd.nxt都会向前滑行,当更新RTT状态变量的时候,如果发现snd.una<=rtt_seq,说明之前发送的数据包还没有收到ACK,当前还处于RTT时间窗内部。如果发现snd.una>rtt_seq说明之前发送的数据包已经收到了对应的ACK确认,那么一个RTT时间窗结束,并把rtt_seq设置为snd.nxt继续下一个RTT时间窗的处理。
二、状态变量的更新
1、在测量到第一个RTT采样之前,linux会先查看本地缓存中是否由目标ip地址的RTT缓存信息,如果由对应的缓存信息,则会根据缓存信息初始化RTO,如果没有对应的缓存信息,则会把RTO初始化为3s。
我们可以使用ip tcp_metrics查看有所缓存,也可以使用ip tcp_metrics show ip命令查看某个ip地址相关的缓存信息
******@Inspiron:~$ ip tcp_metrics show 121.201.104.55121.201.104.55 age 56.604sec cwnd 10 rtt 461481us rttvar 461481us source 192.168.1.103
srtt = mmddev = m/2rttvar = max(mdev, min_rto)mdev_max = rttvarRTO = srtt + 4 * rttvar
其中min_rto为该目标地址的最小RTT,如果路由中有配置那么使用配置值,如果没有配置则使用TCP_RTO_MIN,TCP_RTO_MIN常量为50ms(linux代码中这个常量为200ms实际为放大四倍后的值)。
3、在随后再次收到RTT测量值m的时候,按照如下更新mdev
if(m < (srtt - mdev))mdev = (31/32) * mdev + (1/32) * |srtt - m|elsemdev = (3/4) * mdev + (1/4) * |srtt - m|
我们之前说过linux实现中mdev变量相当于协议中的RTTVAR变量,这里mdev的更新与协议有了明显的不同,主要原因是如果链路时延突然大幅降低的时候,如果按照协议方法更新反而会大幅增加最后的RTO,因此linux在发现链路时延大幅下降的时候会降低RTO增长的幅度。其他状态变量更新如下
mdev_max = max(mdev_max, mdev)- srtt = (7/8) * srtt + (1/8) * m
- rttvar = mdev_max
- RTO = srtt + 4 * rttvar
4、根据rtt_seq来判断如果当前是RTT时间窗结束,则执行如下流程
if(mdev_max < rtt_var){rtt_var = (3/4) * rtt_var + (1/4) * mdev_max}mdev_max = min_rto
补充说明:
1、linux中在测量到第一个RTT采样之前RTO的初始化参考tcp_init_metrics,RTT相关状态变量的更新参考tcp_rtt_estimator,其中mdev放大4倍,srtt放大8倍进行的保存和计算。
TCP系列15—重传—5、Linux中RTO的计算的更多相关文章
- TCP系列13—重传—3、协议中RTO计算和RTO定时器维护
从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...
- TCP系列25—重传—15、DSACK虚假重传探测
一.DSACK介绍 RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容).RFC2 ...
- TCP系列12—重传—2、Linux超时重传引入示例
在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...
- TCP系列24—重传—14、F-RTO虚假重传探测
一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...
- TCP系列23—重传—13、RACK重传
一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...
- TCP系列18—重传—8、FACK及SACK reneging下的重传
一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...
- TCP系列16—重传—6、基础快速重传(Fast Retransmit)
一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...
- TCP系列26—重传—16、重组包
一.介绍 在TCP重传的时候,并没有限制TCP只能重传与初传完全相同的报文段大小,TCP允许执行重组包(repacketization),发送一个更大的TCP报文段,进而增加性能.TCP在重传时候允许 ...
- TCP系列21—重传—11、TLP
一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...
随机推荐
- django配置虚拟环境-1
目录 安装python 使用venv虚拟环境 使用Virtualenv虚拟环境 ### Windows安装 方案一 方案二 Linux安装 其他命令 安装django 安装python https:/ ...
- openwrt从0开始-目录
终于下定决心把近期的笔记整理一下.涉及到方方面面,记录自己的成长和沉淀自己所学. 预备知识:linux, 网络通信,待补充... 目录: 前言:openwrt简介 1. openwrt源码下载及编译环 ...
- lvs健康检查脚本第三版
如下是学习完马哥视频lvs后改写的健康检查脚本第三版.利用工作之余三四个小时时间才把整个逻辑搞清楚,有时候自己都有点蒙圈,尤其是在写到while循环的时候.总的来说非常感谢马哥的慷慨解囊!脚本原稿及思 ...
- C++的特点
C和C++ C主要是应用在在驱动层,是面向过程的编程语言,对类型的定义不是很严格.C++主要是应用与应用层,是C语言的一个加强版,可以完全兼容C语言,并且还有很多C语言不具备的特性,如,C++是一种面 ...
- 20145209刘一阳《JAVA程序设计》第1周学习总结
20145209刘一阳<JAVA程序设计>第1周学习总结 本周任务 了解Java基础知识 了解JVM.JRE与JDK,并下载.安装.测试JDK 了解PATH.CLASSPATH.SOURC ...
- Thymeleaf 模板引擎用法
学习.改良.极致 博客园 首页 新随笔 联系 管理 订阅 随笔- 31 文章- 0 评论- 50 Thymeleaf 常用属性 文章主目录 th:action th:each th:fiel ...
- crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)
crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy) 问题描述 在iOS game开发时做内存拷贝时出现了 crash:EXC_ARM_DA_ALIGN,debug版本不会出现, ...
- yarn 原理
产生背景 直接源于MRv1在几个方面的缺陷 扩展性受限(NameNode,JobTracker设计为单一节点,内存容量有限) 单点故障 难以支持MR之外的计算 slot数目无法动态修改,Map slo ...
- Selenium自动化测试第一天(下)
如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...
- Shader Forge学习
最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...