Linux tcp_retransmit_skb 超时重传与 FRTO 恢复
Linux tcp_retransmit_skb 超时重传与 FRTO 恢复tcp_retransmit_skb 是 TCP 超时重传的核心执行函数由重传定时器 tcp_write_timer 或快速重传路径 tcp_enter_recovery 触发。该函数从 write_queue 中选择 skb 进行重传调用 __tcp_retransmit_skb 执行实际克隆和发送操作。重传不涉及从 write_queue 移除 skb仅通过 skb_clone 创建副本发送原始 skb 保留在队列中等待 ACK。cint __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs){struct tcp_sock *tp tcp_sk(sk);struct sk_buff *segs_skb;int err;if (tcp_rtx_queue_empty(sk))return -EINVAL;if (skb_page_frag_refill(tp-md5sig_info ? sizeof(struct tcp_md5sig) : 0,sk-sk_frag, sk-sk_allocation))return -ENOMEM;tcp_init_tso_segs(skb, tcp_current_mss(sk));segs tcp_skb_pcount(skb);tcp_trim_head(skb, tcp_current_mss(sk));err tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);if (err 0) {tp-retrans_out segs;if (TCP_SKB_CB(skb)-seq tp-snd_una)tp-lost_out - segs;...}return err;}tcp_retransmit_skb 调用前必须确保 skb 确实在 write_queue 中且未被 SACKed 完全确认。内核通过 tcp_rtx_queue_empty 检查队列非空然后遍历队列定位第一个需要重传的 skb。重传选择逻辑在 tcp_xmit_retransmit_queue 中实现从 tcp_write_queue_head 开始检查每个 skb 的 tcp_skb_cb-sacked 标志位跳过 TCPCB_SACKED_ACKED已确认和 TCPCB_SACKED_RETRANS已重传但未确认的 skb优先重传 TCPCB_LOST 标记的数据。cvoid tcp_xmit_retransmit_queue(struct sock *sk){struct tcp_sock *tp tcp_sk(sk);struct sk_buff *skb, *rtx_head tcp_rtx_queue_head(sk);int packet_cnt;if (tp-retrans_out tp-lost_out)return;skb rtx_head;packet_cnt 0;while (skb) {if (skb tcp_write_queue_tail(sk))break;if (!tcp_skb_is_write_queue(sk, skb))break;if (TCP_SKB_CB(skb)-sacked TCPCB_SACKED_ACKED)goto next;if (TCP_SKB_CB(skb)-sacked TCPCB_LOST) {if (tcp_retransmit_skb(sk, skb, tcp_skb_pcount(skb)))return;packet_cnt tcp_skb_pcount(skb);if (packet_cnt tp-lost_out)return;}next:skb tcp_write_queue_next(sk, skb);}}丢失标记 TCPCB_LOST 在 tcp_mark_head_lost 中设置触发条件依赖于 fackets_outSACK 确认的 skb 之外尚未确认的数据包数量和 reordering 因子 tp-reord。tp-reord 决定了 sender 将乱序判定为丢包的容忍度当乱序程度小于 reord即使 SACK blocks 指示空洞也不会标记 LOST。但在 RACK 算法启动后套接字支持 TCP RACK丢失检测完全由 tcp_rack_mark_lost 接管不再依赖传统的 FACK 判断。FRTOForward RTO-RecoveryRFC 5682是检测虚假超时重传spurious RTO的机制。当 RTO 超时后收到 ACKFRTO 通过观察该 ACK 是否确认了新的数据来判定 RTO 是否真实。spurious RTO 常见于无线链路中突发的延迟抖动——发送端 RTO 超时后原数据包实际并未丢失仅因延迟晚到。cvoid tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag){struct tcp_sock *tp tcp_sk(sk);if (before(ack, tp-snd_una))return;if (flag FLAG_ECE)tcp_rate_check_app_limited(sk);if (after(ack, tp-snd_una)) {if (tp-tlp_high_seq after(ack, tp-tlp_high_seq)) {tp-tlp_high_seq 0;tcp_try_keep_open(sk);tcp_try_to_open(sk, flag);}}}FRTO 状态机在 tcp_process_tlp_ack 和 tcp_frto_response 中实现。RTO 触发后 tcp_write_timer_handler 将 ca_state 置为 TCP_CA_Loss然后发送 skb 并递增 retrans_out。若之后收到 ACK 发现 snd_una 前进了FLAG_SND_UNA_ADVANCEDFRTO 的第一阶段判定为 possibly spurious。此时调用 tcp_try_keep_open 尝试恢复为 TCP_CA_Open 状态。若第二个 ACK 继续前进且 SACK 块无异常则 FRTO 最终解除 Loss 状态并撤销 cwnd 减半。FRTO 与 SACK 交互的边界条件如果启用了 SACKFRTO 在第二阶段检查收到的 SACK block 是否覆盖了未重传的数据。若 SACK 确认的数据在重传之前已被接收方收到则判定为 spurious RTO撤销重传标记并恢复 cwnd。若 SACK 确认了重传后的新数据则 RTO 真实继续执行 cwnd 减半。cint tcp_frto_response(struct sock *sk, int flag){struct tcp_sock *tp tcp_sk(sk);if (flag FLAG_ECE)return tcp_enter_cwr(sk);if (tp-frto_counter 2) {if (!(flag FLAG_DATA_ACKED))return tcp_enter_loss(sk);tp-frto_counter 0;tcp_try_to_open(sk, flag);tcp_moderate_cwnd(tp);if (tcp_sk_is_tlp(sk))tcp_schedule_loss_probe(sk);}return 0;}frto_counter 跟踪 FRTO 状态机状态0 表示未激活1 表示第一轮探测可能虚假2 表示第二轮确认确认虚假后恢复。frto_counter 在 tcp_process_loss 中递减该函数是 tcp_ack 处理 Loss 状态的入口。如果在 FRTO 第二轮之前收到重复 ACKFRTO 可被提前终止——这是 RFC 5682 第 4 节规定的 option。性能关键点tcp_retransmit_skb 中 skb_clone 分配 skb 使用的 gfp_mask 是 GFP_ATOMIC因为重传在定时器软中断TIMER_SOFTIRQ上下文中执行不能睡眠。若 GFP_ATOMIC 分配失败__tcp_retransmit_skb 返回 -ENOMEMtcp_xmit_retransmit_queue 中止循环剩余未被重传的 skb 在下一个定时器触发时重试。该延迟会进一步加剧 RTO backoff 指数放大。在内存压力场景下此路径会与 tcp_memory_pressure 交互当系统内存紧张时tcp_write_xmit 中的 sk_stream_alloc_skb 同样返回 ENOMEMwrite_queue 中的 skb 无法追加发送完全冻结直到内存回收。

相关新闻

3步掌握AI图片修复:IOPaint命令行批量处理完全指南

3步掌握AI图片修复:IOPaint命令行批量处理完全指南

3步掌握AI图片修复:IOPaint命令行批量处理完全指南 【免费下载链接】IOPaint Image inpainting tool powered by SOTA AI Model. Remove any unwanted object, defect, people from your pictures or erase and replace(powered by stable diffusion) any thing on …

2026/7/21 13:32:37 阅读更多 →
Cranelift JIT Demo 核心架构揭秘:理解模块化 JIT 编译器的设计哲学

Cranelift JIT Demo 核心架构揭秘:理解模块化 JIT 编译器的设计哲学

Cranelift JIT Demo 核心架构揭秘:理解模块化 JIT 编译器的设计哲学 【免费下载链接】cranelift-jit-demo JIT compiler and runtime for a toy language, using Cranelift 项目地址: https://gitcode.com/gh_mirrors/cr/cranelift-jit-demo 想要快速掌握 JI…

2026/7/21 13:32:37 阅读更多 →
UI-TARS桌面版:3步开启你的AI自动化助手,免费体验智能操作革命

UI-TARS桌面版:3步开启你的AI自动化助手,免费体验智能操作革命

UI-TARS桌面版:3步开启你的AI自动化助手,免费体验智能操作革命 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui…

2026/7/21 13:32:37 阅读更多 →

最新新闻

Sulphur-2视频生成AI终极指南:从零开始掌握本地部署技巧

Sulphur-2视频生成AI终极指南:从零开始掌握本地部署技巧

Sulphur-2视频生成AI终极指南:从零开始掌握本地部署技巧 【免费下载链接】Sulphur-2-Base-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/vantagewithai/Sulphur-2-Base-GGUF 想要在本地电脑上运行强大的AI视频生成模型吗?Sulphur-2-Base-G…

2026/7/21 19:31:36 阅读更多 →
【企业级AI搜索实时能力白皮书】:覆盖新闻、财报、社交媒体的8.2ms端到端延迟实测数据与部署手册

【企业级AI搜索实时能力白皮书】:覆盖新闻、财报、社交媒体的8.2ms端到端延迟实测数据与部署手册

更多请点击: https://kaifayun.com 第一章:AI搜索实时信息获取的定义与企业级价值 AI搜索实时信息获取是指利用大语言模型(LLM)与动态数据源(如API流、新闻源、数据库变更日志、Web爬虫增量队列)协同工作&…

2026/7/21 19:31:36 阅读更多 →
【紧急预警】83%的AI短视频因配音不同步被平台限流!立即掌握这4种实时同步加固方案

【紧急预警】83%的AI短视频因配音不同步被平台限流!立即掌握这4种实时同步加固方案

更多请点击: https://kaifayun.com 第一章:AI视频配音自动同步的底层逻辑与限流归因 AI视频配音自动同步并非简单的音频叠加,其核心依赖于多模态时序对齐与实时流控协同机制。系统首先提取原始视频的视觉帧时间戳(PTS&#xff09…

2026/7/21 19:31:36 阅读更多 →
Ruby数据科学项目实战:从数据清洗到模型部署完整流程

Ruby数据科学项目实战:从数据清洗到模型部署完整流程

Ruby数据科学项目实战:从数据清洗到模型部署完整流程 【免费下载链接】data-science-with-ruby Practical Data Science with Ruby based tools. 项目地址: https://gitcode.com/gh_mirrors/da/data-science-with-ruby 数据科学是当今技术领域的热门方向&…

2026/7/21 19:31:36 阅读更多 →
nebula.gl实战:构建企业级地图编辑系统的架构设计与实现

nebula.gl实战:构建企业级地图编辑系统的架构设计与实现

nebula.gl实战:构建企业级地图编辑系统的架构设计与实现 【免费下载链接】nebula.gl A suite of 3D-enabled data editing overlays, suitable for deck.gl 项目地址: https://gitcode.com/gh_mirrors/ne/nebula.gl nebula.gl是一套支持3D功能的数据编辑覆盖…

2026/7/21 19:31:36 阅读更多 →
终极指南:如何使用jQuery QueryBuilder创建强大的可视化查询界面

终极指南:如何使用jQuery QueryBuilder创建强大的可视化查询界面

终极指南:如何使用jQuery QueryBuilder创建强大的可视化查询界面 【免费下载链接】jQuery-QueryBuilder jQuery plugin offering an interface to create complex queries 项目地址: https://gitcode.com/gh_mirrors/jq/jQuery-QueryBuilder 你是否曾经为复杂…

2026/7/21 19:30:36 阅读更多 →

日新闻

Octane Render与C4D汉化版安装与优化指南

Octane Render与C4D汉化版安装与优化指南

1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能&#xff…

2026/7/21 0:00:19 阅读更多 →
GPMC接口设计:异步/同步模式与多路复用配置实战

GPMC接口设计:异步/同步模式与多路复用配置实战

1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…

2026/7/21 0:00:19 阅读更多 →
UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

1. 项目概述:UE5 GAS RPG被动技能的核心价值在UE5里用GAS(Gameplay Ability System)做RPG游戏,主动技能像是你手里的武器,按一下打一下,逻辑直接,反馈也快。但被动技能,它更像是你身…

2026/7/21 0:00:19 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻