Problem H: 超时计时器设置

116 篇文章 2 订阅
20 篇文章 0 订阅

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

 Hint

 我的想法:

 我的代码:

if __name__ == '__main__':
   # 每行为一个正整数,表示测得的往返时间RTT的样本值(第1行为一个TCP连接第一次测量得到的RTT样本)
   flag = 0
   RTTS = 0
   RTTD = 0
   RTO = 0
   a = 1 / 8
   b = 1 / 4
   items = []
   while True:
      RTT = input()
      if RTT == "":
         break
      # 第一次
      if flag == 0:
         flag = 1
         RTTS = float(RTT)
         RTTD = float(RTT) / 2
      else:
         RTTS = (1 - a)*(RTTS) + a * float(RTT)
         RTTD = (1 - b) * (RTTD) + b * abs(RTTS - float(RTT))

      RTO = RTTS + 4 * RTTD
      items.append(RTO)
      print("%.2f" % RTO)

   for item in items:
      print("%.2f" % item)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小木苓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值