一、概述

这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发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. Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx 脚本如下: #!/bin/shnginx_home = /Data/app_1 ...

  2. [2016北京集训试题6]魔法游戏-[博弈论-sg函数]

    Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...

  3. 24-[jQuery]-案例

    1.仿淘宝导航栏案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. P3877 [TJOI2010]打扫房间

    xswl以为是个插头dp,然后发现就是个sb题 相当于就是个匹配.每个格子度数为2,所以可以匹配2个相邻的点.匹配显然的用网络流.最后check有没有不匹配的点即可. #include<bits ...

  5. 扩展gcd算法

    扩展gcd算法 神tm ×度搜索exgcd 打到exg的时候出来ex咖喱棒... 球方程\(ax+by=\gcd(a,b)\)的一个解 如果\(b=0\),那么\(\gcd(a,b)=a\),取\(x ...

  6. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  7. CSS快速入门-定位(position)

    一.概述 CSS 定位 (Positioning) 属性允许你对元素进行定位. 定位的基本思想很简单,它允许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的 ...

  8. Asp.Net Form验证不通过,重复登录(.net4,4.5form验证兼容性问题)

    问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...

  9. wordpress4.4+版本自动生成一个768w像素缩略图的解决办法

    4.4版本以后,wordpress增加了响应式图片的功能,目的是让图片能适应手机.平板等不同屏幕,但是我不想要这个功能,把缩略图大小全调成0,function.php里的相关函数全删除了, 上传图片还 ...

  10. 关于Myeclipse的MyEclipse:Java was started but returned exit code=-1 错误

    我们在安装MyEclipse后有时会遇到这样一个问题,可以进入主界面软件也属于激活状态,但是过一会会报错, 并弹出MyEclipse:Java was started but returned exi ...