Linux tcp_congestion_ops 拥塞控制算法结构体注册机制
Linux tcp_congestion_ops 拥塞控制算法结构体注册机制tcp_congestion_ops 是 TCP 拥塞控制算法的接口抽象定义在 include/net/tcp.h 中。所有拥塞控制算法Cubic、BBR、Reno、Westwood、DCTCP 等通过该结构体向内核注册。结构体包含拥塞控制状态的初始化、cwnd 在每个 ACK 到达时的更新、丢包事件响应、cwnd_undo撤销错误减窗以及 pkts_acked 速率采样等回调函数指针。cstruct tcp_congestion_ops {struct list_head list;unsigned long flags;__u32 key;char name[TCP_CA_NAME_MAX];struct module *owner;int (*init)(struct sock *sk);void (*release)(struct sock *sk);void (*ssthresh)(struct sock *sk);u32 (*cwnd)(const struct sock *sk);void (*cong_control)(struct sock *sk, const struct rate_sample *rs);void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked);u32 (*undo_cwnd)(struct sock *sk);void (*pkts_acked)(struct sock *sk, const struct ack_sample *sample);void (*set_state)(struct sock *sk, u8 new_state);...};算法注册通过 tcp_register_congestion_control 完成函数将 ops 插入全局链表 tcp_cong_list由读写锁 tcp_cong_list_lock 保护。模块初始化时调用 tcp_register_congestion_control(tcp_cubic_ops)清理时调用 tcp_unregister_congestion_control 从链表中移除。注册过程对 ops-key 做了唯一性检查防止同一算法重复注册。cint tcp_register_congestion_control(struct tcp_congestion_ops *ca){int ret 0;if (!ca-cong_control (!ca-cong_avoid || !ca-ssthresh))return -EINVAL;write_lock(tcp_cong_list_lock);if (tcp_ca_find_key(ca-key)) {ret -EEXIST;} else if (!tcp_ca_find(ca-name)) {list_add_tail_rcu(ca-list, tcp_cong_list);pr_debug(%s registered\n, ca-name);} else {ret -EEXIST;}write_unlock(tcp_cong_list_lock);return ret;}关键验证若未实现 cong_controlBBR 风格则必须同时实现 cong_avoid 和 ssthreshclassic AIMD 风格否则返回 -EINVAL。注册时检查 name 的唯一性但 key 冲突则返回 -EEXIST。list_add_tail_rcu 将新算法追加到链表尾部使旧算法如 CUBIC 作为默认优先级更高——tcp_ca_find 首次匹配就返回链表头部是内置算法。运行时每个 TCP socket 的 icsk_ca_ops 指针通过 tcp_assign_congestion_control 赋值。该函数在 tcp_init_transfer 中调用决定算法选择优先级控制面通过 sysctl_tcp_congestion_control 设定随后检查 TCP_CONGESTION sockoptsetsockopt IPPROTO_TCP TCP_CONGESTION最后 fallback 到系统默认值。cvoid tcp_assign_congestion_control(struct sock *sk){struct net *net sock_net(sk);struct tcp_congestion_ops *ca;const char *name net-ipv4.tcp_congestion_control;if (sk-sk_txhash)name tcp_ca_get_name_by_key(sk-sk_txhash TCP_CA_KEY_MASK);if (!name)name tcp_ca_get_default(sk);rcu_read_lock();ca tcp_ca_find(name);if (unlikely(!ca)) {ca tcp_ca_find(cubic);}if (ca ! rcu_dereference(icsk-icsk_ca_ops)) {rcu_assign_pointer(icsk-icsk_ca_ops, ca);if (ca-init)ca-init(sk);}rcu_read_unlock();}这里存在动态切换路径当 __tcp_transmit_skb 处于 BH 上下文中时icsk_ca_ops 被 rcu_assign_pointer 切换读者须使用 rcu_dereference 读取。若在 tcp_ack 中不加 RCU 保护直接读取 icsk_ca_ops-cong_control在并发 tcp_set_congestion_control 被 setsockopt 调用时会出现读取到空指针或中间状态。内核通过 rcu_read_lock/rcu_dereference 包裹 tcp_cong_control 中所有对 icsk_ca_ops 的访问。拥塞控制算法切换的竞争条件tcp_set_congestion_control 被用户态线程调用时持有 lock_sock而 tcp_ack 运行在 BH 上下文中仅持有 bh_lock_sock。若 tcp_set_congestion_control 调用 ca-release旧算法析构且 ca-init新算法构造在 release 后 init 前的窗口内如果有 BH 到达并调用 ca-pkts_acked会读取到已释放的 ca 指针。解决方法是调用 synchronize_net() 等待正在执行的 BH 完成但 synchronize_net 可能睡眠因此 tcp_set_congestion_control 必须在进程上下文中调用且不能持有 spinlock。cint tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool rcu_locked){struct tcp_congestion_ops *ca;int err;ca tcp_ca_find(name);if (!ca) {if (!load)return -ENOENT;err request_module(tcp_%s, name);if (err 0)return -ENOENT;ca tcp_ca_find(name);if (!ca)return -ENOENT;}if (!try_module_get(ca-owner))return -EAGAIN;tcp_ca_switch(sk, ca);module_put(ca-owner);return 0;}icsk_ca_priv 是拥塞控制算法私有状态的存储区尺寸固定为 96 字节。CUBIC 使用的结构体 struct bictcp44 字节、BBR 使用的 struct bbr64 字节均在此区域内使用前通过 inet_csk_ca(sk) 强制类型转换。当私有状态超出 96 字节时内核在 tcp_register_congestion_control 中检查 BUILD_BUG_ON 并拒绝注册。私有数据的初始化在 ca-init(sk) 回调中完成释放时 ca-release(sk) 清理 DCTCP 的 dctcp_shadow 等额外分配内存。pacing rate 与 cwnd 的协调tcp_cong_control 调用 ca-cong_control 时传递 struct rate_sample其中包含 delivered当前 RTT 内确认的数据量和 interval_us确认间隔。BBR 依赖该数据进行带宽估计而 CUBIC 则主要使用 ca-cong_avoid 更新 snd_cwnd。两套接口的切换在 tcp_ca_dst 选择的 tcp_cong_control 内部完成如果 ops-cong_control 不为 NULL则不调用传统的 cong_avoid/ssthresh 路径。

相关新闻

AI多模态无限画布平台——完整技术设计与实现方案

AI多模态无限画布平台——完整技术设计与实现方案

AI多模态无限画布平台——完整技术设计与实现方案 一、项目概述与技术架构 1.1 项目背景 随着AIGC技术的快速发展,传统的单模态创作工具已经难以满足创作者日益复杂的需求。当前的AI创作工具多聚焦单一模态(如文生图或文生视频),创作者需要在多个工具之间反复切换,导致…

2026/7/25 8:16:53 阅读更多 →
四大AI大模型免费资源获取与优化使用指南

四大AI大模型免费资源获取与优化使用指南

1. 大模型免费资源现状解析最近各大AI厂商纷纷推出免费额度政策,DeepSeek、GLM、MiniMax、Kimi等主流大模型每天提供上亿token的免费调用额度。这波福利来得突然,但背后逻辑很清晰——厂商们正在通过免费策略培养用户习惯,为后续商业化铺路。…

2026/7/25 15:36:42 阅读更多 →
5分钟快速掌握m4s-converter:一键将B站缓存视频转换为永久MP4格式

5分钟快速掌握m4s-converter:一键将B站缓存视频转换为永久MP4格式

5分钟快速掌握m4s-converter:一键将B站缓存视频转换为永久MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这…

2026/7/26 7:44:06 阅读更多 →

最新新闻

智能论文写作平台:从选题到答辩的全流程优化

智能论文写作平台:从选题到答辩的全流程优化

1. 项目背景与痛点解析 本科毕业论文写作是每个大学生必须经历的重要学术训练环节,但传统写作模式存在诸多痛点。我在指导学弟学妹论文时发现,90%的学生会遇到以下典型问题:文献检索效率低下导致开题困难、论文结构逻辑混乱、格式规范反复修改…

2026/7/26 15:03:55 阅读更多 →
HunterPie:怪物猎人世界游戏数据覆盖工具的完整指南

HunterPie:怪物猎人世界游戏数据覆盖工具的完整指南

HunterPie:怪物猎人世界游戏数据覆盖工具的完整指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/HunterPie-lega…

2026/7/26 15:03:55 阅读更多 →
边缘大模型:AI算力分布式部署与优化实践

边缘大模型:AI算力分布式部署与优化实践

1. 边缘大模型:当AI算力不再集中三年前训练一个基础版GPT-3需要上千张GPU卡和数百万电费,现在用树莓派集群就能跑70亿参数的模型——这就是边缘大模型带来的变革。这个技术方向正在彻底改变AI算力的分布方式,让智能从云端数据中心走向你家中的…

2026/7/26 15:03:55 阅读更多 →
20分钟快速上手TI DM36x IP摄像头:从开箱到实时视频流访问

20分钟快速上手TI DM36x IP摄像头:从开箱到实时视频流访问

1. 项目概述与核心价值如果你是一名嵌入式开发工程师,或者正在涉足视频监控、机器视觉相关的产品研发,那么“如何在最短时间内让一个复杂的开发板跑起来”绝对是你最关心的问题之一。我最近在整理一个基于TI TMS320DM36x芯片的IP摄像头参考设计套件&…

2026/7/26 15:03:55 阅读更多 →
从用户到管理员:Coordino权限管理与角色配置详解

从用户到管理员:Coordino权限管理与角色配置详解

从用户到管理员:Coordino权限管理与角色配置详解 【免费下载链接】Coordino Self-hosted Knowledge Software your question & answer system written on top of the CakePHP Framework 项目地址: https://gitcode.com/gh_mirrors/co/Coordino Coordino作…

2026/7/26 15:03:55 阅读更多 →
Bifrost三星固件下载工具:跨平台免费解决方案完整指南

Bifrost三星固件下载工具:跨平台免费解决方案完整指南

Bifrost三星固件下载工具:跨平台免费解决方案完整指南 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为三星手机固件下载和解密而烦恼吗&#x…

2026/7/26 15:02:55 阅读更多 →

日新闻

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

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

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

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

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

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

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

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

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

2026/7/26 0:00:31 阅读更多 →

周新闻

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

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

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

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

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

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

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

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

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

2026/7/26 0:00:31 阅读更多 →

月新闻