一、概述

这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发RACK重传和前向重传,通过对比说明以下问题:

  1. Forward Retransmit可以产生只有重传标记的数据包,也可以产生同时具有重传标记和SACK标记的数据包,注意这里说的这些数据包是没有Lost标记的,这是前向重传与之前介绍的快速重传及其变种的差异,进而会对in_flight的统计产生影响。

  2. Recovery状态,FACK会利用一个dup ACK来前向标记丢失的数据包。

  3. RACK可以利用重传在时间域来标记丢失的数据包,而重传报文和初传报文在系列号空间重叠,因此传统的基于系列号空间的标记方法不能利用重传标记丢失的数据包。

  4. RACK并没有实现协议中的"reordering settling"定时器。

  5. RACK目前linux4.4限制只能在Recovery状态或者Loss状态下使用,但是时间域标记的RACK在原理上与传统的系列号空间标记Lost的原理是相互独立的,所以RACK实际上也可以单独使用

RACK重传和前向重传的基本原理前面已经介绍过,这里不再重复介绍。

二、wireshark示例

业务场景:server端建立连接后休眠1s,然后以3ms为间隔连续写入9个数据包,每个数据包的大小都是50bytes。client正常接收到了第1个数据包和第8个数据包,另外第6个数据包的重传client也没有接收到。下面两个示例中,我黑底白字高亮标记出来的数据包是传输过程中丢失的数据包。路由设置如下

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

快速恢复过程中拥塞窗口cwnd的PRR更新过程前面已经介绍过多次了,不再详细逐包解释,重点关注sack标记的变化、RACK利用重传标记lost等相关点。

1、Forward Retransmit

设置tcp_recovery=0关闭RACK重传,我们先来看一下前向重传的效果。

No1-No3:client与server端三次握手建立连接。初始ssthresh=30,初始cwnd为12,拥塞控制处于Open状态。

No4-No12:server端在休眠1000ms后,连续发送9个数据包,每个数据包的发送间隔为3ms,其中只有No4和No11数据包顺利到达client端,其余数据包丢失。

No13:client对于No4报文响应,确认接收到了No4,server端更新cwnd=13。

No14-No15:No14是对应No11报文的ACK确认包,可以看到这是一个dup ACK,此时fackets_out=7,dupthresh=3,fackets_out-dupthresh=4。因此server端把No5、No6、No7、No8这四个数据包标记为lost。接着server端先重传No5数据包,发出No15后,packets_out=8,sacked_out=1, lost_out=4, retrans_out=1,ssthresh=6,cwnd = 4,server端直接从Open状态切换到Discovery状态。

No16-No18:server端收到No16这个确认包后,拥塞控制进行更新,允许server端发出两个数据包,因此server端接着重传No6和No7数据包,即对应No17和No18,packets_out=7,sacked_out=1, lost_out=3, retrans_out=2,ssthresh=6,cwnd = 5。

No19-No21:server端收到No19后,拥塞窗口更新后,因此server端重传No8数据包,即对应No20,此时cwnd还允许发出新的数据包,但是被标记为lost的4个数据包都已经进行了重传,同时server端也没有新数据等待发送,因此server端进行前向重传,重传No9数据包,对应No21。注意这里No21报文并没有被标记为lost状态,但是前向重传后,No21会被标记为Retrans,这就意味着着一个数据包要统计为两个in_flight,这是前向重传与其他重传方式的差异点。发出No21后,packets_out=6,sacked_out=1, lost_out=2, retrans_out=3,ssthresh=6,cwnd = 6。注意这里retrans_out已经比lost_out高了。

No22-No23:server端收到No22后,cwnd更新允许发出一个数据包,此时继续前向重传No10数据包,对应No23,传输完No23后packets_out=5,sacked_out=1, lost_out=1, retrans_out=3,ssthresh=6,cwnd = 6。

No24:server端在收到这两个数据包的时候已经没有等待发送的新数据了,而前向重传已经传到了最高的SACK块,虽然No12数据包也丢失了,但是No12是系列号空间的尾包不会触发前向重传,因此server端cwnd更新后虽然允许传输数据包,但是TCP暂时没有可以传输的数据包。No24是partial ACK会重启RTO定时器,定时时间大约为250ms。packets_out=4,sacked_out=1, lost_out=0, retrans_out=2,ssthresh=6,cwnd = 6。

No25:No25通过SACK确认了前向重传的No23数据包,这时候No23数据包的状态则是同时具有Retrans和Sack标记,另外注意这个确认包是一个dup ACK,FACK下这个dup ACK会触发继续向前标记一个lost数据包,因此server端会把No9报文标记为lost,然后尝试重传的时候,发现实际No9数据包已经重传过了,因此不再进行重传尝试。最终packets_out=4,sacked_out=2, lost_out=1, retrans_out=2,ssthresh=6,cwnd = 4。

No26-No33:No24处设置的RTO定时器超时后,server端TCP进入loss状态,并把尾包No11也标记为loss状态,No10因为已经被SACK确认,因此不会标记为lost。接着server端进行RTO超时恢复过程,并在最后关闭连接。

2、rack

设置tcp_recovery=1打开RACK重传后,我们先来看一下RACK重传的效果,注意与前向重传对比。

No1-No15:与上面示例相似,不再重复介绍

No16-No18:No16这个报文确认了No15这个重传报文,No15报文发出的时间点为1.123581s,server端在收到No16这个报文的时候,RACK会把1.122581s之前发送的还未被ack number或者SACK确认的数据包标记为lost,因此No9、No10、No12报文都会被标记为lost状态,可以RACK的一个重大改进是可以利用重传报文来标记lost了。cwnd更新后,server端发出两个数据包No17和No18。发出No18后packets_out=7,sacked_out=1, lost_out=6, retrans_out=2,ssthresh=6,cwnd = 2。

No19-No24:No19-No21这一组和No22-No24的处理都是类似的,收到partial ACK后,更新cwnd=in_flight + 2,然后发出两个新的数据包,这种场景前面介绍过多次,不再赘言。

No25:server端在收到No25报文后,重启RTO定时器,定时时间大约为250ms。

No26-No27:注意这两个报文通过SACK确认了No23和No24,虽然No23和No4都位于丢失的No21后面,但是三个数据发送的时间差并没有达到1ms,因此RACK不能标记No21丢失。

No28-No33:RTO定时器超时后,这里可以看到linux实现的RACK并没有实现"reordering settling"定时器功能,server端进入Loss状态,恢复后关闭了TCP连接。

TCP系列52—拥塞控制—15、前向重传与RACK重传拥塞控制处理对比的更多相关文章

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

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

  2. TCP系列44—拥塞控制—7、SACK关闭的快速恢复

    ) return;    delta = ssthresh - in_flight;     prr_delivered += newly_acked_sacked; if (delta < 0 ...

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

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

  4. TCP系列11—重传—1、TCP重传概述

    在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...

  5. TCP系列24—重传—14、F-RTO虚假重传探测

    一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...

  6. TCP系列22—重传—12、Forward Retransmit

    一.概述 forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义.forward retransmit中文名可以 ...

  7. TCP系列18—重传—8、FACK及SACK reneging下的重传

    一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...

  8. TCP具体解释(3):重传、流量控制、拥塞控制……

    传输数据 在TCP的数据传送状态.非常多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号.对收到的TCP报文段进行排序以及检測反复的数据:使用校验和来检測报文段的错误.使用确认和计时器来检測 ...

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

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

随机推荐

  1. Kotlin基础篇(一)

    写在前面: 因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin.由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚.所以想着开个博客,以此来记录自己的 ...

  2. 【转】枚举enum学习小记

    原帖: http://hi.baidu.com/yuleishou/item/caacae872190031ec216272f 表示在vs2008下实验了一下,有些东西和原帖的还是不一样的,都贴在这里 ...

  3. 【LNOI2014】LCA

    题面 题解 考察\(dep[\mathrm{LCA}(i, x)]\)的性质,发现它是\(i\)和\(x\)的链交的长度. 那么对每个\(i\)所在的链打一个区间加标记,询问时算一下\(x\)所在的链 ...

  4. jsp手动分页

    注意: sql语句要写对,jsp显示 List 时的 item的字段名要写对 这里 where uid 要放在前面才能成功执行,否则会报错 , 在写items的时候,如果controller里面已经写 ...

  5. Properties、ResourceBundle

    两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单. Properties 该类继承Hashtable,将键值对存储在集合中.基于输 ...

  6. js.ajax优缺点,工作流程

    1.ajax的优点 Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点: 1.最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好.  2.使用异步方式与服务器通信,不 ...

  7. 设置pdsh的默认登录模式

    1.check your pdsh default rcmd rsh pdsh -q -w localhostSee what your pdsh default rcmd is. 2.Modify ...

  8. codeblocks一些学习

    codeblocks下,怎样建立工程,进行多文件编译?如下是书上的两个文件. https://ask.csdn.net/questions/204326 codeblocks创建静态库并使用 http ...

  9. java学习(二)基础概念、语法

    对象 类的实例(通俗点讲,new出来的玩意好像都是对象?初学者的感觉,不造对错啊,有大神给我解释下可以啊) 类 class嘛,模板嘛,可以给对象实例的嘛 方法 行为,学编程的,方法,这玩意心里都懂吧, ...

  10. unity灯光烘焙设置详解

    游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...