TCP提供可靠的运输层。它使用的方法之一就是确认从另外一端收到的数据。但数据和确认都有可能会丢失。TCP经过在发送时设置一个定时器来解决这种问题。若是当定时器溢出时尚未收到确认,它就重传该数据。算法
对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何肯定重传频率。缓存
TCP管理4种不一样的定时器:网络
指数退避:书中检查连续重传之间不一样的时间差,它们取整后分别是一、三、六、十二、2四、48和多个64秒,其中第一次发送后设置的超时时间设置为1.5秒。(2的N次方*1.5秒)并发
1.往返时间测量性能
RTT(往返时间):指发送端发送TCP报文段开始到接收到对方的肯定所使用的时间。测试
TCP超时与重传中最重要的部分就是对一个给定链接的往返时间的测试。因为路由器和网络流量均会变化,所以咱们认为这个时间可能常常会发生变化,TCP应该跟踪这些变化并相应地改变其超时时间。spa
RTO(超时重传时间):发送端发送TCP报文段后,在RTO时间内没有收到对方肯定,即重传该报文段。orm
最先的TCP曾经用了一个很是简单的公式来估计当前网络的情况,以下:blog
其中a是一个经验系数为0.9,称为平滑因子,b一般为2。这个数值是能够被修改的。这个公式是说用旧的RTT(R)和新的RTT(M)综合到一块儿来考虑新的RTT(R)的大小。每次进行新测量时,这个被平滑的RTT将获得更新。每一个新估计的90%来自前一个估计,而10%则取自新的测试。路由
可是,在RTT变化范围很大时,使用这个方法没法跟上这种变化,从而引发没必要要的重传。当网络已经处于饱和状态时,没必要要的和重传会增长网络的负载,对网络而言就像在火上浇油。因而就有下面的修正公式:
RTO值基于RTT的均值和方差,这更好的响应了RTT的变化。
karn算法(重传多义性)
假如发送一个分组,当发生超时,RTO指数退避,重传该分组,而后收到ACK。此时但并不能肯定这个ACK是针对第一个分组仍是重传分组,这就是重传多义性问题。
karn算法针对这个问题
(1)对于超时重传的数据报的确认,不更新RTT。
(2)要注意的是:重传的状况下,RTO不用上面的公式计算,而采用一种叫作“指数退避”的方式。RTO指数退避,下一次传送就使用这个RTO值。
(3)重传数据确认以后,再次发送的数据若是正常被肯定,恢复Jacobson 1988公式,更新RTO和RTT。
2.拥塞避免算法
该算法假定因为分组受到损坏引发的丢失是很是少的,所以分组丢失就意味着源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:
数据在传输的时候不能只使用一个窗口协议,咱们还须要有一个拥塞窗口来控制数据的流量,使得数据不会一会儿都跑到网路中引发“拥塞”。也曾经提到过,拥塞窗口最初使用指数增加的速度来增长自身的窗口,直到发生超时重传,再进行一次微调。可是没有提到,如何进行微调,拥塞避免算法和慢启动门限就是为此而生。
所谓的慢启动门限就是说,当拥塞窗口超过这个门限的时候,就使用拥塞避免算法,而在门限之内就采用慢启动算法。因此这个标准才叫作门限,一般,拥塞窗口记作cwnd,慢启动门限记作ssthresh。下面咱们来看看拥塞避免和慢启动是怎么一块儿工做的。
拥塞避免算法和慢启动算法是两个目的不一样、独立的算法。咱们但愿下降分组进入网络的传输速率,因而能够调用慢启动来做到这一点,拥塞避免算法和慢启动算法一般一块儿使用:
每一个链接维持两个变量: 拥塞窗口( cwnd ) 慢启动门限( ssthresh )[下图中假设为16]
算法概要:
cwnd增长方式
慢启动初始cwnd为1,每收到一个肯定就加1,成指数增加。
拥塞避免算法在每一个RTT内增长 1/cwnd 个报文,成线性增加。
慢启动根据收到的ACK次数增长cwnd,而拥塞避免算法在一个RTT无论收有多少ACK也只增长一次。
3.快速重传和快速恢复算法
若是收到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之间的全部中间报文段的确认。这一步采用的是拥塞避免,由于当分组丢失时咱们将当前的速率减半。
4.ICMP(Internet Control Message Protocol)Internet控制报文协议)差错
TCP可以遇到的最多见的ICMP差错就是源站抑制、主机不可达和网络不可达。
(1)源站抑制的ICMP将拥塞窗口cwnd置为1个报文段,并发起慢启动,慢启动门限ssthresh不变,窗口将打开直至开放了全部的通路(受窗口大小和往返时间的限制)或者发生了拥塞。
(2)主机不可达或网络不可达的ICMP将被忽略,由于这两上差错都被认为是短暂现象。
5.从新分组
当TCP超时并重传时,它不必定须要重传一样的报文段。相反,TCP容许进行从新分组而发送一个较大的报文段,这将有助于提升性能(固然,这个较大的报文段不可以超过接收方声明的MSS)