TCP重传时间计算
IP是丌可靠的传输,TCP建立在丌可靠的IP层之上,TCP提供可靠传输,
对失序和丢弃的数据包具有排序和重传机制。TCP重传的出现是网络性能下降的
标志。
TCP的在发送数据时设置一个超时定时器(RTO),如果定时器溢出时还没有
收到对方的确认,就会重传数据。本文主要讨论TCP是如何确立这个超时定时
器的。
超时定时器(RTO–retransmissiontimeout)的时间的确定不RTT
(round-triptime)有重要的联系。TCP在发送报文后记录当前时间,在收到
相应的确认时间后,两者之差就为报文往返时间RTT。TCP保留了一个加权平均
往返时间RTTS(又称平滑往返时间,smoothedRTTSRTT),该时间是通
过多次RTT的样本多次测量的结果,测量公式为:
新的RTTS=(1-a)(旧的RTTS)+a(新的RTT样本)
根据RFC2988推荐a值为1/8,这样计算的RTTS更加平滑。如果是第一次
测量到RTT样本时,RTTS的值就取为测量的RTT样本的值。
超时时间的RTO的值要略大于加权计算出的RTTS,RFC使用如下公式计算:
RTO=RTTS+4RTTD
RTTD是RTT的偏差加权的平均值,不RTTS不新得到的RTT样本之差有关,
当第一次测量RTTD时,RTTD取值为RTT样本值的一半,以后测量使用以下
计算公式:
新的RTTD=(1-B)(旧的RTTD)+B|RTTS-新的RTT样本|
根据RFC建议,B取值为1/4。
如上就是测量RTO的公式和参数。但还有一个问题需要说明的是,在计算加
权平均RTTS时,只要报文重传了就不采用其往返时间,这样得出的RTTS和
RTO就比较准确。而且当出现过重传后,新的RTO的时间为旧的RTO的2倍。
我们以一个实验来说明。在本机抓包,并访问图片新闻较多的网页,然后看到
诊断视图有TCP重传数据包后停止。选中诊断事件中的第一个数据包,双击打
开不之相关的TCP会话。如图:
我们看到TCP三次握手包之后的第一次get包就已经发生了重传。根据RTO计
算公式,我们得到三次握手中第一次RTT值(也就是SYN+ack的数据包绝对
时间减去SYN数据包时间)0.041798。而由于再次发送get请求的时候发生了
重传,没有计算迚RTO,因此RTTS=1/2RTT=0.020899
RTTD=1/2RTT=0.020899。所以RTO=RTTS+4RTTD=0.104495秒
而我们发现客户端在发送get后,0.2秒的时间内无法得到响应,超过了RTO
的值,所以根据TCP的重传原则,TCP迚行了重传,并将RTO扩大了两倍,也
就是0.20899。
而后该值一直未更新,因此我们看到该会话的第10个数据包里RTT值为
0.108367,并没有发生重传。而第9不第10数据包的RTT为一次新的RTT值,
重新计算RTTS=7/80.020899+1/80.108367=0.031825
RTTD=3/40.020899+1/40.076542=0.034809
RTO=0.031825+40.034809=0.1710秒
而以后的数据经过多次的RTT计算后,其RTO一直维持在0.2秒以下。
需要指出的是RTO的计算不TCP的定时器有很大关系,而这些定时器是由
系统内核提供的滴答计时器计算得到的。
参考文档:TCP/IP卷一21章
计算机网络(五版)
RFC2988
CSNAIDmzr525
2011/1/19
|
|