• 【TCP】往返时间的估计与超时


    往返时间的估计与超时

      TCP采用超时/重传机制来处理报文段的丢失问题。尽管这在概念上面很简单,但是在实际中还
    是会产生很多微妙的问题。最明显还是超时时间间隔的设置。很显然,这个时间间隔肯定会大于RTT
    时间,但是具体为多大呢?如何估计最开始的往返时间呢?下面将介绍这些问题的一些解决办法。

    估计往返时间

      报文段的样本RTT(表示为SampleRTT)为某报文段发出到对该报文段的确认被收到之间的时间
    量大多数TCP的实现仅在某个时刻做一次SampleRTT测量,而不是为每个报文段测量一个SampleRTT。
      也就是说,在任何时刻,仅为一个已发送但是目前尚未被确认的报文段估计SampleRTT,从而产生
    一个接近每个RTT的新SampleRTT值。

      另外,TCP绝不为被重传的报文计算SampleRTT;它仅为传输一次的报文段测量SampleRTT。

      由于路由器的拥塞和端系统负载的变化,这些报文段的SampleRTT是波动的,所以给定的任何
    SampleRTT都是非典型的。因此要取得典型的RTT,就要对SampleRTT进行加权取值。

            EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT
    

      [RFC 6298]中给出α的参考值为0.125
      对于最近的样本赋予较大的权值,是因为越近的样本越能反应网络当前的拥塞状况。
      从统计学观点讲,这种平均被称为指数加权移动平均(EWMA)

      除估算RTT外,测量RTT变化也是很有用的!
      [RFC 6298]定义了RTT偏差 DevRTT,用于估算SampleRTT偏离EstimatedRTT的程度:

           DevRTT = (1-β)*DevRTT + β*|SampleRTT - EstimatedRTT|
    

      DevRTT是SampleRTT和EstimatedRTT之差的指数加权移动平均
      如果SampleRTT的波动小那么DevRTT的波动便会小,反之亦此。
      第一次的DevRTT=1/2(SampleRTT),以后按公式来计算,推荐β为0.25

    设置和管理重传超时间隔

      超时时间间隔应该大于EstimatedRTT并且不能大于太多。超时时间间隔为EstimatedRTT加
    上一些余量。并且在SampleRTT值波动大时,余量较大;当波动较小时,余量较小。因此就用
    到了DevRTT。由此得出TCP重传时间间隔计算公式:

          TimeoutInterval = EstimatedRTT + 4*DevRTT
    

      推荐的初始TimeoutInterval为1秒。
      出现超时后,TimeoutInterval直接加倍
      因为此次重传可能是报文确认ACK因为网络拥塞而延迟到达从而导致报文重传,重传报文
    后,不久,ACK到达,会导致SampleRTT变小,进而使TimeoutInterval变小,使后面的报文出
    现过早超时!

      一旦报文段收到并更新EstimatedRTT后,TimeoutInterval又使用上述公式。


      此文为《计算机网络 自顶向下方法》的学习笔记4

  • 相关阅读:
    ASP.NET MVC 2 RC 2 发布
    [备忘]XCode快捷键
    ASP.NET MVC v2 Priview 2发布
    Senparc.com Google Sitemap Builder v1.0提供免费定制服务申请
    [备忘]SQL Server 字符集更改
    ASP.NET MVC脚手架辅助工具——MvcScaffoldTool v2.0版本发布,支持Area自动映射
    [备忘]SQL Server 2005数据库varchar插入中文出现乱码的一种可能及解决办法
    [备忘]苹果系统MAC OS X 10.5.6 (雪豹 snowleopard 10.5.6) 启用root方法
    准备好好看看《编程珠玑》
    格式化输入/输出
  • 原文地址:https://www.cnblogs.com/myworld7/p/8372456.html
Copyright © 2020-2023  润新知