TCP系列52—拥塞控制—15、前向重传与RACK重传拥塞控制处理对比
一、概述
这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发RACK重传和前向重传,通过对比说明以下问题:
Forward Retransmit可以产生只有重传标记的数据包,也可以产生同时具有重传标记和SACK标记的数据包,注意这里说的这些数据包是没有Lost标记的,这是前向重传与之前介绍的快速重传及其变种的差异,进而会对in_flight的统计产生影响。
-
Recovery状态,FACK会利用一个dup ACK来前向标记丢失的数据包。
RACK可以利用重传在时间域来标记丢失的数据包,而重传报文和初传报文在系列号空间重叠,因此传统的基于系列号空间的标记方法不能利用重传标记丢失的数据包。
RACK并没有实现协议中的"reordering settling"定时器。
RACK目前linux4.4限制只能在Recovery状态或者Loss状态下使用,但是时间域标记的RACK在原理上与传统的系列号空间标记Lost的原理是相互独立的,所以RACK实际上也可以单独使用
RACK重传和前向重传的基本原理前面已经介绍过,这里不再重复介绍。
二、wireshark示例
业务场景:server端建立连接后休眠1s,然后以3ms为间隔连续写入9个数据包,每个数据包的大小都是50bytes。client正常接收到了第1个数据包和第8个数据包,另外第6个数据包的重传client也没有接收到。下面两个示例中,我黑底白字高亮标记出来的数据包是传输过程中丢失的数据包。路由设置如下
******@Inspiron:~$ sudo ip route add local 127.0.0.2 dev lo congctl reno initcwnd 12 ssthresh lock 30 #参考本系列destination metric文章
******@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重传拥塞控制处理对比的更多相关文章
- TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...
- TCP系列44—拥塞控制—7、SACK关闭的快速恢复
) return; delta = ssthresh - in_flight; prr_delivered += newly_acked_sacked; if (delta < 0 ...
- TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)
一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...
- TCP系列11—重传—1、TCP重传概述
在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...
- TCP系列24—重传—14、F-RTO虚假重传探测
一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...
- TCP系列22—重传—12、Forward Retransmit
一.概述 forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义.forward retransmit中文名可以 ...
- TCP系列18—重传—8、FACK及SACK reneging下的重传
一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...
- TCP具体解释(3):重传、流量控制、拥塞控制……
传输数据 在TCP的数据传送状态.非常多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号.对收到的TCP报文段进行排序以及检測反复的数据:使用校验和来检測报文段的错误.使用确认和计时器来检測 ...
- TCP系列55—拥塞控制—18、其他拥塞控制算法及相关内容概述
前面我们演示分析了100+个wireshark TCP实例,拥塞控制部分也介绍常见的拥塞处理场景以及4种拥塞撤销机制,但是我们一直使用的都是reno拥塞控制算法.实际上拥塞控制发展到今天已经有了各种各 ...
随机推荐
- VB6 red write DB using Microsoft DAO 3.6 Object Library
' -----------------------------read db Private Sub Form_Load() 'MsgBox App.Path & "\wgscd.m ...
- MYSQL注入天书之盲注讲解
Background-2 盲注的讲解 何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面.此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注.从ba ...
- 2-[Mysql]- 初识sql语句
1.统一字符编码 强调:配置文件中的注释可以有中文,但是配置项中不能出现中文 mysql> \s # 查看字符编码 # 1.在mysql的解压目录下,新建my.ini,然后配置 #mysql5 ...
- 【FJOI2016】建筑师
安利另外一篇\(blog\) 密码泥萌都知道 题面 题解 为了描述方便,这里将建筑称作\(zsy\) 高度为\(n\)的\(zsy\)无论如何都能从左右两侧看到.剩下的部分,从左边看到的是前缀\(ma ...
- python-利用Python窗口可视化抽象开发山寨版翻译软件
1.图片展示: 2.写出上面图式的小脚本需要利用python两个方面的知识: (1)可视化库 (需用库:tkinter) (2)简单爬虫知识 (需用库:requests) 注意:爬虫在获取翻译信息时, ...
- Restful和WeBAPI学习笔记
1.restful是基于无状态的,所谓无状态就是说客户端和服务端的每次通话都是独立的,不存在session和cookie之类的保存状态的机制,基于该协议可实现简单的curd操作, 其操作分为get\p ...
- 并发系列(二)----Java内存模型
一 简介 在并发编程中,两个线程(A.B)同时操作一个普通变量的时候会出现线程A在操作变量时线程B也将变量操作了,此时线程A是无法感知变量发生变化的,造成变量改变错误.更据以上例子我们需要解决的问题就 ...
- 【转】sshpass-Linux命令之非交互SSH密码验证
sshpass-Linux命令之非交互SSH密码验证 ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次 ...
- cnblogs客户端配置说明
1. 下载地址 http://openlivewriter.org/ 2.安装 安装时设置好blog地址和账户.密码: 到这里基本上就算安装完成了.如果之前的自动配置没有成功,会出现一个界面让你配置b ...
- 《Python 网络爬虫权威指南》 分享 pdf下载
链接:https://pan.baidu.com/s/1ZYEinjOwM_5dBIVftN42tg 提取码:1om6