一、概述

DSACK下的虚假重传的检测我们之前重传部分的文章已经介绍过了,这里简单说一下拥塞控制部分的实现。

linux内部会维护一个undo_retrans状态变量,其值为已经重传的次数减掉被DSACK检测到的虚假重传的次数,例如当前总共重传了5个数据包,DSACK检测到3个虚假重传,那么undo_retrans即为2。undo_retrans初始化为-1,当发生重传的时候,如果undo_retrans为-1那么就更新undo_retrans=1,否则更新undo_retrans=undo_retrans+1。这样当undo_retrans=0的时候,就表示DSACK已经检测到之前的重传都是虚假重传,可以进行拥塞撤销过程了。DSACK块只能在ACK报文中传输一次,因此当传输DSACK信息的ACK报文丢失的时候,DSACK下的拥塞撤销就不能生效了。下面我们通过DSACK下的拥塞撤销实例来看一下DSACK下的拥塞撤销过程。

二、wireshark示例

1、Open状态下DSACK的拥塞撤销
在这个示例中我们除了观察DSACK的拥塞撤销外还要看一下TSopt的协商问题。我们之前介绍TSopt选项的时候介绍过,如果server与client端协商好TSopt选项后,但随后接收到不带有TSopt选项的数据的时候,协议说TCP应该静默的丢弃这个报文(注意协议描述是应该should而不是必须must),我们提到过linux则会正常接收这个报文,通过这个示例顺便来演示一下。在运行示例前如下设置相关参数。

  1. ******@Inspiron:~$ sudo ip route add local 127.0.0.2 dev lo congctl reno initcwnd 4    #参考本系列destination metric文章
  2. ******@Inspiron:~$ sudo ethtool -K lo tso off gso off  #关闭tso gso以方便观察cwnd变化

业务场景:server端在与client端建立连接后,休眠1002ms,然后连续进行17次write写入操作,每次写入50bytes数据,每次写入间隔5ms。其中高亮的No6数据包发生了乱序传输,在No11之后到达client端,client对每个收到的数据包都会回复一个ACK确认包。注意下面的示例中,server端的TCP在Open状态下,通过拥塞撤销,从拥塞避免切换到了慢启动。

No1-No3:client与server端通过三次握手建立连接,注意三次握手这里协商了TSopt,其余的废话不多说了

No4-No24:这里前面也解释过很多类似场景了,这里可以看到No4数据包没有TSopt选项,但是server端TCP依然正常接收了,另外需要补充说明的一点是server收到No17后,从Disorder模式切换到Recovery模式时候,会初始化undo_retrans=-1,然后在重传了No18后,设置undo_retrans=1。最终在发出No24后,server端处于Open状态,正在进行拥塞避免过程,prior_ssthresh=0x7fffffff, ssthresh=2, cwnd=2, cwnd_cnt=1, packets_out=2, sacked_out=0, lost_out=0, retrans_out=0, fackets_out=0,undo_retrans=1,undo_marker非0表示允许进行拥塞撤销。

No25-No27:可以看到No25带有一个DSACK块,通知server端重复收到了系列号为(51,101)的报文,server端在收到这个DSACK块的时候,更新undo_retrans=undo_retrans-1=0,接着server端发现当前undo_marker非0,即上次快速重传还没有进行过拥塞撤销,同时undo_retrans=0,因此判断之前的快速重传为虚假重传,接着进行拥塞撤销的过程,更新cwnd=max(cwnd,2*ssthresh)=4,ssthresh=max(ssthresh,prior_ssthresh)=0x7fffffff,此时in_flight=2-(0+0)+0=2,拥塞窗口允许TCP发出两个新数据包,即No26、No27,然后更新packets_out=4。这里要注意No25的SACK选项中带有的是一个DSACK块,因此并不会更新sacked_out,也不会触发server从Open状态切换到Disorder状态了。

No28-No41:server端在收到No25进行拥塞撤销后,又进入慢启动阶段,随后进入application-limited状态,这个过程不再重复叙述,最终server端在收到No41后,ssthresh=0x7fffffff,cwnd=12。

TCP系列49—拥塞控制—12、DSACK下的拥塞撤销的更多相关文章

  1. TCP系列50—拥塞控制—13、Eifel探测下的拥塞撤销

    一.概述 我们之前在SACK关闭场景下的拥塞撤销那篇文章中提到过Eifel探测算法(Eifel Detection Algorithm),最早在介绍DSACK和FRTO的时候我们就有提到过Eifel探 ...

  2. TCP系列46—拥塞控制—9、SACK下的快速恢复与Limited transmit

    一.概述 1.SACK下的特殊处理过程 SACK下的拥塞控制处理是linux中拥塞控制的实现依据,再次强调一遍RFC6675的重要性,linux中拥塞控制主体框架的实现是与RFC6675一致的,所以如 ...

  3. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

    一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...

  4. TCP系列48—拥塞控制—11、FRTO拥塞撤销

    一.概述 FRTO虚假超时重传检测我们之前重传章节的文章已经介绍过了,这里不再重复介绍,针对后面的示例在说明两点 1.FRTO只能用于虚假超时重传的探测,不能用于虚假快速重传的探测. 2.延迟ER重传 ...

  5. TCP系列51—拥塞控制—14、TLP、ER与拥塞控制

    一.概述 这里的重点是介绍TLP.ER与拥塞控制并不是介绍TLP和ER本身,因此TLP和ER的详细内容请翻前文. 在TLP与拥塞控制的交互中有几个点需要注意 1.TLP触发的重传后,TCP仍然处于Op ...

  6. TCP系列40—拥塞控制—3、慢启动和拥塞避免概述

    本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程. 一.慢启动(slow start) 一个T ...

  7. TCP系列55—拥塞控制—18、其他拥塞控制算法及相关内容概述

    前面我们演示分析了100+个wireshark TCP实例,拥塞控制部分也介绍常见的拥塞处理场景以及4种拥塞撤销机制,但是我们一直使用的都是reno拥塞控制算法.实际上拥塞控制发展到今天已经有了各种各 ...

  8. TCP系列54—拥塞控制—17、AQM及ECN

    一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...

  9. TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)

    一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...

随机推荐

  1. Tomcat优化(心得经验)

    最近用httpclient做performance testing时,发现当线程加到150时服务端就会抛出socket资源用尽的错误,根本没法再往上加,响应的速度也是相当的慢,后来经过研究,发现在se ...

  2. elasticsearch_dsl 的nested

    在工作中会碰到这样的一个需求,mapping中定义的类型是nested { "judgement":{ "mappings":{ "content&q ...

  3. 一个C语言萌新的学习之旅(持续更新中...)

    三:计算和类型 一:隐式转换和显示转换 隐式转换:隐式转换指的是自动类型转换,自动向精确,大范围类型转换. 显示转换:例如:(int)3.5*6.0f=18.0f (int)(3.5*6.0f)=21 ...

  4. uva 156 - Ananagrams (反片语)

    csdn:https://blog.csdn.net/su_cicada/article/details/86710107 例题5-4 反片语(Ananagrams,Uva 156) 输入一些单词,找 ...

  5. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  6. AC自动机(简单版)(施工ing)

    声明 想看加强版的戳这里(施工ing,作者正努力中)~ 先贴题目吧哎~   AC自动机加强版  洛谷 P3796 题目: 洛谷 P3808 (数据范围困了我好久 TAT) 反正涉及字符串的算法都很玄学 ...

  7. 20155327 2016-2017-2 《Java程序设计》第10周学习总结

    20155327 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. ...

  8. rem布局注意问题和meta标签

    使用rem前的准备: 如果是移动端,添加name="viewport"的meta标签,其中的属性数值根据实际需求而定: <meta name="viewport&q ...

  9. 海思NB-IOT的SDK里面写KV键值对值掉电保存参数

    1. 写函数,ICCID_CTRL_KEY  这个是键,有些是海思已经使用的,所以自己定义的时候要错开,函数的第二个参数是数据指针,第三个参数是数据长度 #define ICCID_CTRL_KEY ...

  10. 深入解析QML引擎, 第3部分: 绑定类型

    原文 QML Engine Internals, Part 3: Binding Types 译者注:这个解析QML引擎的文章共4篇,分析非常透彻,在国内几乎没有找到类似的分析,为了便于国内的QT/Q ...