【TCP】超时与重传

  在TCP连接中假设发送方一开始便向网络发送多个报文段,直到达到接收方通告的窗口大小为止。当发送方和接收方处于同一个区域网段时,这种方式是可以的。但是如果发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现问题。

  一些中间路由器必须缓存分组,并有可能耗尽存储器空间。

  现在,TCP需要支持被称为“慢启动”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。

  慢启动发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记做cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动算法以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

  发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4.这是一种指数增加关系。

  

拥塞避免算法(主要处理超时问题):

  慢启动算法是在一个连接上发起数据流的方法,但有时我们会达到中间路由器的极限,此时分组将丢失。拥塞避免算法是一种处理丢失分组的方法。

  该算法假定由于分组受到损坏引起的丢失是非常少的,因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:发生超时和接收到重复的确认。

  拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的速率于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。

  拥塞避免算法和慢启动算法需要对每个连接维持的两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。这样得到的算法的工作过程如下:

  1)对一个给定的连接,初始化cwnd为一个报文段ssthresh为65535个字节。

  2)TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是放松放感受到的网络拥塞的估计,而后者则与接收方在该链接上的可用缓存大小有关。

  3)当拥塞发生时(超时),ssthresh被设置成当前窗口大小的一半(cwnd和接收方通告窗口大小的最小值,但至少为两个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段。然后会重新发送超时的报文。

  4)当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到拥塞发生时所处位置一半的时候才停止(因为我们记录了在步骤3中给我们制造麻烦的窗口大小的一半),然后转为执行拥塞避免。

  慢启动算法初始设置cwnd为1个报文段,此后每增加一个确认就加1。这会使窗口按照指数方式增长:发送1个报文段,然后是2个,接着是4个。。。。。。

  拥塞避免算法要求每次收到一个确认时将cwnd增加1/cwnd(cwnd记录的是字节而不是报文段个数)。与慢启动的指数增加比起来,这是一种加性增长。我们希望在一个往返时间内最多为cwnd增加一个报文段(不管在这个RTT中收到了多少个ACK),慢启动将根据这个往返时间中所收到的确认的个数增加cwnd。

 

快速重传和快速恢复(主要处理报文段失序问题):

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

  由于我们不知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1~2个重复的ACK。如果一连串收到3个或3个以上的重复的ACK,就非常有可能是一个丢失的报文段了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。

  在这种情况下没有执行慢启动的原因是由于收到重复的ACK不仅仅告诉我们一个分组丢失了。由于接收方只有在收到另一个报文段时才会产生重复的ACK,而该报文段已经离开了网络并进入了接收方的缓存。也就是说,在收发两端之间任然有流动的数据,而我们不想执行慢启动来突然减少数据流。

  这个算法通常按如下过程进行实现:

  1)当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口大小的cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段的大小。

  2)每次收到另一个回复的ACK时,cwnd增加一个报文段大小并发送一个分组(如果新的cwnd允许发送)

  3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第一步设置这个值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中的重传的确认。另外,这个ACK也因该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因此当分组丢失时我们将当前的速率减半。

参考资料:

  1. 《TCP/IP详解卷——卷1协议》  机械工业出版社

时间: 2024-10-15 16:50:34

【TCP】超时与重传的相关文章

TCP超时与重传机制

TCP超时与重传机制    TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号.  这里比较重要的是重传超时时间,怎样设置这个定时器的时间(RTO),从而保证对网络资源最小的浪费.因为若RTO太小,可能有些报文只是遇到拥堵或网络不好延迟较大而已,这样就会造成

[转帖]4000字详解TCP超时与重传,看完没收获算我输

4000字详解TCP超时与重传,看完没收获算我输 https://network.51cto.com/art/202001/608869.htm 上一篇介绍 TCP 的文章「TCP 三次握手,四次挥手和一些细节」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部分. 我们都知道 TCP 协议具有重传机制,也就是说,如果发送方认为发生了丢包现象,就重发这些数据包.很显然,我们需要一个方法来「猜测」是否发生了丢包.最简单的想法就是,接收方每收到一个包,就向发送方返回一个 ACK,表示自己已

TCP/IP 协议——十四章:TCP超时与重传

由于下层网络层(IP)可能出现丢失.重复或失序包的情况,TCP 协议提供可靠数据传输服务.为保证数据传输的正确性,TCP 重传其认为已经丢失的包.TCP 有两套重传机制,一是基于定时器(超时),二是基于确认信息的构成(快速重传). 基于计时器的重传 TCP在发送数据时会设置一个计时器,若至计时器超时仍未收到数据确认信息(ACK),则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(Retansmission Timeouts,RTO). 图中黑色那条就是因为定时器超时仍没有收到 A

13.TCP的超时与重传

TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传频率. TCP管理4种不同的定时器: 重传定时器:当希望收到另一端的确认时使用. 坚持定时器:使窗口信息保持不断流动,即使另一端关闭了其接收窗口. 保活定时器:检测一个空闲连接的另一端何时崩溃或重启. 2MSL定时器:测量一个

TCP/IP协议详解 卷一:协议 21章、TCP的超时与重传

1.引言 TCP提供可靠的运输层.它使用的方法之一就是确认从另一端接收到的数据.但数据和确认都可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传频率. TCP管理4种不同的定时器: 重传定时器:当希望收到另一端的确认时使用. 坚持定时器:使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口. 保活定时器:可以检测一个空闲连接的另一端何时崩溃或重启. 2MS

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

TCP提供可靠的运输层. 它使用的方法之中的一个就是确认从还有一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这样的问题.假设当定时器溢出时还没有收到确认,它就重传该数据. 对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和怎样确定重传频率. TCP管理4种不同的定时器: 重传定时器:当希望收到还有一端的确认时使用. 坚持定时器:使窗体信息保持不断流动,即使还有一端关闭了其接收窗体. 保活定时器:检測一个空暇连接的还有一端何时崩溃或重新启动. 2

《TCP/IP详解》读书笔记(21章)-TCP的超时与重传

TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率. TCP管理4种不同的定时器: 重传定时器:当希望收到另一端的确认时使用. 坚持定时器:使窗口信息保持不断流动,即使另一端关闭了其接收窗口. 保活定时器:检测一个空闲连接的另一端何时崩溃或重启. 2MSL定时器:测量一

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

21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1)  ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行重传 2)  在向一个不存在的主机发送ARP的 例子中,可看到当TCP试图建立连接的时候,在每个重传之间使用一个较长的时延来重传SYN 对于每个连接,TCP管理4个不同的定时器: 1)  重传定时器使用于当希望收到另一端的确认 2)  坚持(persist)定时器使窗口大小信息保持不断流动,即使另一

【原创】TCP超时重传机制探索

TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接收方(receiver)发送的数据丢失时,将引起发送方向接收方重传丢失的数据包. 其通信模型例如以下: wx_fmt=png" data-ratio="1.5138121546961325" data-w="362" _src="https://mm

Sipdroid实现SIP(六): SIP中的请求超时和重传

目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章仅涉及了SIP消息的基本概念, 比如: 请求型消息: INVITE, REGISTER... 应答型消息: 100 Trying, 180 Ringing, 200 OK, BYE, ACK... 携带SDP信息 携带认证信息 这篇文章更深入一些, 介绍了SIP作为一种可靠传输, 涉及到的超时和重传