zoukankan      html  css  js  c++  java
  • TCP系列14—重传—4、Karn算法和TSOPT的RTTM

    一、Karn算法

           在RTT采样测量过程中,如果一个数据包初传后,RTO超时重传,接着收到这个数据包的ACK报文,那么这个ACK报文是对应初传TCP报文还是对应重传TCP报文呢?这个问题就是retransmission ambiguity problem。当没有使用TSOPT选项,单纯的ACK报文并不会指示对应初传包还是重传包,因此就会发生这个问题。

            Karn算法指出,当RTO超时重传发生时候,我们不能依据这个TCP报文的ACK信息来更新RTT估计值。这是Karn算法的第一部分,如之前所说这个是RFC6298要求的。

            但是另一方面,如果我们在更新RTO时候只是简单的忽视重传报文信息,可能会丢失一些关于网络状况的信息。例如当网络由于负载等原因导致时延变大的时候,降低发送速率更有助于改善网络状况,因此当进行RTO超时重传时候需要进行指数回退。TCP在RTO上应用一个backoff factor,在每次重传超时的时候,backoff factor进行倍增,直到收到一个对应未重传报文(只进行了初传没有进行重传)的ACK包的时候,backoff factor回退到1。这个过程就是Karn算法的第二部分。

    二、TSOPT的RTTM

            我们在之前介绍TSOPT选项的时候就说过,TSOPT选项可以用来进行round-trip time measurement(RTTM)。因为TSval值通过反方向TCP报文中的TSecr字段回显,那么根据当前时钟和TSecr的差异就可以进行RTT测量。

            当TSopt选项使用的时候,每个接收到的TCP报文都会包含一个TSecr值,但是并不是每个TSecr值都可以用来进行RTT测量的更新。想想一个简单的场景,A给B发送了一个数据包,B回复ACK后,A暂时没有数据要传输,过了一段时间(如1000s)后,A又有新数据包进行传输,当这个新数据包到达B后,这个数据包中的TSecr和当前时钟的差距因为中间存在没有数据传输的空闲状态而变得很大,因此不能用于进行RTT测量。为了解决这个问题,有个规则:在一个TCP报文中接收到的TSecr值可以用于进行RTT测量的前提条件是这个数据包TCP头中的ack number确认了新的数据(即让TCP发送窗的左边向前滑行了)。

           当在一个回显TSval值的TCP报文发送之前收到多个带有TSopt选项的报文的时候,TCP必须选择一个合适的TSval用来回复而忽视其他的值。下面分几种情况来说明

    1)、延迟 ACK

    许多TCP对于到达时间间隔很短的TCP数据报文,经常会隔一个报文回复一个ACK,这种策略就叫做延迟ACK(delayed ACK),数据报文的发送端必须测量包括延迟ACK导致的额外时间的有效RTT,因此在延迟ACK使用的时候,接收端应该回显最先接收到的而且还没有回复ACK的报文的TSval值

    2)、接收的系列号空间存在洞的时候

    当发生数据包的丢失,接收端收到乱序报文的时候,会对乱序报文回复重复ACK以触发快速重传(后面介绍快速重传)。丢失的数据包可能是网络负载过重发生拥塞的一个指示,在这种场景下发送端的重传行为应该更保守一些(即增大RTO,减缓重传发送速率),因此把RTT估计过大一些可能更有助于改善网络传输情况(后面拥塞控制会进一步介绍)。因此对于乱序报文的ACK确认包中的TSecr值应该是最近收到的触发接收滑窗前移的报文的TSval值。这里触发接收滑窗迁移的报文是指收到的数据报文的系列号正好是预期接收的连续系列号。当传输过程中发生数据包乱序的时候也会发生相同的场景。

    3)、系列号空间的洞被填充的时候

    当接收到的TCP报文填充了系列号空间的洞并推进了接收窗前移的时候,这个报文反映了网络传输最新的状况,在TSecr回显的时候应该使用这个报文中的TSval。

    协议中描述了一个可以覆盖以上三种情况的算法,算法如下:

    1)、每个TCP endpoint维护两个32-bit的状态变量。TS.Recent保存了一个时间戳,当向外发送数据包的时候,TSecr值就取自TS.Recent。另外还有一个Last.ACK.sent保存着上一个发出的数据包的ack number。一在非延迟ACK场景下,Last.ACK.sent反映了endpoint预期接收的数据包。

    2)、如果新接收的数据包SEG同时满足下面两个条件SEG.TSval >= TS.Recent 和 SEG.SEQ <= Last.ACK.sent,那么就设置TS.Recent = SEG.TSval。否则忽略这个TSval值。

    3)、当发送的数据包带有TSopt选项的时候,设置TSecr字段为TS.Recent。

            另外我们之前说过RFC6298中标准方法计算RTO的时候是假设在一个RTT里面至少进行一个RTT采样,在应用TSopt后,在一个RTT里面可以进行多个RTT采样,如果仍然使用RFC6298中的计算方法就会导致,历史值的影响减弱(尤其是链路传输性质是以几个RTT的时间粒度变化的时候),RTO估计不准而造成无效重传,因此需要对标准方法中的alpha和beta按照如下修正。

     ExpectedSamples = ceiling(FlightSize / (SMSS * 2))      

    alpha' = alpha / ExpectedSamples      

    beta' = beta / ExpectedSamples

    其中FlightSize表示发送端已经发出的但是还没有收到ACK的报文大小,SMSS表示发送端的MSS,其中的系数2用于修正延迟ACK。





  • 相关阅读:
    SQL获得表的行数
    sql server2008用ip远程连接
    sql设置字段默认值
    用c# 实现设计器 DesignSurface<转>
    DSOFramer.ocx 控件使用<转>
    浅谈JavaScript编程语言的编码规范<转>
    主要是取得2個Collection 裏,相同、相異、聯集的部份<转>
    VS2008无法切换到视图设计器
    使用HttpModule来禁用Web表单重复提交<转>
    WebIM组件设计<转>
  • 原文地址:https://www.cnblogs.com/lshs/p/6038536.html
Copyright © 2011-2022 走看看