Problem H: 超时计时器设置

Problem Description

运输层的超时计时器的超时重传时间应设置为多大呢?

如果把超时重传时间设置得太短,就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。

TCP 采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间 RTT。 

TCP 保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间)。 

第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS:

新的RTTS=(1- a)*(旧的RTTS)+a*(新的RTT样本)

式中,0<=a<1。若a很接近于零,表示 RTT 值更新较慢。若选择a接近于 1,则表示 RTT 值更新较快。

RFC 2988 推荐的a值为 1/8,即 0.125。

 

RTO 应略大于上面得出的加权平均往返时间 RTTS。

RFC 2988 建议使用下式计算 RTO:RTO=RTTS+4*RTTD,RTTD 是 RTT 的偏差的加权平均值。

RFC 2988 建议这样计算 RTTD:

第一次测量时,RTTD 值取为测量到的 RTT 样本值的一半。

在以后的测量中,则使用下式计算加权平均的 RTTD:

新的RTTD=(1-b)*(旧的RTTD) +b*|RTTS-新的RTT样本|
b 是个小于 1 的系数,其推荐值是 1/4,即 0.25。

Input Description

输入数据有多行,每行为一个正整数,表示测得的往返时间RTT的样本值(第1行为一个TCP连接第一次测量得到的RTT样本)。

Output Description

对于每行输入数据,输出对应的RTO,计算结果保留2位小数。

Sample Input

30
26
32
24

Sample Output

90.00
78.00
68.38
63.09

 1 n = 1
 2 ts = 1
 3 td = 1
 4 
 5 def func():
 6     while True:
 7         try:
 8             x = input()
 9             x = float(x)
10             RRT(x)
11         except EOFError:
12             break
13 def RRT(RTT):
14     #首先在函数外部进行初始化,然后在函数内部通过global关键字呼叫变量n
15     global n
16     global ts
17     global td
18     if n == 1:
19         n += 1
20         RTTS = (1-0.125) * RTT + 0.125 * RTT
21         ts = RTTS
22         RTTD = RTT/2.0
23         td = RTTD
24         RTO = RTTS + 4.0 * RTTD
25         print("%.2f" %RTO)
26         return
27 
28     RTTS = (1 - 0.125) * ts + 0.125 * RTT
29     ts = RTTS
30     RTTD = (1-0.25)*td + 0.25 * abs(RTTS-RTT)
31     td = RTTD
32     RTO = RTTS + 4.0 * RTTD
33     print("%.2f" % RTO)
34 
35 if __name__ == '__main__':
36     func()

 

posted @ 2023-04-24 21:37  hangsingplus  Views(37)  Comments(0Edit  收藏  举报