TCP重传机制详解——04FACK

文章目录

  • TCP重传机制详解——04FACK
    • 什么是FACK
    • FACK的发展
    • 为什么要引入FACK
    • 实战抓包讲解
      • 开启FACK场景,且达到dup ACK门限值
      • 开启FACK场景,未达到dup ACK门限值
    • 为什么要淘汰FACK
    • 总结
    • REF

TCP重传机制详解——04FACK

什么是FACK

FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息。
举例说明:
Server:

  • P1(0-9)、P2(10-19)、P3(20-29)、P4(30-39)、P5(40-49)

Client:

  1. 正常收到了P1包并回复了ACK确认包,P2、P3、P4则由于网络拥塞等原因丢失;
  2. 在收到P5时候回复一个Ack=10的确认包,并携带P5有SACK块信息(40-50)

这样server在收到P1的确认包和P5的dup ACK时候,就可以根据dup ACK中的SACK信息得知client端收到了P1报文和P5报文,计算出P1和P5两个数据包中间间隔了3个数据包,达到了dup ACK门限(默认为3),进而推测出P2报文丢失。

发送端根据发送数据的缓存区和SACK块信息,完全可以计算出丢失的数据包个数(即使这些数据包不是满MSS大小)

SO,当使能FACK的时候,实际上我们可以通过ACK + 一个SACK块信息来推测丢包情况进而触发快速重传。

FACK的发展

/proc/sys/net/ipv4开启 TCP FACK(Forward Acknowledgement) 支持。选项废弃了,新版内核不再生效。

FACK 是拥塞控制中快速恢复(Fast Recovery)阶段相关的机制,它主要解决有多个报文丢失的情况下,通过准确估计(当前连接)还在网络中传输的报文大小,在恢复阶段做出精确的拥塞控制。计算的方式如下:

记录 SACK 的最大序号数为 snd.fack
定义 awnd 代表正在网络中传输的数据:awnd = snd.nxt - snd.fack,这里假设了不存在乱序报文
在重传时,awnd 要加上重传的数据:awnd = snd.nxt - snd.fack + retran_data
于是在拥塞时,cwnd 会根据算法改变,此时为了充分利用带宽,可以使用如下方法控制包的发送:

while (awnd < cwnd)
sendsomething()
该方法比起 Reno 通过接收到的 dupack 数量来调整 cwnd 值更为精确。对于快速恢复的触发也有变化:

正常 Reno 算法会在 dupacks = 3 时触发快速恢复,如果丢失多个包,则 ACK 数量也随之减少,导致等待重传的时间变长,而 FACK 额外增加了一个触发条件:(snd.fack – snd.una) > (3*MSS),即假设没有乱序包的情况下,如果该条件成立,则说明网络中丢失了 3 个包,等价于 dupacks == 3,可以触发重传和快速恢复。

注:在 Linux 4.15[16] 中移除了 FACK 的支持,使用 RACK 机制替代。

为什么要引入FACK

因为当开始有SACK块信息的支持下,你可以准确的知道丢失包的范围信息。正是因为有了这些信息,不必再等待原有的dup ACK重复三次,而是应该计算这个范围丢包个数与阈值的关系从而决定是否快速重传。即发送端完全可以通过SACK+ack number来决定快速重传,不需要等待dup ACK三次

实战抓包讲解

开启FACK场景,且达到dup ACK门限值

在这里插入图片描述

开启FACK场景,未达到dup ACK门限值

在这里插入图片描述

为什么要淘汰FACK

  1. 过于激进的重传FACK依赖于接收端发送的SACK信息来判断丢包,有时候网络中的乱序可能被错误地解读为丢包,从而导致不必要的重传。特别是在网络拥塞时,频繁的重传可能会加剧拥塞,降低网络性能。
  2. 复杂度较高:FACK的实现和维护需要较为复杂的逻辑,包括跟踪和处理SACK信息,以及根据这些信息来决定何时重传。这种复杂性可能会影响内核的执行效率,也可能引入额外的实现风险。
  3. 难以适应极端网络状况:在某些网络环境下,如严重的网络延迟或大规模乱序,FACK可能不如后来提出的更为先进和适应性强的算法,如RACK(Receiver-based ACKnowledgment)等。RACK通过接收端的延迟信息来推测丢包,对网络状况变化的适应性更强。
  4. 对SACK的支持要求:并非所有TCP实现或网络设备都支持SACK选项,这意味着FACK的功能在这些环境下无法完全发挥,限制了其普适性。
  5. 并发丢包处理:FACK在处理并发丢包时可能不如其他算法有效,例如在连续丢包且数量较多时,FACK可能无法一次性准确判断所有丢失的数据段。

总结

  1. FACK的触发快速重传的原理就是:计算ACK和SACK块信息之间的丢失数据包个数是否达到3个
  2. FACK乱序场景下的判断是失准的,可能导致过多的重传。
  3. FACK已被淘汰,更优选为RACK

REF

FACK在Linux的落幕
TCP FACK与RACK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/286451.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(二)——垃圾回收

三、垃圾回收 1、如何判断对象可以回收 1&#xff09;引用计数法 定义&#xff1a; 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二&#xff1a;布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

MySQL substr函数使用详解

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

景联文科技上新高质量大模型训练数据!

在过去的一年中&#xff0c;人工智能领域呈现出了风起云涌的态势&#xff0c;其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上&#xff0c;上海人工智能实验室的领…

c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

目录 一、memcpy()1.1声明1.2参数1.3返回值1.4memcpy的使用1.5memcpy模拟使用1.6注意 二、memmove()2.1声明2.2参数2.3返回值2.4使用2.5memmove&#xff08;&#xff09;模拟实现 三、memset3.1声明3.2参数3.3返回值3.4使用 四、memcmp()4.1声明4.2参数4.3返回值4.4使用 五、注…

MySQL-extra常见的额外信息

本文为大家介绍MySQL查看执行计划时&#xff0c;extra常见的额外信息 Using index 表示使用了覆盖索引&#xff0c;即通过索引树可以直接获取数据&#xff0c;不需要回表。 表结构: CREATE TABLE t1 (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,ag…

IP SSL证书注册流程

使用IP地址申请SSL证书&#xff0c;需要用公网IP地址申请&#xff0c;申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好&#xff0c;端口不需要一直开放&#xff0c;只要认证的几分钟内开放就可以了&#xff0c;然后IP地址根目录可以上传txt文件。 IP SSL证书认…

vue3+vite - 报错 import.meta.glob() can only accept string literals.(详细解决方案)

报错说明 在vue3+vite项目中,解决报错: [plugin:vite:import-analysis] import.meta.glob() can only accept string literals. 如果我们报错差不多,就可以完美搞定这个错误。 解决教程 这个错误,是因为

【STM32嵌入式系统设计与开发】——9Timer(定时器中断实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&…

蓝桥杯学习笔记(贪心)

在很久很久以前&#xff0c;有几个部落居住在平原上&#xff0c;依次编号为1到n。第之个部落的人数为 t 有一年发生了灾荒&#xff0c;年轻的政治家小蓝想要说服所有部落一同应对灾荒&#xff0c;他能通过谈判来说服部落进行联台。 每次谈判&#xff0c;小蓝只能邀请两个部落参…

HarborCDN技术分析

一、介绍 简要介绍 ​​Harbor​​ 是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker C…

php反序列化刷题1

[SWPUCTF 2021 新生赛]ez_unserialize 查看源代码想到robots协议 看这个代码比较简单 直接让adminadmin passwdctf就行了 poc <?php class wllm {public $admin;public $passwd; }$p new wllm(); $p->admin "admin"; $p->passwd "ctf"; ec…

Redis中的事件

事件 概述 Redis服务器是一个事件驱动程序:服务器需要处理以下两类事件: 1.文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接&#xff0c;而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件…

java串口接收和发送消息集成Springboot

写在前面&#xff1a;1、jdk我用的1.8.0_31 ,不能用太高的java版本。 2、&#xff08;1&#xff09;将rxtxParallel.dll和rxtxSerial.dll文件放到${JAVA_HOME}&#xff08;jdk目录,不是jre目录&#xff09;\jre\bin目录下 如&#xff1a; C:\Program Files\Java\jdk1.8.0_31\…

1升级powershell后才能安装WSL2--最后安装linux--Ubuntu 22.04.3 LTS

视频 https://www.bilibili.com/video/BV1uH4y1W7UX特殊开启–Hyper-V虚拟机 把一下代码保存到【a.bat】的执行文件中&#xff0c;进行Hyper-V虚拟机的安装开启【Windows 批处理文件 (.bat)】 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mu…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

203基于matlab的曲柄滑块机构的运动学仿真分析GUI

基于matlab的曲柄滑块机构的运动学仿真分析GUI&#xff0c;包括《系统仿真与matlab》综合试题文档。分析滑块速度、角速度&#xff0c;曲轴投影长。曲柄滑块机构的动画。程序已调通&#xff0c;可直接运行。 203 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)

SQLiteC/C++接口详细介绍sqlite3_stmt类(十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十二&#xff09; 43、sqlite3_reset sqlite3_reset 函数用于重置已经编…

Linux:http协议初步认识

文章目录 OSI七层模型http协议域名路径信息请求和响应 编写一个httpserver OSI七层模型 在结束了前面对于序列化反序列化等内容的学习后&#xff0c;重新回到对于OSI模型的部分 如上所示的是对于OSI接口的示意图&#xff0c;在这当中可以看到会话层的概念&#xff0c;会话层的…

word文件如何转PDF格式?word转PDF的方法

在当今数字化时代&#xff0c;文档格式的转换已成为日常生活和工作中不可或缺的一部分。其中&#xff0c;将Word文档转换为PDF格式更是受到了广大用户的青睐。本文将详细介绍Word转PDF的方法&#xff0c;帮助读者轻松实现文档格式的转换&#xff0c;并探讨转换过程中的注意事项…