当前位置: 首页 > news >正文

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

相关文章:

TCP重传机制详解——04FACK

文章目录 TCP重传机制详解——04FACK什么是FACKFACK的发展为什么要引入FACK实战抓包讲解开启FACK场景&#xff0c;且达到dup ACK门限值开启FACK场景&#xff0c;未达到dup ACK门限值 为什么要淘汰FACK总结REF TCP重传机制详解——04FACK 什么是FACK FACK的全称是forward ackn…...

安卓Java面试题 206- 210

206. 简述如何统计Activity的工作时间 ?如何统计Activity启动所用的时间? 可以通过分析Log得到(这个就是DDMS的那个Log)。 当我们点击触摸时会了类似以下的Log A: 03-06 03:36:47.865: VERBOSE/InputDevice(2486): ID[0]=0(0) Dn (0=>1) 03-06 03:36:47.865: INFO/Powe…...

huggingface的transformers训练bert

目录 理论 实践 理论 https://arxiv.org/abs/1810.04805 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;由Google在2018年提出。它是基于Transformer模型的预训练方法…...

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…...

C#使用ASP.NET Core Razor Pages构建网站(三)

上一篇文章了解Razor Pages 链接&#xff1a;C#使用ASP.NET Core Razor Pages构建网站&#xff08;二&#xff09; 接下来继续了解ASP.NET Core Razor Pages构建网站的后续内容 一、将Entity Framework Core配置为服务 要在 ASP.NET Core 项目中配置 Entity Framework Core 服…...

R语言迅速计算多基因评分(PRS)

Polygenic Risk Scores in R 最朴素的理解PRS&#xff1a; GWAS分析结果中&#xff0c;有每个SNP的beta值、se值、P值&#xff0c;因为GWAS分析中将SNP变为0-1-2编码&#xff0c;所以这些显著的SNP的beta值&#xff0c;就可以用于预测。 比如&#xff1a;GWAS分析中&#xf…...

蓝桥杯刷题_day3

文章目录 DAY301字串判断闰年Fibonacci数列圆的面积序列求和 DAY3 01字串 【题目描述】 对于长度为5位的一个01串&#xff0c;每一位都可能是0或1&#xff0c;一共有32种可能。它们的前几个是&#xff1a; 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串。…...

Dubbo源码解析-Provider服务暴露Export源码解析

上篇我们介绍了ServiceBean初始化和依赖注入过程&#xff0c;地址如下 Dubbo源码-Provider服务端ServiceBean初始化和属性注入-CSDN博客 本文主要针Dubbo服务端服务Export过程&#xff0c;从dubbo源码角度进行解析。 Dubbo 服务端暴露细节流程比较长&#xff0c;也是面试过程中…...

在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理&#xff0c;模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色&#xff08;RGB值为0, 0, 0&#xff09;&a…...

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …...

Keil笔记(缘更)

Keil 一、使用Keil时可能会出现的问题1.Project框不见了2.添加文件时找不到3.交换文件位置4.main.c测试报1 warning5.搜索CtrlF 二、模电常识(白话随便版)一、名词解释二、基础门电路 三、STLINK点灯操作1.配置寄存器进行点灯2.使用库函数进行点灯 四.GPIO1.LED闪烁4.按键控制L…...

举4例说明Python如何使用正则表达式分割字符串

在Python中&#xff0c;你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法&#xff0c;但它允许你使用正则表达式作为分隔符。 示例 1: 使用单个字符作为分隔符 假设你有一个由逗号分隔的字符串&#xff0c;你可…...

Java 中的 Math. round(-1. 5) 等于多少?

在 Java 中&#xff0c;Math.round() 方法用于四舍五入一个浮点数。这个方法的工作原理是&#xff0c;它会查看要舍入数值的小数点后第一位。如果这一位是 5 或更大&#xff0c;那么整数部分加 1&#xff1b;如果小于 5&#xff0c;整数部分保持不变。 对于 Math.round(-1.5)&…...

MFC界面美化第三篇----自绘按钮(重绘按钮)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…...

设计模式|工厂模式

文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么&#xff1f;**6.2 **工厂模式解决了什么问题&#xff1f;**6.3 **工厂模式的优点…...

CHAT~(持续更新)

CHAT&#xff08;持续更新&#xff09; 实现一个ChatGPT创建API设计页面布局业务操作技术架构 实现安装工具 其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略&#xff0c;想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作…...

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…...

文件操作3

随机读写数据文件 一、随机读写原理 在我们写数据时&#xff0c;有一个光标不断的在随着新写入的数据往后移动&#xff1b; 而读数据时&#xff0c;也有一个看不见光标&#xff0c;随着已经读完的数据&#xff0c;往后移动 这里的文件读写位置标记——可以想象成图形界面里的…...

算法D57 | 动态规划17 | 647. 回文子串 516.最长回文子序列 动态规划总结篇

647. 回文子串 动态规划解决的经典题目&#xff0c;如果没接触过的话&#xff0c;别硬想 直接看题解。 代码随想录 Python: class Solution:def countSubstrings(self, s: str) -> int:n len(s)dp [[0]*n for _ in range(n)]dp[0] [1]*nresult nfor i in range(1, n)…...

go的限流

背景 服务请求下游&#xff0c;oom&#xff0c;排查下来发现是一个下游组件qps陡增导致 但是司内网络框架比较挫&#xff0c;竟然不负责框架内存问题&#xff08;有内存管理模块&#xff0c;但逻辑又是无限制使用内存&#xff09; 每个请求一个r、w buffer&#xff0c;请求无限…...

Java+Access综合测评系统源码分享:含论文、开题报告、任务书全套资料

JAVAaccess综合测评系统毕业设计 一、系统概述 本系统采用Java Swing开发前端界面&#xff0c;结合Access数据库实现数据存储&#xff0c;专为教育机构打造的综合测评解决方案。系统包含学生管理、题库管理、在线测评、成绩分析四大核心模块&#xff0c;实现了测评流程的全自…...

gopool 源码分析

gopool gopool是字节跳动开源节流的gopkg包中协程池的一个实现。 关键结构 协程池&#xff1a; type pool struct {// The name of the poolname string// capacity of the pool, the maximum number of goroutines that are actually working// 协程池的最大容量cap int32…...

C++11新增重要标准(下)

前言 一&#xff0c;forward&#xff08;完美转发&#xff09; 二&#xff0c;可变参数模板 三&#xff0c;emplace系列接口 四&#xff0c;新增类功能 五&#xff0c;default与delete 六&#xff0c;lambda表达式 七&#xff0c;包装器 八&#xff0c;bind 在C11中新增…...

AI推理服务的高可用架构设计

AI推理服务的高可用架构设计 在传统业务系统中,高可用架构主要关注服务冗余、数据库容灾、限流熔断等通用能力。而在AI系统中,尤其是大模型推理服务场景下,高可用架构面临更加复杂的挑战,如推理延迟敏感性、GPU资源稀缺性、模型版本切换频繁等问题。本节将专门探讨如何构建…...

机器学习:load_predict_project

本文目录&#xff1a; 一、project目录二、utils里的两个工具包&#xff08;一&#xff09;common.py&#xff08;二&#xff09;log.py 三、src文件夹代码&#xff08;一&#xff09;模型训练&#xff08;train.py&#xff09;&#xff08;二&#xff09;模型预测&#xff08;…...

【原神 × 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密!

【原神 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密! 作者:星之辰 标签:#原神 #二叉树 #天赋树 #任务分支 #圣遗物强化 #算法科普 发布时间:2025年6月 总字数:6000+ 一、引子:提瓦特大陆的“树型奥秘” 你是否曾留意过《原神》角色面板的天赋树? 升级技能…...

基于Spring Boot的云音乐平台设计与实现

基于Spring Boot的云音乐平台设计与实现——集成协同过滤推荐算法的全栈项目实战 &#x1f4d6; 文章目录 项目概述技术选型与架构设计数据库设计后端核心功能实现推荐算法设计与实现前端交互设计系统优化与性能提升项目部署与测试总结与展望 项目概述 &#x1f3af; 项目背…...

在SpringBoot中使用AWS SDK实现邮箱验证码服务

1.依赖导入&#xff08;maven&#xff09; <dependency><groupId>software.amazon.awssdk</groupId><artifactId>ses</artifactId><version>2.31.46</version></dependency> 2.申请两个key 发件人邮箱需要验证&#xff1a; …...

业态即战场:零售平台的生意模型与系统设计解构

目录 一、当我们在电商买菜、点外卖时,其实是零售业态在进化 (一)从“商场选货”到“算法推货”:零售的时代已经不同 (二)“控货”和“卖场”——零售的两种基本商业模式 二、四种经典零售业态解析:控货 vs 卖场,地面 vs 线上 (一)地面控货零售:直营模式的黄金…...

Linux top 命令 的使用总结

以下是 Linux top 命令 的使用总结,按功能分类整理,方便快速查询: 一、命令行参数 参数描述示例-d <秒数>设置刷新间隔时间top -d 2(每2秒刷新)-p <PID>监控指定进程IDtop -p 1234(仅显示PID为1234的进程)-u <用户名>显示指定用户的进程top -u root(…...