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/10/10 16:08:16 阅读更多 →
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/10/11 16:32:38 阅读更多 →
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/10/12 15:44:49 阅读更多 →

最新新闻

PyTorch从零实现逻辑回归:深入理解分类与神经网络底层原理

PyTorch从零实现逻辑回归:深入理解分类与神经网络底层原理

逻辑回归这玩意儿,别看名字里带个"回归",它干的其实是分类的活儿。我刚开始学深度学习那会儿,也被这个命名坑过,以为它跟线性回归是亲兄弟,结果发现它是个披着回归外衣的分类器。这次我打算用PyTorch从头到尾…

2026/10/15 20:33:09 阅读更多 →
数据资产管理:核心框架与实践指南

数据资产管理:核心框架与实践指南

1. 数据资产管理的基本概念与挑战在大数据时代,数据已经成为企业最核心的资产之一。每天,全球产生的数据量以惊人的速度增长,从TB级到PB级,甚至EB级。面对如此庞大的数据量,如何有效管理这些数据资产,使其发…

2026/10/15 20:33:09 阅读更多 →
MFC动态实时曲线绘制:双缓冲与环形缓冲区实战

MFC动态实时曲线绘制:双缓冲与环形缓冲区实战

简介:这份资源面向具备一定VC基础的Windows开发者与数据可视化学习者,聚焦MFC框架下动态实时曲线的绘制实现。内容围绕自定义视图类、GDI绘图、数据库交互与多线程同步等核心知识点展开,可用于监控系统、数据采集界面等需要实时刷新图表的场景…

2026/10/15 20:33:09 阅读更多 →
毕业论文季AI写作工具实测:千笔与文途的全流程对比评测

毕业论文季AI写作工具实测:千笔与文途的全流程对比评测

2026届的论文季比往年来得更早,也更卷。周围不少同学已经不是在问“要不要用AI写论文”,而是直接问“用哪个AI写论文更靠谱”。作为一个从开题报告一路熬到答辩PPT的过来人,这两三个月我集中把市面上叫得出名字的AI论文写作软件都摸了一遍&am…

2026/10/15 20:33:09 阅读更多 →
模型剪枝与知识蒸馏组合优化:端侧部署的精度与速度平衡

模型剪枝与知识蒸馏组合优化:端侧部署的精度与速度平衡

1. 项目概述做模型部署的朋友应该都遇到过这种尴尬:训练好的模型在GPU上跑得飞快,一放到手机、嵌入式设备或者边缘盒子,要么内存直接爆掉,要么推理延迟高到没法用。裁剪网络层数、减少通道数这些土办法效果有限,还特别…

2026/10/15 20:33:09 阅读更多 →
双目立体匹配核心:区域匹配算法原理与工程实践

双目立体匹配核心:区域匹配算法原理与工程实践

双目立体匹配这个话题,我在实际项目里断断续续折腾了好几年。如果让我给刚接触三维视觉的人推荐一个最值得先吃透的算法,我大概率会推荐区域匹配(Area-based Matching)——它是局部匹配算法里最直观、最容易编码、也是整条计算链路…

2026/10/15 20:32:08 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →