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 ...
随机推荐
- 03.什么是Lucene全文检索的原理01
全文检索的原理:查询速度快,精准度高,可以根据相关度进行排序.它的原理是:先把内容分词,分词之后建索引. Lucene是apache下的一个开放源代码的全文检索引擎工具包. 提供了完整的查询引擎和索引 ...
- SpringBoot01 InteliJ IDEA安装、Maven配置、创建SpringBoot项目、yml属性配置、多环境配置、自定义properties配置
1 IntelliJ IDEA 安装 下载地址:点击前往 注意:需要下载专业版本的,注册码在网上随便搜一个就行啦 2 MAVEN工具的安装 2.1 获取安装包 下载地址:点击前往 2.2 安装过程 到 ...
- Activiti 乱码问题
新版本运行起来中文看起来正常了许多,至少生成图片过程中不会出现乱码了,但不出预料的再次遇到部署时乱码问题,除了保存时报错,还会导致流程实例的节点名称是乱码. 1. IE报错定义时错误提示: 元素类型 ...
- Linux版本信息如何查询
1.输入"uname -a ",可显示电脑以及操作系统的相关信息.2.输入"cat /proc/version",说明正在运行的内核版本.3.输入"c ...
- 344. Reverse String 最基础的反转字符串
[抄题]: [暴力解法]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: 还停留在 i < len / 2的阶段,不行,应该是指针对撞问题了 [一 ...
- CENTOS 使用 MUTT发送邮件
有些时候我们需要在Centos服务器上发送邮件,例如备份MySQL数据库并发送到指定邮箱,这里我们就说下如何从Centos的shell命令发送邮件. 检查.安装.启动sendmail //检查 ps ...
- 文件上传控件asp:FileUpload
前端 使用的控件<asp:FileUpload ID="fileup" runat="server" /><span class=" ...
- SourceTree 3.0.8 跳过登陆注册
3.0.8普通用户版account.json跳过登陆注册方法已失效,请安装企业版 https://www.sourcetreeapp.com/enterprise 企业版默认安装在 %programf ...
- 1045 Bode Plot
题目链接:http://poj.org/problem?id=1045 一道数学物理题, 推理公式:http://www.cnblogs.com/rainydays/archive/2013/01/0 ...
- python report中文显示乱码
环境:python2.7 测试框架: nose (1.3.7) nose-html-reporting (0.2.3) 问题:生成测试报告失败的时候,报告会抓取代码中的print,打开后看到的中文是乱 ...