之前我们介绍的都是协议中给出的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.55

121.201.104.55 age 56.604sec cwnd 10 rtt 461481us rttvar 461481us source 192.168.1.103

2、在linux测量到第一个RTT采样m的时候,按照如下初始化相关状态变量

srtt = m

mddev = m/2

rttvar = max(mdev, min_rto)

mdev_max = rttvar

RTO = 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|

else

mdev = (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

注意我在if判断后面加了一个大括号来强调,不管if条件是否为真,只要RTT时间窗结束就要初始化mdev_max为min_rto。

补充说明:

1、linux中在测量到第一个RTT采样之前RTO的初始化参考tcp_init_metrics,RTT相关状态变量的更新参考tcp_rtt_estimator,其中mdev放大4倍,srtt放大8倍进行的保存和计算。

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、基础快速重传&lpar;Fast Retransmit&rpar;

一.快速重传介绍 按照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超时进行重 ...

随机推荐

使用plsql创建表空间和用户

使用plsql创建oracle数据库的表空间和用户,并授权的语句.1.创建表空间:说明:datafile是指定创建位置,指向oracle数据库的默认位置:autoextend 设置容量为自动增长,50 ...

socket&period;io,命名空间

原文:http://www.cnblogs.com/xiezhengcai/p/3966263.html 命名空间 在api部分我们说io.connect('ws://103.31.201.154:5 ...

JavaWeb学习笔记——开发动态WEB资源(五)servlet身份验证

本工程的功能是实现Javaweb的servlet身份验证 一下是login.html文件中的代码

&lt ...

linux下查看电脑配置

1. 查看cpu ~$ cat /proc/cpuinfo 2. 查看内存占用 ~$ cat /proc/meminfo 3. 硬盘分区 $ cat /proc/partitions 4. ubunt ...

&lbrack;转&rsqb; gc tips&lpar;3&rpar;

rto初始化和计算_TCP系列15—重传—5、Linux中RTO的计算相关推荐

  1. rto初始化和计算_TCP系列13—重传—3、协议中RTO计算和RTO定时器维护

    从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...

  2. IT-标准化-系列-15.在VPC 2007中构建虚拟网络

    看过太多人使用VPC 看过太多人使用Microsoft (R) Virtual Server 2005 R2 看过太多人使用VMware Workstation 没见过有人你像我这样夸张过! 为构建虚 ...

  3. matlab kappa计算,MSA系列9:在使用交叉表法计算Kappa时,期望值是怎么计算出来的?...

    原标题:MSA系列9:在使用交叉表法计算Kappa时,期望值是怎么计算出来的? 在使用如下的交叉表法计算计数型测量系统的Kappa时,需要计算期望值,例如表中的15.7,34.3等数值. 这些期望值是 ...

  4. 如何利用计算机计算天数,如何应用Win10系统电脑中的计算器计算两个日期之间的天数?...

    如何应用Win10系统电脑中的计算器计算两个日期之间的天数? 相信很多小伙伴都有在使用windows10系统的电脑,其中的计算器如何才能用来计算两个日期之间的天数呢?方法很简单,下面小编就来为大家介绍 ...

  5. hive安装需要安装mysql区别_HIVE安装系列之一:在Linux中安装mysql,为其作为hive的metastore做准备...

    安装mysql的Linux机器是Centos6的系统,机器名字叫combanc05 mysql我采用的是5.5版本. 安装过程中需要解决新旧版的冲突问题,并允许mysql被远程访问.以便其作为hive ...

  6. linux中Grep常用的15个例子,Linux中Grep惯用的15个例子

    Linux中Grep常用的15个例子 Grep命令主要用于从文件中查找指定的字符串. 首先建一个demo_file: $ cat demo_file THIS LINE IS THE 1ST UPPE ...

  7. 请描述定时器初值的计算方式_单片机C语言编程中定时器初值计算的两种方法...

    单片机C语言编程中,定时器的初值对于初学者真的是比较不好计算,因此我总结了以下几种方法. 第1种方法: #define FOSC 11059200L //晶振的频率 #define TIMS (655 ...

  8. linux中脚本引入计算bc,linux BC命令行计算器

    1. 基本使用: $ bc <<< 5*4 20 $ bc <<< 5+4 9 $ bc <<< 5-4 1或者 $ echo "5*4 ...

  9. Access根据出生日期计算年龄_小技巧 | 在SPSS中根据出生日期计算年龄

    数据资料中收集了样本的出生日期,如何通过出生日期快速计算他们的当前年龄呢?本文将通过SPSS的自带案例数据集Employee data.sav进行操作步骤分享. 打开数据集 在SPSS中,选择文件 - ...

最新文章

  1. 解决oracle11g安装导致数据库无法自动搜集统计信息-转
  2. python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...
  3. 学python要考什么证-学python需要考证吗?
  4. mpvue+vant app搭建微信小程序
  5. Vue.js-Day04-PM【axios(安装、使用)】
  6. 点击SAP Fiori Launchpad某个tile后遇到的错误消息如何解决
  7. MIP 扩展组件开发手册
  8. linux ruby作用域,浅谈ruby语言中的一些概念(lambda, proc, block)
  9. 织梦++高级搜索php,织梦高级搜索页面advancedsearch.php调用自定义字段
  10. Win7 开启远程桌面
  11. DSF 洛谷 P1294 高手去散步
  12. 雅虎“贱卖”启示录:不创新,就只有被淘汰
  13. tomcat中运行PHP项目
  14. RabbitMQ的Queue详解;
  15. 基于Oneplus 7 Pro的Flyme9&MIUI12.5刷机教程
  16. 照片怎样变漫画图片?建议收藏这些方法
  17. 测试透射晶格分析的软件,透射电镜(TEM)电子衍射在晶体结构分析中的应用
  18. 打印功能的实现jquery.jqprint-0.3
  19. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究
  20. 安装博图V15时出现缺少.net3.5sp1解决办法

热门文章

  1. ef 执行mysql语句_在EF中执行SQL语句
  2. linux执行使分区生效的命令,Linux硬盘分区生效命令partprobe
  3. hssfworkbook 单元格合并后宽度不生效_一起来学习Excel批量合并单元格的操作技巧...
  4. 呆萌的图模型学习——图基本信息 Networkx基本操作(二)
  5. php 文件列表 浏览,简易文件目录浏览器PHP代码
  6. java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题
  7. 如何设置ftp服务器上传文件夹至不同路径,设置ftp服务器上传文件夹
  8. 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
  9. c语言指针填空题目,C语言指针题目实战
  10. php 怎么配置邮件,PHP发邮件的配置_PHP教程