一、概述

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的更多相关文章

  1. TCP系列16—重传—6、基础快速重传(Fast Retransmit)

    一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...

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

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

  3. TCP系列49—拥塞控制—12、DSACK下的拥塞撤销

    一.概述 DSACK下的虚假重传的检测我们之前重传部分的文章已经介绍过了,这里简单说一下拥塞控制部分的实现. linux内部会维护一个undo_retrans状态变量,其值为已经重传的次数减掉被DSA ...

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

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

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

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

  6. TCP系列25—重传—15、DSACK虚假重传探测

    一.DSACK介绍 RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容).RFC2 ...

  7. TCP系列23—重传—13、RACK重传

    一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...

  8. TCP系列20—重传—10、早期重传(ER)

    一.介绍 在前面介绍thin stream时候我们介绍过有两种场景下可能不会产生足够的dup ACK来触发快速重传,一种是游戏类响应交互式tcp传输,另外一种是传输受到拥塞控制的限制,只能发送少量TC ...

  9. TCP系列17—重传—7、SACK下的重传

    我们之前介绍SACK选项的时候说过,SACK可以把接收端系列号空间的洞反映给发送端,因此发送端可以更充分的理解接收端的情况,而进行更好的重传恢复过程.这种过程有时候也叫做advanced loss r ...

随机推荐

  1. windows下MySQL免安装版配置教程mysql-8.0.12-winx64.zip版本

    引用1:https://blog.csdn.net/weixin_42831477/article/details/81589325 引用2:https://blog.csdn.net/qq_3193 ...

  2. Hive(8)-常用查询函数

    一. 空字段赋值 1. 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value).它的功能是如果value为NULL,则NVL函数返回default_v ...

  3. 关于python的菜鸟教程

    1.正则表达式 http://www.runoob.com/regexp/regexp-metachar.html 2.python正则表达死 http://www.runoob.com/python ...

  4. JPMML解析PMML模型并导入数据进行分析生成结果

    JPMML解析Random Forest模型并使用其预测分析 导入Jar包 maven 的pom.xml文件中添加jpmml的依赖 <dependency> <groupId> ...

  5. python教程(一)·简介

    先简单介绍下python.(真的很简单) python是什么? Python是Guido van Rossum发布于1991年的一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,是一种解释型的 ...

  6. React 源码中的依赖注入方法

    一.前言 依赖注入(Dependency Injection)这个概念的兴起已经有很长时间了,把这个概念融入到框架中达到出神入化境地的,非Spring莫属.然而在前端领域,似乎很少会提到这个概念,难道 ...

  7. for循环简单实例(打印乘法表,打印菱形)

    关于for循环的简单应用: 回顾了一下for循环的嵌套: for循环嵌套简单来讲就是一个外圈的for程序里面一个套着一个小的for程序,如果在范围内就来回运行计算,超出了就跳出等待 下面程序为打印九九 ...

  8. 中国大学MOOC-C程序设计(浙大翁恺)—— 素数和

    题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的 ...

  9. Qt——styleSheet

    1.两个地方调用 QWidget::setStyleSheet() QApplication::setStyleSheet() 2.基本语法 selector {attribute : value} ...

  10. FPGA学习之路——PLL的使用

    锁相环(PLL)主要用于频率综合,使用一个 PLL 可以从一个输入时钟信号生成多个时钟信号. PLL 内部的功能框图如下图所示: 在ISE中新建一个PLL的IP核,设置四个输出时钟,分别为25MHz. ...