您的位置:首页 > 理论基础 > 计算机网络

TCP超时重传机制

2015-08-04 19:40 295 查看
TCP可靠性中最重要的一个机制是处理数据超时和重传。TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。尽管超时重传的概念十分简单,但是在实现中,TCP处理超时重传的机制与其他可靠性协议相比是相当复杂的。

RTO

影响超时重传机制协议效率的一个关键参数是重传超时时间(RTO,Retransmission TimeOut)。RTO的值被设置过大过小都会对协议造成不利影响。如果RTO设置过大将会使发送端经过较长时间的等待才能发现报文段丢失,降低了连接数据传输的吞吐量;另一方面,若RTO过小,发送端尽管可以很快地检测出报文段的丢失,但也可能将一些延迟大的报文段误认为是丢失,造成不必要的重传,浪费了网络资源。

RTO的设定

如果底层网络的传输特性是可预知的,那么重传机制的设计相对简单得多,可根据底层网络的传输时延的特性选择一个合适的RTO,使协议的性能得到优化。但是TCP的底层网络环境是一个完全异构的互联结构。在实现端到端的通信时,不同端点之间传输通路的性能可能存在着巨大的差异,而且同一个TCP连接在不同的时间段上,也会由于不同的网络状态具有不同的传输时延。

TCP的重传机制相对于其他协议显然也将更为复杂,其复杂性主要表现在对超时时间间隔的处理上。为此,TCP协议使用自适应算法(Adaptive Retransmission Algorithm)以适应互联网分组传输时延的变化。这种算法的基本要点是TCP监视每个连接的性能(即传输时延),由此每一个TCP连接推算出合适的RTO值,当连接时延性能变化时,TCP也能够相应地自动修改RTO的设定,以适应这种网络的变化。

RTT

对一个连接而言,若能够了解端点间的传输往返时间(RTT,Round Trip Time),则可根据RTT来设置一合适的RTO。显然,在任何时刻连接的RTT都是随机的,无法事先预知。TCP通过测量来获得连接当前RTT的一个估计值,并以该RTT估计值为基准来设置当前的RTO。自适应重传算法的关键就在于对当前RTT的准确估计,以便适时调整RTO。

为了搜集足够的数据来精确地估算当前的RTT,TCP对每个报文都记录下发送出的时间和收到的确认时间。每一个(发送时间,确认时间)对就可以计算出一个RTT测量值的样本(Sample RTT)。TCP为每一个活动的连接都维护一个当前的RTT估计值。该值是对已经过去的一个时间段内两个连接的RTT的加权平均,并作为TCP对连接当前实际的RTT值的一种估计。RTT估计值将在发送报文段时被用于确定报文段的RTO。为了保证它能够比较准确地反应当前的网络状态,每当TCP通过测量获得了个新的RTT样本时,都将对RTT的估计值进行更新。不同的更新算法或参数可能获得不同的特性。

最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下

R<-aR+(1-a)MRTP=Rb其中a是一个经验系数为0.1,b通常为2。注意,这是经验,没有推导过程,这个数值是可以被修改的。这个公式是说用旧的RTT(R)和新的RTT(M)综合到一起来考虑新的RTT(R)的大小。但又可以看到,这种估计在网络变化很大的情况下完全不能做出“灵敏的反应”


RTT的精确估值测量—Karn算法

如果在一个报文段中的数据被一次性地成功传输和确认,那么发送端可以准确得到该报文段传输的RTT样本。但若出现了重传,情况就会变得很复杂。例如,一个报文段发送后出现超时,TCP将在另一个报文段中重传。由于这两个报文段包含了同样的数据,发送方接收到确认信息时将无法分辨出确认信息到底是针对哪个报文段的,因为这两个报文段产生的确认信息可能是完全相同的,确认信息既可能是针对原始报文段的(这种情况可能是由于原报文段或确认在传输中被延迟造成的),也可能是对重传报文段的确认。这种现象称为确认二义性(Acknowledgement Ambiguiity)。确认的二义性将导致TCP无法准确地估算RTT。

为了避免确认二义性带来的问题,TCP采用了Karn算法来维护RTT的估计值。Karn算法规定,TCP只能利用没有确认二义性(既无重发、一次发送成功并得到确认的报文段)的RTT样本来对RTT的估计值进行调整。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp 超时重传机制