TCP-IP详解: RTT和RTO的计算方法

参考教材:TCP-IP Guide

基本概念

RTT: 发送一个数据包到收到对应的ACK,所花费的时间

RTO: 发送数据包,启动重传定时器,重传定时器到期所花费的时间,称为RTO

对于segment的重传,重传的时间RTO设定是非常重要的,如果设置太短,可能会导致并没有丢包而重传,如果设置太长了,可能因为等待ACK而浪费掉很多时间,牺牲传输的效率。从思想上来讲,其实我们还是希望重传的时间需要稍稍的大于RTT就可以了。但是这个RTT没有什么可以使用的定值,他是不断变化的。

我们只能动态的进行设置,所以RTO只能是更加RTT来进行动态的设置,看下前辈们研究的RTT的计算方法

经典的算法 RFC793

1. 首先计算一个平滑的RTT称置为SRTT, alpha是一个平滑因子,取值为0.8或者0.9

SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)

2. 基于SRTT,计算出对应的RTO

     RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]

其中UBOUND是最大值,一般情况下为120s,LBOUND是最小重传值,一般情况下为1s,Beta取值为1.3~2.0. [RFC793]

其实这个算法,在目前Linux系统协议栈的实现中并没有使用了,原因是存在着一些不足之处,具体弊端没有认真研究,有文章指出不明确是使用第一次发送ACK的时间,还是使用重传ACK的时间采样RTT, 也有文章指出在RTT变化比较大的网络,性能表现非常不好... 总之有缺点

Jacobaon/Karels 算法

1988年,Van Jacobson和Karels在Congestion Avoidance and Control这篇论文中提出一种新的算法[RFC6298],

第一次RTO计算方法, 假设RTT = R

1.  SRTT = R

2.  RTTVAR = R/2

3.  RTO = SRTT + max(G, K*RTTVAR) , K = 4

后续的RTO计算,假设当前的RTT为R'

         RTTVAR = (1 - beta)*RTTVAR + beta*|SRTT - R'|    *计算平滑RTT和真实RTT的差距,切记这个地方的SRTT是上一次的SRTT*

SRTT = (1 - alpha)*SRTT + alpha*R' * 计算平滑RTT* 

 RTO = SRTT + max(G, K*RTTVAR)

alpha = 1/8  beta = 1/4,  值得指出的是这个算法在目前的Linux协议栈中应用,多么伟大的一件事情。

趣味考题

在阅读各种资料中,竟然看到一份考题,让计算RTO,现在果真是细节决定成败啊,不过记忆公式那真是学生时代的事情了...先看题目:

 假定TCP在开始建立连接时,发送方设定超时重传时间是RTO=6s。 (1)当发送方接到对方的连接确认报文段时,测量出RTT样本值为1.5s。试计算现在的RTO值。 (2)当发送方发送数据报文段并接收到确认时,测量出RTT样本值为2.5s。试计算现在的RTO值。

【答案】 根据RFC6298

RTT(1) = 1.5s

SRTT(1) = RTT(1) = 1.5s

RTTVAR(1) = 1.5/2 = 0.75

RTO = 1.5 + 4*0.75 = 4.5s    所以现在RTO的值为4.5s

接着计算第二步 RTT (2) = 2.5

RTTVAR(2) = 3/4 * 0.75 + 1/4 * |1.5 - 2.5|  = 13/16

SRTT(2) = 7/8 *1.5 + 1/8*2.5 = 1.625

RTO = 1.625 + 4 * 13/16 = 4.875 

Note: RFC6298 还有关于采样RTT和管理RTO定时器的topic,可以参考,后续可能会增加,相关部分!



  • 13
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
TCP/IP详解,卷1:协议》(共3卷,其他卷请到我的空间下载)是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。 目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值