一、概述

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. 大数据学习--day12(内部类)

    内部类学习     定义在类的内部的类  叫做内部类     包含了内部类的类 叫做外部类 内部类的作用      内部类是为了 实现 java中 多继承而存在的      内部类 可以继承其他类   ...

  2. 嵌入式C语言自我修养 07:地址对齐那些事儿

    7.1 属性声明:aligned GNU C 通过 __atttribute__ 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式.这两个属性用来告诉编译器:在给变量分配存 ...

  3. microPython环境安装及使用

    1.ESP8266_12E(NodeMCU1.0)(AI Thinker)板Arduino IDE环境安装 (1)方法1(自动安装,windows,mac,linux平台都可) http://ardu ...

  4. Shell学习积累//持续更新

    1.until的使用 直到判断条件满足,否则会一直执行,与while使用相反 until [ $command -eq 200 ] do command=`curl -o /dev/null -s - ...

  5. jenkins+maven+docker集成java发布(二)#远程发布

    jenkins+maven+docker集成java发布(一)中写了在Jenkins服务器自动部署业务,那需要将java项目部署到其他服务器怎么操作 这里需要依赖插件Publish Over SSH ...

  6. 复数 一级ADT实现

    COMPLEX.h /* typedef struct { float RE; //实部 float IM; //虚部 }Complex; */ typedef struct complex * Co ...

  7. 记账本app(1)

    今天开始做做这个app了,加油,目前在看视频,明天正式入手

  8. VS.NET2013发布网站的时候去掉.cs文件(预编译)(转)

      在要发布的网站上右键,选择"发布网站".   在发布窗口中,会让你选择一个发布配置文件,没有的话点击下拉菜单在里面选择新建一个. NEXT.   好,现在发布一下网站.发布出来 ...

  9. 20155305乔磊2016-2017-2《Java程序设计》第二周学习总结

    20155305乔磊 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 第三章学习了基本类型 整数(short.int.long) 字节(byte) 浮点数(f ...

  10. 20145226夏艺华 网络对抗技术EXP4 恶意代码分析

    20145226夏艺华 网络对抗技术EXP4 恶意代码分析(未完成版) 回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作 ...