为确保可靠性,TCP要求接收端对收到的数据进行确认。TCP为每个发送报文段安排一个定时器并设定溢出时间,如在定时器溢出时还未收到确认信号,发送端则重新发送数据。定时器溢出时间设定如太大,将发生不必要的等待而造成其他数据延迟发送;如太小,发送端将频频重发而可能导致资源浪费和网络拥塞。因此,溢出时间选择很重要,选择合理则网络运行效率提高。合理选择一个溢出时间的困难在于网络环境的复杂,主机间的通信既可发生在局域网中,又可在不同子网之间。数据传输延迟变化很大,难以预测。为了适应复杂性,TCP采用自适应重传算法。
自适应算法要求TCP随连接延时变化而修正溢出时间。TCP记录每个报文段从发送到接收到确认的时间,称样本往返时间。TCP估计的往返时间(RoundTripTime,RTT)是一个加权平均值,计算公式:
RTT=(α∗Old_RTT)+(1−α)*New_round_trip_sample
式中,α为加权因子,0<α<l。当接近0时,RTT值跟随延时变化;当接近1时,RTT对暂时的延时变化不敏感。溢出时间计算如下式:
Time_out=β*RTT
式中,β为大于1的常数加权因子,TCP推荐的β值为2。(www.xing528.com)
例如,如上次RTT为300μs,这次RTT为80μs,取其为0.9,则可算出估计往返时间:RTT=0.9*300+0.1*80=278μs;重传时间为:Time_out=2278=556μs
当发生重传时,发送端不知道接收到的确认是针对最初的报文还是重发的报文,此时RTT也就难以确定。针对该问题,TCP采用Karn算法:对于重传的报文段,不重新估计往返时间,但对溢出时间进行补偿。补偿后新的溢出时间由下式计算:
New_Time_out=γ*Time_out
式中,γ为一个常数因子,典型值为2。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。