TCP的超时与重传
一、引言
对于每个TCP连接,TCP管理4个不同的定时器
- 重传定时器用于当希望收到另一端的确认。
- 坚持 (persist) 定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
- 保活 (keepalive) 定时器可检测到一个空闲连接的另一端何时崩溃或重启。
- 2MSL定时器测量一个连接处于
TIME_WAIT
状态的时间。
二、往返时间测量
TCP超时与重传中最重要的一部分是对一个给定连接,如何测量往返时间 (RTT)。由于路由器和网络流量均会变化,因此我们认为这个时间会经常变化,TCP应该跟踪这些变化并相应改变其超时时间。
2.1 方法一:根据估测RTT来确定重传时间
首先,TCP必须测量在发送一个带有特别序号的字节和接收到包含此字节的确认之间的RTT,用\(M\)表示所测量到的RTT。
最初TCP规范是TCP使用一个低通滤波器来更新一个被平滑的RTT估计器,记为\(R\)。
\[R \leftarrow \alpha R + (1-\alpha)M\]
这里\(\alpha\)是一个推荐值为0.9的平滑因子。RFC 793推荐重传超时时间RTO (Retransmission TimeOut) 的值如下:
\[RTO = R\beta\]
这里的\(\beta\)是一个推荐值为2的时延离散因子。
综上,整个过程如下\[RTT\xrightarrow\alpha R \xrightarrow\beta RTO\]
当RTT变化范围很大时,这种方法无法跟上这种变化,从而引起不必要的重传。
2.2 跟踪RTT的方差和均值来计算重传时间
Jacobson指出,可以用均值偏差对标准偏差做逼近,并提出下面用于每个RTT测量\(M\)的公式。\[Err=M-A \\ A \leftarrow A+gErr\\ D \leftarrow D + h(|Err|-D \\ RTO=A+4D\]
其中\(A\)是被平滑的RTT,即均值的估计其,而\(D\)是被平滑的均值方差。\(A\)和\(D\)均被用于计算下一个重传时间 (RTO)。增量\(g\)起到平均作用,取值为1/8。偏差的增益是\(h\),取值为0.25。
当RTT变化较大时,较大的偏差增益将使得RTO快速上升。
2.3 Karn算法
当一个超时和重传发送时,在重传数据的确认最后达到时,不能更新RTT估计器,因为我们不知道ACK对应哪次传输。
2.4 RTT测量的一个例子

在时间10、14、21处的间隔是由在这些时刻附近发生重传引起的。Karn算法在另一个报文段被发送和确认事前组织我们更新估计器。
三、拥塞举例
用起始序号报文段发送时间做图,是一种较好的数据传输的可视化方法。如下图,可以看出在时刻10、14和21附近的3个重传。我们还可以看到在这3个点中只进行了一次报文段的重传,因为只有一个点下垂低于向上的斜率。

四、拥塞避免算法
拥塞避免算法是一种处理丢失分组的方法。
假定:分支收到损坏引起的丢失是非常少的(远小于1%),因此分组丢失意味着源主机和目的主机之间的某处网络发生了故障。
分组丢失的两种指示:发生超时以及收到重复的确认。
当拥塞发生时,拥塞避免算法希望降低分组进入网络的速率,于是调用慢启动来做到这一点。
拥塞避免算法和慢启动算法对每个连接维持两个变量:拥塞窗口\(cwnd\)和慢启动门限\(ssthresh\),工作过程如下:
- 对于给定的链接,初始化\(cwnd\)为1个报文段,\(ssthresh\)为65535字节
- TCP输出例程的输出不能超过\(cwnd\)和接收方通告窗口大小
- 拥塞发生时(超时或收到重复确认),\(ssthresh\)设置为当前窗口大小(\(cwnd\)和接收方通告窗口的最小值)的一半。此外,如果超时引起了拥塞,则\(cwnd\)被设置为1个报文段(这就是慢启动)。
新的数据被对方确认是,就增加\(cwnd\)。增加的方法依赖于是否进行慢启动或拥塞避免。
如果\(cwnd\)小于或等于\(ssthresh\),则认为在执行慢启动,慢启动一直持续到我们回到当拥塞发生时所处的位置一半时停止。慢启动算法初始设置\(cwnd\)为1个报文段,此后每收到一个确认就加1。这会使窗口按指数方式增长。
否则,正在进行拥塞避免,每收到一个确认将\(cwnd\)增加\(1/cwnd\),这是一个加性增长。
五、快速重传与快速恢复算法
如果一连串收到3个或3个以上重复的ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。
接下来执行的不是慢启动算法而是拥塞避免算法,这就是快速重传算法。不执行慢启动的原因是重复的ACK不仅仅告诉我们一个分组丢失了。由于接收方只有收到另一个报文段时才会产生重复的ACK,此时这个报文段已经离开了网络并进入了接收方缓存。也就是说在收发两端之间仍然有流动的数据,因此不想执行慢启动来减少数据流。
算法流程如下:- 收到第3个重复的ACK时,把\(ssthresh\)设置为当前拥塞窗口\(cwnd\)的一半。重传丢失的报文段。设置\(cwnd\)为\(ssthresh\)加上3倍的报文段大小。
- 每次收到另一个重复的ACK时,\(cwnd\)增加一个报文段大小并发送一个分组(如果新的cwnd运行发送)。
- 收到下一个确认新数据ACK到达时,设置\(cwnd\)为\(ssthresh\)(第一步设置的值)。这一步采用的是拥塞避免,因为分组丢失时,我们把当前的速率减半。

TCP的超时与重传的更多相关文章
- 【TCP/IP详解 卷一:协议】第二十一章 TCP的超时与重传
作为TCP的重头戏,本章节涉及了许多关于计算方面的内容,使用了大量的例子来指明一些观点. 我使用的理解方法是:通过别人的博客,以及实例结合进行理解,不然会很吃力. 21.1 引言 reliable T ...
- TCP之超时和重传
RTT:往返时间: RTO:Retransmission Timeout即超时重传时间: 关键点在于:超时和重传间隔的策略,即怎样确定超时间隔和重传间隔: TCP中的四个定时器:2MSL定时器:重传 ...
- 13.TCP的超时与重传
TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于 ...
- TCP/IP详解 卷1 第二十一章 TCP的超时与重传
21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1) ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...
- TCP/IP协议--TCP的超时和重传
TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...
- 《TCP/IP具体解释》读书笔记(21章)-TCP的超时与重传
TCP提供可靠的运输层. 它使用的方法之中的一个就是确认从还有一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这样的问题.假设当定时器溢出时还没有收到确认,它就重传该 ...
- 【TCP】超时与重传
在TCP连接中假设发送方一开始便向网络发送多个报文段,直到达到接收方通告的窗口大小为止.当发送方和接收方处于同一个区域网段时,这种方式是可以的.但是如果发送方和接收方之间存在多个路由器和速率较慢的链路 ...
- TCP/IP详解学习笔记(12)-TCP的超时与重传
超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 1.超时 超 ...
- TCP/IP具体解释学习笔记--TCP的超时与重传
1.基本概念 TCP之所以能够安全的将数据在传输中的安全性,是因为它每次给对方发送数据,都会等待对方给个确认,当长时间收不到这个确认,发送端就会重发这个数据. 2.超时时间的測量 要測超时时间,TCP ...
随机推荐
- Composer切换到Laravel-China 镜像
全局 composer config -g repo.packagist composer https://packagist.laravel-china.org 该项目 composer confi ...
- zabbix自动发现监控mysql
一. 数据库给只读权限 1.1 grant usage on *.* to 'zabbix'@'127.0.0.1' identified by 'zabbix'; flush privileges; ...
- T-sql GroupBy语句常见问题处理
1.问题描述 现在有一张course表(含课程编号和名称)和一张sc表(含学生学号,选修课程的编号以及考试成绩),如下:现在想要查询所有课程编号.对应的课程名称以及选修该课程的所有学生的平均成绩.一开 ...
- spring.net事件的注入
.c#代码 TestObject source = new TestObject(); TestEventHandler eventListener1 = new TestEventHandler() ...
- Matlab中的数据预处理-归一化(mapminmax)与标准化(mapstd)
一.mapminmax 意思是将矩阵的每一行处理成[-1,1]区间,此时对于模式识别或者其他统计学来说,数据应该是每一列是一个样本,每一行是多个样本的同一维,即对于一个M*N的矩阵来说,样本的维度是M ...
- Perl 学习笔记-正则表达式应用篇
1.以 m// 进行匹配 如: m/roger/ , /roger/ 是它的简写; 在说明 qw// 时可以选择使用任何成对的定界符, 对应m//匹配也可以, 如写成: m(roger) ...
- python操作mysql数据库系列-操作MySql数据库(二)
接口测试框架层级目录结构示意图: page目录下面的mysqlTest.py:存放的是mysql的操作代码 utils目录下面的helper.py:存放的是公共的配置方法 log目录log.md:存放 ...
- linux常用Java程序员使用命令(一)
pwd 显示当前路径cd 切换目录 . .. ~ls 显示文件(夹) -l 显示详细信息 -a 显示全部,包括隐藏文件(夹) mkdir 创建文件夹 -p 递归创建 touch 创建空白文件 echo ...
- schedule-pool模拟并行任务分片
模拟并行任务分片 代码部分: package com.pool; import com.alibaba.fastjson.JSON; import java.io.BufferedReader; im ...
- 编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事
建议144:一个方法只做一件事 “单一职责原则”(SRP)要求每一个类型只负责一件事情.我们将此概念扩展到方法上,就变成了:一个方法只做一件事. 回顾上一建议的代码,LocalInit和RemoteI ...