TCP中往返时间的估计与超时
往返时间的估计与超时
TCP采用超时/重传机制来处理报文段的丢失问题。尽管这在概念上面很简单,但是在实际中还
是会产生很多微妙的问题。最明显还是超时时间间隔的设置。很显然,这个时间间隔肯定会大于RTT
时间,但是具体为多大呢?如何估计最开始的往返时间呢?下面将介绍这些问题的一些解决办法。
估计往返时间
报文段的样本RTT(表示为SampleRTT)为某报文段发出到对该报文段的确认被收到之间的时间
量大多数TCP的实现仅在某个时刻做一次SampleRTT测量,而不是为每个报文段测量一个SampleRTT。
也就是说,在任何时刻,仅为一个已发送但是目前尚未被确认的报文段估计SampleRTT,从而产生
一个接近每个RTT的新SampleRTT值。
另外,TCP绝不为被重传的报文计算SampleRTT;它仅为传输一次的报文段测量SampleRTT。
由于路由器的拥塞和端系统负载的变化,这些报文段的SampleRTT是波动的,所以给定的任何
SampleRTT都是非典型的。因此要取得典型的RTT,就要对SampleRTT进行加权取值。
EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT
[RFC 6298]中给出α的参考值为0.125
对于最近的样本赋予较大的权值,是因为越近的样本越能反应网络当前的拥塞状况。
从统计学观点讲,这种平均被称为指数加权移动平均(EWMA)
除估算RTT外,测量RTT变化也是很有用的!
[RFC 6298]定义了RTT偏差 DevRTT,用于估算SampleRTT偏离EstimatedRTT的程度:
DevRTT = (1-β)*DevRTT + β*|SampleRTT - EstimatedRTT|
DevRTT是SampleRTT和EstimatedRTT之差的指数加权移动平均
如果SampleRTT的波动小那么DevRTT的波动便会小,反之亦此。
第一次的DevRTT=1/2(SampleRTT),以后按公式来计算,推荐β为0.25
设置和管理重传超时间隔
超时时间间隔应该大于EstimatedRTT并且不能大于太多。超时时间间隔为EstimatedRTT加
上一些余量。并且在SampleRTT值波动大时,余量较大;当波动较小时,余量较小。因此就用
到了DevRTT。由此得出TCP重传时间间隔计算公式:
TimeoutInterval = EstimatedRTT + 4*DevRTT
推荐的初始TimeoutInterval为1秒。
出现超时后,TimeoutInterval直接加倍。
因为此次重传可能是报文确认ACK因为网络拥塞而延迟到达从而导致报文重传,重传报文
后,不久,ACK到达,会导致SampleRTT变小,进而使TimeoutInterval变小,使后面的报文出
现过早超时!
一旦报文段收到并更新EstimatedRTT后,TimeoutInterval又使用上述公式。
此文为《计算机网络 自顶向下方法》的学习笔记4
TCP中往返时间的估计与超时的更多相关文章
- 三十天学不会TCP,UDP/IP网络编程 -- TCP中的智慧之连续ARQ
突然发现上一篇文章贴图有问题,关键我怎么调也调不好,为了表达歉意,我再贴一篇gitbook上的吧,虽然违背了我自己的隔一篇在这里发一次的潜规则~其余完整版可以去gitbook(https://www. ...
- TCP中RTT的测量和RTO的计算
https://blog.csdn.net/zhangskd/article/details/7196707 tcp传输往返时间是指:发送方发送tcp断开时, 到发送方接收到改段立即响应的所耗费的时间 ...
- TCP/IP协议中几个缩写词的含义 MSL、TTL和RTT 报文最大生存时间 跳数(即生存时间) cs往返时间 MSL要大于TTL知道为什么吗?
MSL.TTL和RTT简介 1.MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃.因为 ...
- [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
引言 自己弄了一个小项目——日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Desc ...
- System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
2017/8/15 20:55:21 [AgentPayQuery_205506102_1BBBB]系统异常:System.Data.Entity.Core.EntityException: The ...
- 【网络协议】TCP中的四大定时器
前言 对于每个TCP连接,TCP一般要管理4个不同的定时器:重传定时器.坚持定时器.保活定时器.2MSL定时器. 重传定时器 非常明显重传定时器是用来计算TCP报文段的超时重传时间的(至于超时重传时间 ...
- TCP中ECN的工作原理分析二(摘自:RFC3168)
英文源:http://www.icir.org/floyd/ecn.html 发送端和接收端处理: The TCP Sender For a TCP connection using ECN, new ...
- RTT(往返时间)和RPC
RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标.表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经 ...
- Java Redis的Pipeline管道,批量操作,节省大量网络往返时间 & Redis批量读写(hmset&hgetall) 使用Pipeline
一般情况下,大家使用redis去put/get都是先拿到一个jedis实例,然后操作,然后释放连接:这种模式是 请求-响应,请求-响应 这种模式,下一次请求必须得等第一次请求响应回来之后才可以,因为r ...
随机推荐
- JavaScript中的Undefined / Null 类型相关说明
1,综述: ※Undefined 和 Null是JavaScript中的两种数据类型(其他的类型还有:Boolean, String, Number, Object). ※Undefined类型只有一 ...
- [转]JDBC如何进行超时设置
文档来源:https://jingyan.baidu.com/article/fc07f98922615a12ffe519ce.html 恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数 ...
- JS入门经典第四章总结
charAt():该函数有一个参数,即选择哪一个位置上的参数.返回值就是该位置上的字符. charCodeAt():该函数有一个参数,即选择哪一个位置上的参数.返回值是该位置字符在Unicode字符集 ...
- 《java从入门到精通》学习记录
目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...
- c++中的const与指针
const修饰符 使用const修饰变量时,该变量的值不可修改,因此需要初始化. 例如 const int s = 0: 此时s为值不可变的变量. 那么基于此,当const修饰指针时的情况有三种: ( ...
- SVN完全备份,增量备份,库同步
svn备份一般采用三种方式:1)svnadmin dump 2)svnadmin hotcopy 3)svnsync. 优缺点分析: ============== 第一种svnadmin hotcop ...
- Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...
- Android语音识别
语音识别 - 科大讯飞 开放平台 http://open.voicecloud.cn/ 需要拷贝lib.assets.并在清单文件中写一些权限 public class MainActivity ex ...
- Linux(Ubuntu18.04)安装Chrome浏览器
一分钟安装教程! 1.将下载源加入到系统的源列表(添加依赖) sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt ...
- Docker学习笔记-CentOS7镜像
前言: 环境:centos7.5 64 位 正文: 第一步:下载centos7镜像 docker pull centos 第二步:建立centos7的容器 sudo docker run --priv ...