一、介绍

当TCP连续大量的发送数据的时候,当出现丢包的时候可以有足够的dup ACK来触发快速重传。但是internet上还有大量的交互式服务,这类服务一般都是由小包组成,而且一次操作中需要传输的数据包一般比较少,比如在线游戏、股票交易等,这一类数据流我们就称呼为thin stream。在一次交互式操作触发一次TCP传输的时候,如果传输的这个数据包发生丢包,很可能后面没有足够的dup ACK来触发快速重传,最终只能依赖RTO超时来进行重传。还有一种受限传输的场景,如果发送窗口受到拥塞控制的限制只能发送出少量的TCP报文的时候,如果丢包也可能会因为收不到足够的dup ACK而不能触发快速重传。关于拥塞控制我们后续内容会介绍。这样会降低用户体验。同时如果RTO多次指数回退,可能会进一步进一步降低用户体验。之前我们介绍过RTO指数回退的目的是降低网络拥塞,而实际上交互式操作一般数据量很小,没有必要通过指数回退来降低网络拥塞。

综上介绍,为了改善thin stream的传输,linux针对引入了两个控制参数

  • /proc/sys/net/ipv4/tcp_thin_dupack:当该开关打开的时候,只需要一个dup ACK且缓存中没有待发送数据就可以触发快速重传

  • /proc/sys/net/ipv4/tcp_thin_linear_timeouts:当该参数打开的时候,前6次RTO超时触发的重传并不进行指数回退。

linux中会判断如果当前没有处于初始的慢启动过程(慢启动后续拥塞控制介绍)并且已经发出去的还没有收到ACK的数据包的个数小于4则会认定为thin stream。

二、wireshark示例

设置tcp_retries2=8,tcp_early_retrans=0,tcp_retrans_collapse=0,tcp_thin_dupack=1,tcp_thin_linear_timeouts=1,tcp_discard_on_port =9877;进行如下测试。

1、缓存中没有待发送数据,正常触发thin stream

  • 其中No7-No8处的RTO超时重传时候,server端发出去的未收到ACK的包个数为1(No6包),当RTO超时的时候,TCP退出初始的慢启动过程,因此linux判定为thin stream,进而我们看到RTO超时时候没有触发指数回退(No6-No9之间每个数据包的发送间隔大约都是1.5s左右)。
  • 接着重传成功后,连续发送两个数据包(No11和No12),此时server端发出的但尚未收到ACK确认包的数据包个数为2个。因为收到拥塞控制中慢启动的限制,此时server端最多只能发送这两个数据包。client模拟No11数据包传输丢失,响应No12数据包回复一个ACK确认包,注意这个确认包的ack number与No10确认包一样,同时包含一个SACK选项告诉server端已经收到了No12数据包
  • server端认定这个数据包为dup ACK,同时数据流为thin stream,因此一个dup ACK就会触发快速重传,即No14数据包。对于No14数据包,wireshark显示为乱序包实际是一个快速重传包。另外对于No13报文,wireshark显示为No10的dup ACK,实际上linux的处理是因为No13携带有有效的SACK选项才被认定为dup ACK报文的,相关内容参考前面SACK重传的介绍。
  • 快速重传没有收到ACK确认包的时候,接着触发RTO超时重传,可以看到前6次重传(No15-No20) 都没有触发指数会退,RTO一直是1.5s左右。直到第7次重传(No21)后,RTO开始进行指数回退。

2、缓存中有待发送数据不会触发thin stream重传

这个示例与之前类似,不同的是在第一次RTO超时重传成功后,server端应用层写入3个TCP报文,但是由于拥塞控制,server端TCP只能发出两个报文No11和No12。接着cilent模拟丢失No11报文,对No12乱序报文回复一个ACK确认包,同时包含一个SACK选项告诉server端已经收到了No12数据包。此时因为缓存中还有一个TCP报文待发送就不会触发thin stream的快速重传而是选则发送新数据来进一步触发dup ACK。

补充说明:

1、http://home.ifi.uio.no/paalh/students/AndreasPetlund-phd.pdf

TCP系列19—重传—9、thin stream下的重传的更多相关文章

  1. TCP系列46—拥塞控制—9、SACK下的快速恢复与Limited transmit

    一.概述 1.SACK下的特殊处理过程 SACK下的拥塞控制处理是linux中拥塞控制的实现依据,再次强调一遍RFC6675的重要性,linux中拥塞控制主体框架的实现是与RFC6675一致的,所以如 ...

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

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

  3. TCP系列47—拥塞控制—10、FACK下的快速恢复与PRR

    一.概述 FACK下的重传我们在之前的重传部分已经进行了介绍,这里简单介绍一下随着FACK提出的拥塞控制算法的改进及随后的进一步改进. 从我们之前介绍的RFC2582和RFC5681中可以看到,快速恢 ...

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

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

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

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

  6. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

    一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...

  7. TCP系列21—重传—11、TLP

    一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...

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

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

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

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

随机推荐

  1. Redis总导航目录

    NoSQL入门和概述 NoSQL入门概述 3V + 3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE Redis入门介绍 ...

  2. 使用Letsencrypt做SSL certificate

    为什么要使用Letsencrypt做SSL certificate? 最简单直接的原因是免费.但是免费存在是否靠谱的问题,尤其是对安全要求比较高的网站,需要考虑使用letsencrypt的安全性是否符 ...

  3. 网站用户行为分析——在Ubuntu下安装MySQL及其常用操作

    安装MySQL 使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本: sudo apt-get update #更新软件源 sudo apt-get install mysq ...

  4. Python学习笔记五:字符串常用操作,字典,三级菜单实例

    字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count(“x”) 输出字符, ...

  5. PHP array_reduce()函数的应用解析

    实例 向用户自定义函数发送数组中的值,并返回一个字符串: <?php function myfunction($v1,$v2) { return $v1 . "-" . $v ...

  6. 从零开始一个http服务器(四)-动态返回

    从零开始一个http服务器(四) 代码地址 : https://github.com/flamedancer/cserver git checkout step4 运行: make clean &am ...

  7. 安装Flutter环境

    mac 环境安装 系统需求 操作系统: macOS (64-bit) 硬盘: 700 MB 工具: bash, mkdir, rm, git, curl, unzip, which 环境安装 SDK ...

  8. JavaWeb——升级赛-学生成绩管理系统(2).java---19.01.03

    dao.java package Dao; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLExcept ...

  9. NetWork——关于TCP协议的三次握手和四次挥手

    分钟. (2)服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢? 就是保活时间到了后,B会发送探测信息,以决定是否释放连接. (3)为什么连接的时候是三次握手,关闭 ...

  10. 6 生成器 yield 协程

    1.生成器 ----> 1 b = [x*2 for x in range(100000000000)] MemoryError: 想生成一个存放很多数据的列表,但是又不想内存占用太多 每次用一 ...