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。
TCP系列14—重传—4、Karn算法和TSOPT的RTTM的更多相关文章
- TCP系列12—重传—2、Linux超时重传引入示例
在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...
- TCP系列24—重传—14、F-RTO虚假重传探测
一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...
- TCP系列16—重传—6、基础快速重传(Fast Retransmit)
一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...
- TCP系列13—重传—3、协议中RTO计算和RTO定时器维护
从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...
- TCP系列11—重传—1、TCP重传概述
在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...
- TCP系列25—重传—15、DSACK虚假重传探测
一.DSACK介绍 RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容).RFC2 ...
- TCP系列23—重传—13、RACK重传
一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...
- TCP系列22—重传—12、Forward Retransmit
一.概述 forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义.forward retransmit中文名可以 ...
- TCP系列18—重传—8、FACK及SACK reneging下的重传
一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...
随机推荐
- mysql的docker化安装
mysql版本有很多,先看下各类版本号说明: 3.X至5.1.X:这是早期MySQL的版本.常见早期的版本有:4.1.7.5.0.56等. 5.4.X到5.7.X:这是为了整合MySQL AB公司社区 ...
- python打印九九乘法表
每种编程语言都可能会遇到编写“九九乘法表”的问题,用Python来处理也是很简单的,具体代码如下(基于Python3)): i = 1 while i <= 9: j = 1 while j & ...
- Go 入门 - Go中的复杂类型
主要内容来自中文版的官方教程Go语言之旅 目的为总结要点 指针 Go 拥有指针.指针保存了值的内存地址. 类型 *T 是指向 T 类型值的指针.其零值为 nil. var p *int & 操 ...
- 深入解析Dropout
过拟合是深度神经网(DNN)中的一个常见问题:模型只学会在训练集上分类,这些年提出的许多过拟合问题的解决方案:其中dropout具有简单性并取得良好的结果: Dropout 上图为Dropout的可视 ...
- 封装axios方法之一
一.先来说说为什么要封装axios异步请求. 我们前端开发中总是会遇到跨域的问题,我们会配置proxy来解决跨域的问题,无论是vue 还是react. 如何配置我这里就不说了. 然后...然后我们就会 ...
- 成都Uber优步司机奖励政策(3月22日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- linux初学体会
第一篇随笔,其实是为了写作业,可是老师的要求是对的,其实自己在配环境和做作业的时候也会把遇到的问题的解决方法记录下来,以便以后查找方便.这次借此将那些内容放在这里,也跟大家一起分享下. 上周六算是第二 ...
- web自动化测试框架总结
web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09
- Python 集合内置函数大全(非常全!)
Python集合内置函数操作大全 集合(s).方法名 等价符号 方法说明 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s 中所有的元素都是 t 的成员 s ...
- Java开发工程师(Web方向) - 04.Spring框架 - 期末测试
Spring框架客观题 Spring框架编程题 http://blog.csdn.net/sinoacc/article/details/51702458 1 (25分) 假设有如下数据表: crea ...