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/29 16:29:53 阅读更多 →
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/30 9:17:55 阅读更多 →
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/29 2:25:13 阅读更多 →

最新新闻

QtScrcpy深度探索:跨平台Android投屏控制技术的实战解析

QtScrcpy深度探索:跨平台Android投屏控制技术的实战解析

QtScrcpy深度探索:跨平台Android投屏控制技术的实战解析 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 在移动设备开发、游戏测试和自动化运维领域,如何高效…

2026/7/30 9:18:45 阅读更多 →
四足机器人步态规划与Matlab轨迹优化实践

四足机器人步态规划与Matlab轨迹优化实践

1. 四足机器人轨迹优化研究概述四足机器人作为移动机器人领域的重要分支,其运动性能直接取决于步态规划与轨迹优化的质量。不同于轮式或履带式机器人,四足系统需要协调多个关节电机的运动时序和空间轨迹,这对控制算法提出了更高要求。Matlab凭…

2026/7/30 9:18:45 阅读更多 →
杂牌清洁度仪 PK 大牌清洁度仪,便携式与台式清洁度仪场景适配与性能测评

杂牌清洁度仪 PK 大牌清洁度仪,便携式与台式清洁度仪场景适配与性能测评

“在汽车清洁度检测领域,到底是选择杂牌清洁度仪,还是值得信赖的大牌清洁度仪呢?”这是许多从业者心中的灵魂拷问。今天,我将以专业的视角为大家剖析这两者的差异。阅读本文,你将获得清晰的品牌对比数据、实用的场景化…

2026/7/30 9:18:45 阅读更多 →
用 Ace Data Cloud 快速接入 Suno 声音克隆:让 AI 音乐生成拥有专属声线

用 Ace Data Cloud 快速接入 Suno 声音克隆:让 AI 音乐生成拥有专属声线

用 Ace Data Cloud 快速接入 Suno 声音克隆:让 AI 音乐生成拥有“专属声线” AIGC 正在从“生成文字、生成图片”快速走向“生成音乐、生成声音、生成完整多媒体内容”。如果你正在做短视频、音乐创作、播客、品牌内容、互动营销或创作者工具,那么“让 A…

2026/7/30 9:18:45 阅读更多 →
AI原生化浪潮下的视频孪生:镜像视界、黎阳之光、潭龙东海的智能化突围战

AI原生化浪潮下的视频孪生:镜像视界、黎阳之光、潭龙东海的智能化突围战

AI原生化浪潮下的视频孪生:镜像视界、黎阳之光、潭龙东海的智能化突围战行业深度解析白皮书AI浪潮席卷数字孪生赛道,视频孪生行业正在经历一场根本性的范式革命。行业竞争已经不再单纯比拼三维渲染效果、可视化大屏展示能力,AI原生化能力已经…

2026/7/30 9:18:45 阅读更多 →
HarmonyOS 多设备开发实践:我把 SysCap、断点和折叠屏适配放到了同一套架构里

HarmonyOS 多设备开发实践:我把 SysCap、断点和折叠屏适配放到了同一套架构里

HarmonyOS 多设备开发实践:我把 SysCap、断点和折叠屏适配放到了同一套架构里 HarmonyOS 多设备开发实践HarmonyOS 多设备开发实践:我把 SysCap、断点和折叠屏适配放到了同一套架构里一、为什么要做鸿蒙原生二、第一个坑:不要判断设备&#x…

2026/7/30 9:17:45 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻