一、概述

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. 无缘DELPHI的BUG

    有个很简单的小错误,看一眼好象是DELPHI的BUG,结果找了一个晚上,后面才发现出错还是自己造成的原因. CLIENTDATASET.LOCATE ! 以为它工作出问题了,后来仔细比对,原来有个数据 ...

  2. Zeta--S3 Linux抓取一帧YUV图像后使用硬件编码器编码成H.264

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h&g ...

  3. upload-labs19记录

    upload-labs19记录 本次做题为白盒,因为只是fuzz的话并不能学到什么,所以从漏洞源下手. 前端校验 Pass1 源码 function checkFile() { var file = ...

  4. CRLF注入学习

    预备 <CRLF>是换行符,CRLF注入顾名思义就是把换行符写入,那么要把换行符写入到哪里呢?看看下面的http头 可以看到,每一行都包含特定的头部信息,然后以换行为标志写入其他的头部信息 ...

  5. A1033

    找出最小开销. 思路: 出发点的加油站编号设为0,终点的加油站编号设为n,其他加油站编号按距离依次排序. 如果0号加油站的距离!=0,则无法出发,行驶距离为0. 从起点开始,寻找规则为,如果存在油价小 ...

  6. ie的盒模型和标准模型

    使用 box-sizing:content-box || border-box || inherit 原理图 计算 怪异模型|IE模型 div宽度(定死) = 内容宽度+border宽度+paddin ...

  7. ASP.NET Web Form 与 ASP.NET MVC 区别

    Asp.net 微软提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form ASP.NET Webform提供了一个类似于winf ...

  8. IDEA新建Web项目

    file->New project->输入项目名(例如这里输入HelloWeb) 选择JDK为合适版本->next ->finish即可 在新建的项目HelloWorld上右击 ...

  9. 网络中可以引用的jquery库

    网络项目可以直接引用这个jquery库 <script src="http://www.codefans.net/ajaxjs/jquery-1.4.2.min.js"> ...

  10. 20155213 第十二周课堂作业MySort

    20155213 第十二周课堂作业MySort 作业要求 模拟实现Linux下Sort -t : -k 2的功能 参考 Sort的实现 提交码云链接和代码运行截图 初始代码 1 import java ...