Linux tcp_write_queue_tail 发送队列管理与 tsq 处理
Linux tcp_write_queue_tail 发送队列管理与 tsq 处理tcp_write_queue_tail 是 TCP 发送队列sk_write_queue的操作宏定义在 include/net/tcp.h 中。sk_write_queue 是 struct sock 的 sk_write_queue 字段类型为 struct sk_buff_head管理所有已构造但尚未完全确认的 TCP 报文段。队列中的每个 skb 使用 tcp_skb_cb-seq、tcp_skb_cb-end_seq 以及 tcp_skb_cb-tcp_flags 标识数据边界和控制信息。cstatic inline struct sk_buff *tcp_write_queue_tail(const struct sock *sk){return skb_peek_tail(sk-sk_write_queue);}static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk){return skb_peek(sk-sk_write_queue);}static inline struct sk_buff *tcp_send_head(const struct sock *sk){return skb_peek(sk-sk_write_queue);}tcp_send_head 返回发送队列头部即最早未被确认的 skb而 tcp_write_queue_tail 返回队列尾部——即最新被追加的 skb。两者的差异在 GSO 分段和 Nagle 算法中至关重要tcp_write_xmit 循环遍历时从 tcp_send_head 开始每次发送后如果整个 skb 被确认则调用 tcp_advance_send_head 前移队列头部。若 tcp_write_queue_head tcp_write_queue_tail仅一个 skb被完全发送并确认队列变空tcp_send_head(NULL) 作为写关闭信号。skb 追加操作通过 __skb_queue_tail 或 skb_queue_tail 完成。用户进程调用 tcp_sendmsg 经过 tcp_push_one 或 tcp_write_xmit 的分段逻辑后新 skb 附着到队列尾部。这里的关键约束skb-truesize 累积计入 sk-sk_wmem_queued 和 sk-sk_forward_alloctcp_sendmsg 在 sk_stream_alloc_skb 失败时返回 -ENOMEM此时 skb 未入队数据可能部分写入到 cork 的 frags 中。cstatic int tcp_push_one(struct sock *sk, unsigned int mss_now, unsigned int nonagle){struct tcp_sock *tp tcp_sk(sk);struct sk_buff *skb tcp_send_head(sk);if (!skb)return 0;tcp_mark_push(tp, skb);__skb_queue_tail(sk-sk_write_queue, skb);...return tcp_write_xmit(sk, mss_now, nonagle, 0, GFP_KERNEL);}write_queue 的管理涉及三个关键尾指针操作tcp_write_queue_tail(sk) 用于获取最后一个 skb 以在其后追加新数据tcp_fragment 分割时同样需要尾部插入tcp_write_queue_next(sk, skb) 和 tcp_write_queue_prev(sk, skb) 用于遍历。遍历过程在 tcp_sacktag_write_queue 和 tcp_clean_rtx_queue 中大量使用。当 tcp_write_xmit 循环发送时每次调用 tcp_transmit_skb 之前检查是否触发了 TSQ 限速。TSQ 在 tcp_write_xmit 内部的判断通过 tcp_small_queue_check 完成。若触发TSQ_THROTTLED 位置位且发送中断。此时 __tcp_transmit_skb 尚未移除 skb重传队列头部保持不变。cstatic void tcp_tsq_handler(struct sock *sk){struct tcp_sock *tp tcp_sk(sk);unsigned long flags smp_load_acquire(sk-sk_tsq_flags);if (flags TCPF_TSQ_DEFERRED) {bh_lock_sock(sk);if (!sock_owned_by_user(sk)) {if (tp-lost_out tp-retrans_out)tcp_write_xmit(sk, tcp_current_mss(sk), tp-nonagle,0, GFP_ATOMIC);tcp_push_pending_frames(sk);}bh_unlock_sock(sk);}}tsq 的 deferred 处理通过 tcp_release_cb 被调用。当发送路径因 TSQ 被限速并且用户进程持有 lock_sock 时skb 释放后的 tcp_wfree 将 TSQ_DEFERRED 置位。随后用户进程在 release_sock 中调用 tcp_release_cb触发 tcp_tsq_handler 重新尝试发送。这里是 TSQ 的核心竞争点tcp_wfree 运行在 NET_TX_SOFTIRQ 上下文而 tcp_release_cb 运行在进程上下文两者对 sk_tsq_flags 的 test_and_set_bit 操作通过原子位操作保证可见性。tcp_push_pending_frames 在发送队列尾部处理 PSH 标志和紧急数据。该函数检查 tcp_send_head(sk) 是否为 NULL若不为空则调用 tcp_write_xmit 继续发送。在 tp-packets_out 为 0 但 write_queue 非空即所有数据已发送但未确认时__tcp_push_pending_frames 只做极简的 wmem 检查后返回。超时重传对 write_queue 尾部的影响tcp_retransmit_skb 不从队列中移除 skb而是克隆后重新提交给 IP 层。skb-sk 指针维持指向原 socket但 cloned skb 的 destructor 由 tcp_wfree 处理。原始 skb 保留在 write_queue 中直到被 tcp_clean_rtx_queue 移除。cint tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs){struct tcp_sock *tp tcp_sk(sk);int err __tcp_retransmit_skb(sk, skb);if (err 0) {tp-retrans_out tcp_skb_pcount(skb);...if (TCP_SKB_CB(skb)-seq tp-snd_una) {if (tp-lost_out)tp-lost_out - tcp_skb_pcount(skb);}}...return err;}write_queue 中存在一个边界情况TCP_SKB_CB(skb)-tcp_flags TCPHDR_SYN 出现在三次握手阶段的 SYN/ACK 重传。此时 skb 处于 sk_write_queue 中但 writeset即 tp-write_seq尚未初始化完全tcp_retransmit_skb 的检查路径要求验证 sk-sk_state TCP_SYN_SENT 或 TCP_SYN_RECV。另一个边界条件是 tcp_write_queue_tail 与 tcp_collapse 的交互。当发送缓冲区积压过多小包tcp_collapse 将相邻 skb 合并以降低 sk_buff 管理开销。tcp_collapse 从 write_queue 中移除多个 skb 并合并成一个重新追加到尾部。这要求操作持有 write_queue 的自旋锁且如果 collapse 发生在 BH 上下文的 tcp_ack 中不能与用户态的 tcp_sendmsg 并发操作 write_queue——通常通过 sk-sk_lock 的 owned_by_user 标志互斥。

相关新闻

2026 需要视频解析工具怎么选不踩雷?亲测筛选后只留这一个

2026 需要视频解析工具怎么选不踩雷?亲测筛选后只留这一个

先给可执行答案 针对2026年自媒体创作者选视频解析工具的需求,核心要围绕你做内容二次创作的实际需求选,不要为用不到的功能付费。我长期测试过目前主流的5款工具,亲测筛选后,如果你需要把视频内容整理成逐字稿、推文素材或者创作…

2026/7/22 22:21:44 阅读更多 →
Why-Not-Compose动画秘籍:10个超炫效果实现教程与源码解析

Why-Not-Compose动画秘籍:10个超炫效果实现教程与源码解析

Why-Not-Compose动画秘籍:10个超炫效果实现教程与源码解析 【免费下载链接】Why-Not-Compose A collection of animations, compositions, UIs using Jetpack Compose. You can say Jetpack Compose cookbook, showcase or play-ground if you want! 项目地址: ht…

2026/7/21 18:14:09 阅读更多 →
threepp跨平台部署指南:Windows、Linux、macOS与WebAssembly全平台配置教程

threepp跨平台部署指南:Windows、Linux、macOS与WebAssembly全平台配置教程

threepp跨平台部署指南:Windows、Linux、macOS与WebAssembly全平台配置教程 【免费下载链接】threepp A cross-platform C20 3D library with the high-level API of three.js 项目地址: https://gitcode.com/gh_mirrors/th/threepp 想要在Windows、Linux、m…

2026/7/22 21:52:14 阅读更多 →

最新新闻

影刀RPA 网页滚动加载的稳定处理:到底部加载新内容的正确姿势

影刀RPA 网页滚动加载的稳定处理:到底部加载新内容的正确姿势

影刀RPA 网页滚动加载的稳定处理:到底部加载新内容的正确姿势 “为什么只采了20条,页面上明明有200条?”——这是采集无限滚动页面时新手最常遇到的问题。 答案是:你没等新内容加载出来,就去取数据了。 这篇文章把滚…

2026/7/23 0:31:34 阅读更多 →
影刀RPA 网页表单自动填充:文本框、下拉框、单选复选框的完整处理

影刀RPA 网页表单自动填充:文本框、下拉框、单选复选框的完整处理

影刀RPA 网页表单自动填充:文本框、下拉框、单选复选框的完整处理 作者:林焱 表单填写是网页自动化里最高频的操作。注册账号、提交申请、录入数据、搜索筛选——背后都是表单填充。但很多新手在写表单自动化的时候,经常遇到:文本…

2026/7/23 0:31:34 阅读更多 →
影刀RPA 网页自动化中的等待策略进阶:等待元素出现消失与文本变化

影刀RPA 网页自动化中的等待策略进阶:等待元素出现消失与文本变化

影刀RPA 网页自动化中的等待策略进阶:等待元素出现消失与文本变化 上一篇讲过四种基础等待(固定、智能、条件、事件)。这篇文章更进一步,讲实际业务中的等待策略怎么选、怎么组合、怎么避免"等太久"和"没等到就跑…

2026/7/23 0:31:34 阅读更多 →
影刀RPA 网页翻页全攻略:页码与加载更多

影刀RPA 网页翻页全攻略:页码与加载更多

影刀RPA 网页翻页全攻略:页码与加载更多 作者:林焱 什么情况用什么 采集列表数据时一页只有20条,总共几百上千条需要翻页。不同网站的翻页方式不同——有传统的页码点击翻页、有"加载更多"按钮、有无限滚动。在影刀RPA里需要根据不…

2026/7/23 0:30:34 阅读更多 →
Workflow 与 Agent 到底有什么区别?—— 从流水线到智能体的全面解析

Workflow 与 Agent 到底有什么区别?—— 从流水线到智能体的全面解析

文章目录一、从一个 Chain 说起二、AI Workflow 工作流:确定性执行的"智能流水线"2.1 什么是 Workflow?2.2 Coze 可视化工作流:拖拽式 AI 编排2.3 Workflow 的三大特征2.4 LangChain:Workflow 的开发框架三、举例&#…

2026/7/23 0:30:34 阅读更多 →
容器逃逸实战:从Docker突破到K8s集群控制的完整攻击链

容器逃逸实战:从Docker突破到K8s集群控制的完整攻击链

"容器不是牢笼。"这句话在安全圈流传已久,但直到你亲手从一个容器里逃出来,才真正理解它的含义。本文完整复盘一次从容器内权限到宿主机Root的逃逸之旅。前言在云原生时代,容器安全已成为企业安全体系的最后一道防线。很多人认为&q…

2026/7/23 0:28:33 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/22 12:54:44 阅读更多 →

月新闻