zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/myworld7/p/8372456.html
Copyright © 2011-2022 走看看