TCP系列22—重传—12、Forward Retransmit
一、概述
forward retransmit相关的内容在RFC6675中有描述,可以参考RFC6675 section 4中NextSeg ()的定义。forward retransmit中文名可以叫做前向重传,我这里简单说一下linux实现上的前向重传
在快速重传(包括快速重传的各种变种)到达Recovery point之前,都会尝试重传标记为lost的数据包,当把标记为lost的数据包重传完毕后,如果同时满足下面几个条件:
1、当前拥塞控制处于Recovery状态,且在尝试重传数据包的时候,拥塞窗口允许TCP传输数据包
2、TCP连接没有待发送的数据包或者受限于window size、nagle算法等而不能发送
3、TCP连接支持SACK功能
当同时满足上面三个条件的时候,如果已经被SACK确认的最高的系列号与当前已经重传过的数据包之间存在未被SACK确认且未重传过的数据包,那么TCP就会尝试前向重传这些未进行过重传的数据包。
其实前向重传并不复杂,但是前向重传相比其他的重传方式在拥塞控制时候有自身的特殊性,后续介绍拥塞控制的时候进行介绍,下面我们通过wireshark来看一个具体示例。
二、wireshark示例
1、forward retransmit简单示例
在进行下面的测试前需要设置tcp_recovery=0,以关闭RACK重传机制,RACK重传优先于前向重传,因此当打开RACK的时候,RACK会先起作用把数据包标记为lost,并进行重传。后续文章介绍RACK。
业务场景:server端与client端建立连接休眠1000ms后,以3ms为间隔连续发送9个数据包No4-No12,每个数据包的大小为50bytes,其中只有No4和No11数据包成功到达接收端,其余数据包均在传输过程中丢失,我把传输丢失的数据包设置了高亮显示。
No1-No3:client与server端建立连接,SYN报文中协商了MSS=62,扣除TSopt选项的12bytes后,server端最多只能传输50bytes的数据,因此server端在重传的时候不会进行重组包(后续详细介绍)。
No4-No12:server端发出对应的数据包,其中只有No4和No11成功传输到client端。其实数据包传输过程中丢失。
No13:对应No4报文的ACK确认包
No14-No15:对应No11报文的ACK确认包,可以看到这是一个dup ACK,此时fackets_out=7,dupthresh=3,fackets_out-dupthresh=4。因此server端把No5、No6、No7、No8这四个数据包标记为lost。接着server端先重传No5数据包,受限于拥塞控制,其余数据包暂时还不能进行重传。
No16-No18:server端收到No16这个确认包后,拥塞控制进行更新,允许server端发出两个数据包,因此server端接着重传No6和No7数据包,即对应No17和No18。
No19-No20:server端收到No19后,拥塞控制允许发出一个数据包,因此server端重传No8数据包,即对应No20。
No21-No22:server端收到No21后,拥塞控制进行更新后允许发出一个数据包,此时被标记为lost的4个数据包都已经进行了重传,同时server端也没有新数据等待发送,因此server端进行前向重传,重传No9数据包,这里注意No9数据包并没有被标记为lost,但是同样进行了重传。
No23-No24:这组数据包的处理与No21-No22类似。
No25:server端收到No25的时候,虽然拥塞控制允许发出数据包,但是此时被SACK确认的最高系列号为401(实际上是最高系列号的下一个系列号),在系列号401之前已经没有未被SACK确认且未重传过的数据包了,因此尝试前向重传失败,没能发出数据包。这里可以看到虽然No12数据包也丢失了,但是前向重传并不会重传No12。
No26:server端收到No26后重启RTO定时器,定时时间大约为250ms
No27-No28:RTO超时后把No27标记为lost,并重传No27,接着收到No27的确认包,整个传输过程结束。

TCP系列22—重传—12、Forward Retransmit的更多相关文章
- TCP系列16—重传—6、基础快速重传(Fast Retransmit)
一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...
- TCP系列11—重传—1、TCP重传概述
在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...
- TCP系列49—拥塞控制—12、DSACK下的拥塞撤销
一.概述 DSACK下的虚假重传的检测我们之前重传部分的文章已经介绍过了,这里简单说一下拥塞控制部分的实现. linux内部会维护一个undo_retrans状态变量,其值为已经重传的次数减掉被DSA ...
- TCP系列24—重传—14、F-RTO虚假重传探测
一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...
- TCP系列18—重传—8、FACK及SACK reneging下的重传
一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...
- TCP系列25—重传—15、DSACK虚假重传探测
一.DSACK介绍 RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容).RFC2 ...
- TCP系列23—重传—13、RACK重传
一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...
- TCP系列20—重传—10、早期重传(ER)
一.介绍 在前面介绍thin stream时候我们介绍过有两种场景下可能不会产生足够的dup ACK来触发快速重传,一种是游戏类响应交互式tcp传输,另外一种是传输受到拥塞控制的限制,只能发送少量TC ...
- TCP系列17—重传—7、SACK下的重传
我们之前介绍SACK选项的时候说过,SACK可以把接收端系列号空间的洞反映给发送端,因此发送端可以更充分的理解接收端的情况,而进行更好的重传恢复过程.这种过程有时候也叫做advanced loss r ...
随机推荐
- Flask之蓝图的使用
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- windows下nginx的安装
一. 下载 http://nginx.org/ (下载后解压) 二. 修改配置文件 nginx配置文件在 nginx-1.8.0\conf\nginx.conf http { gzip on; ...
- shell中的死记硬背
一.shell的引号们 1."" -> 双引号(不保留完整内容,比如遇到$, 反引号, \ 等就会执行相应的shell) echo "Today is `date` ...
- fiddler请求报文的headers属性详解
fiddler请求报文的headers属性详解 headers的属性包含以下几部分. (1)Cache头域 在Cache头域中,通常会出现以下属性. 1. Cache-Control 用来指定Resp ...
- 从零开始一个http服务器(二)-请求request解析
从零开始一个http服务器 (二) 代码地址 : https://github.com/flamedancer/cserver git checkout step2 解析http request 观察 ...
- FPGA学习之路——PLL的使用
锁相环(PLL)主要用于频率综合,使用一个 PLL 可以从一个输入时钟信号生成多个时钟信号. PLL 内部的功能框图如下图所示: 在ISE中新建一个PLL的IP核,设置四个输出时钟,分别为25MHz. ...
- nio之netty5应用
1.netty5和netty4的区别不是很大,但是与netty3差别还是有的.这里不介绍netty4,因为和netty5的方式都差不多.netty5的复杂性相对于netty3要多很多了.基本上架构都被 ...
- docker社区的geodata/gdal镜像dockerfile分析
对应从事遥感与地理信息的同仁来说,gdal应该是所有工具中使用频度最高的库了,那么在docker中使用gdal时,面临的第一步就是构建gdal基础镜像,社区中引用最多的就是geodata提供的gdal ...
- Java注解的基本原理
注解的本质就是一个继承了Annotation接口的接口,一个注解准确意义上来说,只不过是一种特殊注释而已,如果没有解析他的代码,他可能连注释都不如. 解析一个类或者方法的注解往往有两种形式,一种是编译 ...
- leetcode-组合总数III(回溯)
组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 ...