TCP/IP详解学习笔记(12)-TCP的超时与重传

超时重传是TCP协议保证数据可靠性的另外一个重要机制,其原理是在发送某一个数据之后就开启一个计时器,在必定时间内若是没有获得发送的数据报的ACK报文,那么就从新发送数据,直到发送成功为止。 算法

1.超时

超时时间的计算是超时的核心部分,TCP要求这个算法能大体估计出当前的网络情况,虽然这确实很困难。要求精确的缘由有两个:(1)定时长久会形成网络利用率不高。(2)定时过短会形成屡次重传,使得网络阻塞。因此,书中给出了一套经验公式,和其余的保证计时器准确的措施。 缓存

1.1.递推公式概说

最先的TCP曾经用了一个很是简单的公式来估计当前网络的情况,以下 网络

R<-aR+(1-a)M RTP=Rb

其中a是一个经验系数为0.1,b一般为2。注意,这是经验,没有推导过程,这个数值是能够被修改的。这个公式是说用旧的RTT(R)和新的RTT(M)综合到一块儿来考虑新的RTT(R)的大小。可是,咱们又看到,这种估计在网络变化很大的状况下彻底不能作出“灵敏的反应”(Jacoboson说的,不是偶说的,呵呵),因而就有下面的修正公式: 并发

Err=M-A A<-A+gErr D<-D+h(|Err|-D) RTO=A+4D

具体的解释请看书的228页,这个递推公式甚至把方差这种统计概念也使用了进来,使得误差更加的小。并且,必需要指出的是,这两组公式更新,都是在数据成功传输的状况下才进行,在发生数据从新传输的状况下,并不使用上面的公式进行网络估计,理由很简单,由于程序已经不在正常状态下了,估计出来的数据也是没有意义的。 spa

1.2.RTO的初始化

RTO的初始化是由公式决定的,例如最初的公式,初始的值应该是1。而修正公式,初始RTO应该是A+4D。 效率

1.3.RTO的更新

当数据正常传输的状况下,咱们就会用上面的公式来更新各个数据,并重开定时器,来保证下一个数据被顺利传输。要注意的是:重传的状况下,RTO不用上面的公式计算,而采用一种叫作“指数退避”的方式。例如:当RTO为1S的状况下,发生了数据重传,咱们就用RTO=2S的定时器来从新传输数据,下一次用4S。一直增长到64S为止。 原理

1.4.估计器的初始化

在这里,SYN用的估计器初始化彷佛和传输用的估计器不同(我也没有把握)造个人理解,在修正公式中,SYN的状况下,A初始化为0,D初始化为3S。 定时器

而在获得传输第一个数据的ACK的时候,应该按照下面的公式进行初始化: 程序

A=M+0.5 D=A/2

1.5.估计器的更新

和上面的讨论差很少,就是在正常状况下,用上面的公式计算,在重传的状况下,不更新估计器的各类参数。缘由仍是由于估计不许确。 方法

1.6.Karn算法

这不算是一个算法,这应该是一个策略,说的就是更新RTO和估计器的值的时机选择问题,1.3.和1.5.所说得更新时机就是Karn算法。

1.7.计时器的使用

两句话:

  1. 一个链接中,有且仅有一个测量定时器被使用。也就是说,若是TCP连续发出3组数据,只有一组数据会被测量。
  2. ACK数据报不会被测量,缘由很简单,没有ACK的ACK回应能够供结束定时器测量。

2.重传

有了超时就要有重传,可是就算是重传也是有策略的,而不是将数据简单的发送。

2.1.重传时发送数据的大小

前面曾经提到过,数据在传输的时候不能只使用一个窗口协议,咱们还须要有一个拥塞窗口来控制数据的流量,使得数据不会一会儿都跑到网路中引发“拥塞”。也曾经提到过,拥塞窗口最初使用指数增加的速度来增长自身的窗口,直到发生超时重传,再进行一次微调。可是没有提到,如何进行微调,拥塞避免算法和慢启动门限就是为此而生。

所谓的慢启动门限就是说,当拥塞窗口超过这个门限的时候,就使用拥塞避免算法,而在门限之内就采用慢启动算法。因此这个标准才叫作门限,一般,拥塞窗口记作cwnd,慢启动门限记作ssthresh。下面咱们来看看拥塞避免和慢启动是怎么一块儿工做的

算法概要(直接从书中拷贝)

  1. 对一个给定的链接,初始化cwnd为1个报文段,ssthresh为65535个字节。
  2. TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用 的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感觉到的网络拥塞的估 计,然后者则与接收方在该链接上的可用缓存大小有关。
  3. 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(cwnd 和接收方通告窗口大小的最小值,但最少为2个报文段)。此外,若是是超时引发了拥塞,则 cwnd被设置为1个报文段(这就是慢启动)。
  4. 当新的数据被对方确认时,就增长cwnd,但增长的方法依赖于咱们是否正在进行慢启 动或拥塞避免。若是cwnd小于或等于ssthresh,则正在进行慢启动,不然正在进行拥塞避免。 慢启动一直持续到咱们回到当拥塞发生时所处位置的半时候才中止(由于咱们记录了在步骤2 中给咱们制造麻烦的窗口大小的一半),而后转为执行拥塞避免。

补充上面的拥塞避免公式在P238页。这整个的流程让我联想到开车换档的过程。

2.2.快速重传和快速恢复算法

这是数据丢包的状况下给出的一种修补机制。通常来讲,重传发生在超时以后,可是若是发送端接受到3个以上的重复ACK的状况下,就应该意识到,数据丢了,须要从新传递。这个机制是不须要等到重传定时器溢出的,因此叫作快速重传,而从新传递之后,由于走的不是慢启动而是拥塞避免算法,因此这又叫作快速恢复算法。流程以下:

  1. 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的 报文段。设置cwnd为ssthresh加上3倍的报文段大小。
  2. 每次收到另外一个重复的ACK时, cwnd增长1个报文段大小并发送1个分组(若是新的 cwnd容许发送)。
  3. 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个 ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该 是对丢失的分组和收到的第1个重复的ACK之间的全部中间报文段的确认。这一步采用的是拥 塞避免,由于当分组丢失时咱们将当前的速率减半。

2.3.ICMP会引发从新传递么?

答案是:不会,TCP会坚持用本身的定时器,可是TCP会保留下ICMP的错误而且通知用户。

2.4.从新分组

TCP为了提升本身的效率,容许再从新传输的时候,只要传输包含重传数据报文的报文就能够,而不用只重传须要传输的报文。

相关文章
相关标签/搜索