一、概述

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. C# WebBrowser获取指定字符串的坐标

    public void FindKeyWord(string keyWord) { WebBrowser wb = new WebBrowser(); foreach (HtmlElement ite ...

  2. Redis 常用数据结构命令

    1. 字符串(string) 增加元素 set key value [EX seconds] [PX milliseconds] [NX|XX] EX seconds:为键设置秒级过期时间 PX mi ...

  3. Java中的File.separator用法

    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...

  4. linux 查看内置命令

    使用: man shell builtins 查找结果如下:

  5. lvs健康检查脚本第三版

    如下是学习完马哥视频lvs后改写的健康检查脚本第三版.利用工作之余三四个小时时间才把整个逻辑搞清楚,有时候自己都有点蒙圈,尤其是在写到while循环的时候.总的来说非常感谢马哥的慷慨解囊!脚本原稿及思 ...

  6. python2和python3的一些区别

    性能:py3.x起始比py2.x效率低,但是py3.x有极大的优化空间,效率正在追赶. 编码:py3原码文件默认utf-8编码,使得变量名更为广阔. 语法:1,去除了 <>  ,改用了  ...

  7. [Real World Haskell翻译]第20章 Haskell系统编程

    第20章 Haskell系统编程 到目前为止,我们已经讨论了大多数的高层次的概念.Haskell也可以用于较低级别的系统编程.很可能是用haskell编写出底层的与操作系统接口的程序. 在本章中,我们 ...

  8. BZOJ3293_分金币_KEY

    题目传送门 设x[i]表示i+1向i传的糖果数,x[n]表示1向n传的糖果数,a'=(a[1]+...a[N])/N a[1]+x[1]−x[n]=a' a[2]+x[2]−x[1]=a' a[3]+ ...

  9. CSS3中的动画

    CSS3中的动画包括两种: Transition(过渡) Animation(动画) 这两种方法都可以让元素动起来,功能类似,但是稍有区别: Transition只定义某一个元素的开始状态和结束状态 ...

  10. 金山WPS面试题

    1.windows的handle 1)是一个宏定义#define void* HANDLE 2) HANDLE提供了一种统一的方式去获得系统资源,并对其进行操作. 3) HANDLE使得程序设计的细节 ...