TCP提供可靠的传输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没收到确认,他就重传数该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。

TCP管理四个定时器:

1)重传定时器:使用于当希望接收到另一端的确认。本文将详细讨论这个定时器以及相关问题,如拥塞避免。

2)坚持(persist)定时器:使窗口信息保持不断流动,即使另一端关闭了其接受窗口。以后文章讨论。

3)保活(keep alive)定时器:检测一个空闲连接的另一端的状态(何时崩溃或重启)。以后文章讨论。

4)2MSL定时器:前面文章讲过了,即测量一个连接处在TIME_WAIT状态的时间。

往返时间测量-RTT

主要有两大类算法:加权移动平均算法(Karn/Partridge算法)和Jacobson / Karels 算法。其实我也不懂,尤其是后者。

拥塞避免算法(Congestion Avoidance)

慢启动算法是一个在连接上发起数据流的算法(调节发送的数据速率),但是我们有时会达到中间路由器的极限,此时分组还是会被丢弃。拥塞避免算法是一种处理丢失分组的方法。但这两个算法通常一起实现,上一篇文章的慢启动示意图中也做了说明,cwnd指数增长期是慢启动,达到ssthresh后,每收到一个ACK,cwnd加一,进入线性增长(additive increase)。cwnd达到预设的cwnd后,慢启动又从1开始,只是这次的sshresh等于之前预设sshresh的一半。

快速重传(Fast Retransmit)和快速恢复(Fast Recover)算法

在收到一个失序的报文段时,TCP立即需要产生一个重复的ACK。这个ACK不应该被迟延。该ACK目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。

但是我们知道一个重复的ACK有可能是一个丢包引起的,也有可能是一个失序报文段引起的。假如这是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只会产生1~2个重复ACK。如果收到一连串3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是,发送方不需要等到超时定时器溢出,就重传丢失的报文数据段。这就是快速重传算法。快速重传做三件事情:

1)把ssthresh设置为cwnd的一半;

2)把cwnd设置为ssthresh的值(有些版本ssthresh+3);

3)重新进入拥塞避免阶段。

接下来执行的不是慢启动,而是拥塞避免算法。这就是快速恢复算法。为啥收到三个重复的ACK后没有启动慢启动算法?只有在有数据达到接收方时才会产生ACK,所以收到三个重复的ACK说明数据(非丢失数据)已经进入接收方的缓存,要是没有到达而丢包的话,会在RTO(retransmit timeout)之后发送ACK通知发送方报文丢失。也就是说连收三个ACK时,收发两端之间仍然有流动的数据,而我们不想执行慢启动算法来减少数据流。快速恢复做三件事情:

1)当收到3个重复ACK时,把ssthresh设置为cwnd的一半;把cwnd设置为ssthresh+3(因为有三个报文离开了网络),然后重传丢失的报文段。

2)再收到重复的ACK时,拥塞窗口cwnd++

3)当收到新的ACK时,把ssthresh值恢复到第一步的cwnd,因为收到新的ACK说明丢失的报文已经收到,快速恢复过程已经结束,可以恢复到之前的状态了。也即再次进入再次拥塞避免状态。

下图是各种算法的样子:

SACK(Selective acknowledgement)

以上被称为Reno拥塞控制算法,是针对一个包的重传算法,但是现实情况往往是同时有好多丢包。后来有了SACK确认机制,改变了TCP的确认机制。最初的ACK机制只确认当前已收到的连续数据段,SACK则把乱序等信息全都告诉对方,从而减少数据重传的盲目性。比如发送1,2,3,4,5,6,7个数据段,但只收到1,2,3,5,7。那么普通的ACK确认机制只会回复ACK=4,而SACK则把当前还收到5,7也放在了确认信息中,从而提高性能。使用SACK时NewReno算法可以不使用,因为SACK报文本身已经告诉发送方哪些报文需要重传,哪些不需要重传。关于SACK,wiki连接https://en.wikipedia.org/wiki/TCP_SACK

TCP超时与重传的更多相关文章

  1. TCP超时与重传机制

    TCP超时与重传机制    TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器 ...

  2. TCP超时与重传机制与拥塞避免

    TCP超时与重传机制 TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制. 基本原理:在发送一个数据之后,就开启一个定时器,若是 ...

  3. 详解 TCP 超时与重传机制——长文预警

    上一篇介绍 TCP 的文章「TCP 三次握手,四次挥手和一些细节」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部分. 我们都知道 TCP 协议具有重传机制,也就是说,如果发送方认为发生了 ...

  4. 13.TCP的超时与重传

    TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于 ...

  5. TCP/IP详解 卷1 第二十一章 TCP的超时与重传

    21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1)  ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...

  6. TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  7. 【TCP/IP详解 卷一:协议】第二十一章 TCP的超时与重传

    作为TCP的重头戏,本章节涉及了许多关于计算方面的内容,使用了大量的例子来指明一些观点. 我使用的理解方法是:通过别人的博客,以及实例结合进行理解,不然会很吃力. 21.1 引言 reliable T ...

  8. TCP的超时与重传

    一.引言 对于每个TCP连接,TCP管理4个不同的定时器 重传定时器用于当希望收到另一端的确认. 坚持 (persist) 定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口. 保活 (ke ...

  9. 《TCP/IP具体解释》读书笔记(21章)-TCP的超时与重传

    TCP提供可靠的运输层. 它使用的方法之中的一个就是确认从还有一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这样的问题.假设当定时器溢出时还没有收到确认,它就重传该 ...

随机推荐

  1. webpy简单入门---1

    1. 2. 3. 4.

  2. coreseek(sphinx) 全文检索

    转自: http://blog.csdn.net/aidandai/article/details/50464793 编译错误解决--sphinx-0.9.9 I tried to install t ...

  3. vue添加滚动事件,解决简书Carol_笑一笑方案中vue移除滚动事件失效的问题

    在写项目的时候,遇到了需要添加滚动事件的问题,在简书Carol_笑一笑这里找到了解决方案.代码如下 <script> export default { name:"vue-scr ...

  4. DRF视图-5个扩展类以及GenericAPIView基类

    视图 5个视图扩展类 视图拓展类的作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量. 这 ...

  5. Centos7搭建主从DNS服务器

    1.准备 例:两台192.168.11.10(主),192.168.11.11(从),域名www.test1.com # 主从DNS服务器均需要安装bind.bind-chroot.bind-util ...

  6. 安装nova

    在控制节点上执行 controllerHost='controller' controllerIP='172.31.240.49' MYSQL_PASSWD='m4r!adbOP' RABBIT_PA ...

  7. 整合AD RMS与EX 2010。

    1.点击开始菜单, 选择所有程 序,展开 Mi cros oft  Excha nge  Server  2010 ,打开Excha nge Ma na gement Cons ol e,选择收件人配 ...

  8. Textual Entailment(自然语言推理-文本蕴含) - AllenNLP

    自然语言推理是NLP高级别的任务之一,不过自然语言推理包含的内容比较多,机器阅读,问答系统和对话等本质上都属于自然语言推理.最近在看AllenNLP包的时候,里面有个模块:文本蕴含任务(text en ...

  9. Centos7 下安装docker

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上. Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位.系统内核 ...

  10. Reaching Points

    A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...