新闻详情

新闻详情

首页 / 资讯中心 / 详情

Linux网络之TC (Traffic Control) 网络流控子系统分析

发布时间:2026/10/1 14:29:29来源:尧图网络
Linux网络之TC (Traffic Control) 网络流控子系统分析
Linux网络之TC (Traffic Control) 网络流控子系统分析 | DDNotesLinux网络之TC (Traffic Control) 网络流控子系统分析 基于 Linux Kernel v7.1.0-rc6 分析 一、概念总览1.1 什么是 TCTCTraffic Control是 Linux 内核中的网络流量控制框架位于网络设备驱动层之上、协议栈之下。它在数据包的 发送路径Egress和接收路径Ingress 上提供了一个可编程的包处理管线用于实现https://notes.z-dd.online/2026/07/07/Linux%E7%BD%91%E7%BB%9C%E4%B9%8BTC%20(Traffic%20Control)%20%E7%BD%91%E7%BB%9C%E6%B5%81%E6%8E%A7%E5%AD%90%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90/Linux网络之TC (Traffic Control) 网络流控子系统分析基于 Linux Kernel v7.1.0-rc6 分析一、概念总览1.1 什么是 TCTCTraffic Control是 Linux 内核中的网络流量控制框架位于网络设备驱动层之上、协议栈之下。它在数据包的 发送路径Egress和接收路径Ingress 上提供了一个可编程的包处理管线用于实现流量整形Shaping限制发送速率平滑突发流量流量 policing对超过速率限制的包进行丢弃或标记包分类Classification根据包头字段五元组、mark、接口等将包分类到不同的流队列调度Scheduling决定哪个包先被发送实现 QoS 优先级包标记/修改Marking/Editing修改包头字段DSCP、VLAN tag 等包重定向Redirect将包转发到其他设备包丢弃Dropping基于策略丢弃数据包1.2 核心组件TC 框架由三层组件构成形成分层处理管线CODE┌─────────────────────────────────────────────────┐│ Classifier (分类器) - 识别包属于哪个流 ││ 例: flower, u32, fw, bpf, matchall │├─────────────────────────────────────────────────┤│ Action (动作) - 对匹配的包执行操作 ││ 例: mirred, gact, skbedit, pedit, nat, bpf │├─────────────────────────────────────────────────┤│ Qdisc (队列规则) - 包的排队与调度 ││ 例: pfifo_fast, tbf, htb, fq_codel, prio │└─────────────────────────────────────────────────┘这三个组件通过 tcf_block过滤块 和 tcf_chain过滤链 组织在一起。1.3 关键数据结构结构体 定义位置 作用struct Qdisc include/net/sch_generic.h:69 队列规则实例每个 TX 队列挂载一个struct Qdisc_ops include/net/sch_generic.h:307 队列规则的操作函数集enqueue/dequeue/init/destroystruct tcf_proto include/net/sch_generic.h:426 分类器实例按优先级链成链表struct tcf_proto_ops include/net/sch_generic.h:357 分类器的操作函数集classify/init/destroystruct tcf_result include/net/sch_generic.h:345 分类结果包含 classid 或 goto 目标struct tcf_chain include/net/sch_generic.h:469 过滤链持有 tcf_proto 链表头struct tcf_block include/net/sch_generic.h:485 过滤块包含多条链可被多个 qdisc 共享struct qdisc_skb_head include/net/sch_generic.h:62 Qdisc 内部的 sk_buff 队列头struct mini_Qdisc include/net/sch_generic.h:1455 轻量级 Qdisc用于 ingress/clsact 快速路径二、设计原理2.1 分层架构设计TC 采用分层抽象设计核心思路是将”包的分类”与”包的调度”解耦CODE┌──────────────┐│ 用户空间 ││ tc 命令行 │└──────┬───────┘│ Netlink (RTM_NEWQDISC, RTM_NEWTFILTER)▼┌──────────────────────────────────────────────┐│ 控制平面 (Control Plane) ││ sch_api.c: tc_modify_qdisc() ││ cls_api.c: tc_ctl_filter() ││ → 创建/修改/删除 Qdisc、Filter、Action │└──────────────────────────────────────────────┘│▼┌──────────────────────────────────────────────┐│ 数据平面 (Data Plane) ││ 发送: __dev_queue_xmit() → __dev_xmit_skb()││ → q-enqueue() → q-dequeue() ││ → sch_direct_xmit() → dev_hard_start_xmit() ││ ││ 接收: __netif_receive_skb_core() ││ → sch_handle_ingress() → tc_run() ││ → tcf_classify() │└──────────────────────────────────────────────┘2.2 Qdisc 树形层次结构TC 支持 Qdisc 的层级嵌套hierarchy形成一棵树CODEroot qdisc (1:)/ \class (1:1) class (1:2)/ \ |qdisc(1:10) qdisc(1:20) qdisc(1:20)(htb) (sfq) (tbf)| | |class class leaf(1:10:1) (1:10:2) (1:20:1)Root Qdisc设备的根队列规则每个 TX 队列一个ClassQdisc 内部的逻辑分类用于带宽分配Leaf Qdisc挂在 class 下的子队列规则真正缓存包这种层次结构通过 struct Qdisc_class_ops 实现其中的 graft 和 leaf 回调负责子 qdisc 的挂载和查询。2.3 Classifier 链式匹配分类器通过 struct tcf_proto 的 next 指针形成有序链表按 prio优先级排序CODEfilter_chain → [u32 prio1] → [flower prio2] → [matchall prio3] → NULL匹配过程__tcf_classify() in cls_api.c:1712遍历链表中的每个 tcf_proto检查协议类型是否匹配tp-protocol vs skb-protocol调用具体分类器的 classify() 回调如果返回 TC_ACT_RECLASSIFY则从头重新开始如果返回 TC_ACT_GOTO_CHAIN则跳转到指定链返回分类结果classid 或 action verdict2.4 快速路径 vs 慢速路径TC 设计了快速路径Fast Path优化避免在无分类器时的开销ingress/clsact 的快速路径mini_Qdisc使用 struct mini_Qdiscsch_generic.h:1455只包含 filter_list、block 和统计信息不需要完整的 struct Qdisc 开销在 tc_run() 中直接通过 tcf_classify() 匹配不经过完整 Qdisc 流程TX 的 bypass 优化TCQ_F_CAN_BYPASS当 Qdisc 标记了 TCQ_F_CAN_BYPASS 且队列为空时包可以绕过入队/出队直接调用 sch_direct_xmit() 发送pfifo_fast 默认启用此优化2.5 锁机制设计TC 采用多级锁确保并发安全作者: Shell链接: https://notes.z-dd.online/2026/07/07/Linux%E7%BD%91%E7%BB%9C%E4%B9%8BTC%20(Traffic%20Control)%20%E7%BD%91%E7%BB%9C%E6%B5%81%E6%8E%A7%E5%AD%90%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90/来源: DDNotes著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。。。。 。。。更多请关注我的博客https://notes.z-dd.online/或我的
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LLM动手课:用Ollama沙盒亲手拆解Token与Attention 2026/10/1 15:58:15

LLM动手课:用Ollama沙盒亲手拆解Token与Attention

1. 这不是又一篇“Attention is All You Need”的复读机——而是一次真正能让你手指发烫的LLM动手课你点开过至少三篇《Transformer详解》文章,每篇开头都写着“本文将带你从零理解注意力机制”,结果看到第二段公式就自动滑到评论区找“有没有人讲得更直…

阅读更多 →
唐山宠物笼子厂商选睿庭:猫笼狗笼围栏定制,防腐耐用工艺 2026/10/1 15:58:09

唐山宠物笼子厂商选睿庭:猫笼狗笼围栏定制,防腐耐用工艺

唐山市睿庭宠物用品有限公司是一家位于唐山的宠物笼具厂商,专注猫笼、狗笼和宠物围栏的定制生产,并用防腐耐用工艺让产品更适合家庭与商业养宠空间。宠物笼具在养宠家庭中的位置养宠的人越来越多,家里多了一只猫或一只狗,空间安排…

阅读更多 →
生产线远程运维监控系统:工业网关+边云协同物联网方案 2026/10/1 15:58:09

生产线远程运维监控系统:工业网关+边云协同物联网方案

一、方案概述 当前制造业生产线普遍存在设备品类繁杂、品牌不一、协议各异的现状,多数工厂仍采用传统现场巡检、人工值守、故障事后抢修的运维模式。该模式存在诸多痛点:一是设备数据孤岛严重,PLC、传感器、机床、输送设备等生产设备数据无法…

阅读更多 →
华为metaERP 政府预算/财政拨款/国际援助/基金场景里,Fusion XCC 的关键不是“建一个政府汇率表”,而是:新建一个“预算专用 Conversion Rate Type” → 维护 D 2026/10/1 15:58:09

华为metaERP 政府预算/财政拨款/国际援助/基金场景里,Fusion XCC 的关键不是“建一个政府汇率表”,而是:新建一个“预算专用 Conversion Rate Type” → 维护 D

政府预算/财政拨款/国际援助/基金场景里,Fusion XCC 的关键不是“建一个政府汇率表”,而是:新建一个“预算专用 Conversion Rate Type” → 维护 Daily/Period Rates → 把它挂到 Government Control Budget / Grant Financial Plan Type 上 …

阅读更多 →
模板墙上二十多个名字,先别按好看选 2026/10/1 15:58:09

模板墙上二十多个名字,先别按好看选

打开应用市场,卡片比需求还多。博客、官网、帮助中心、开发者门户、社区、资料下载、招聘、活动,每一张都像能先上线。人很容易按封面选:这张更像我们品牌。一周后才发现,改文案要走的门和预想的不一样。 好看是加分项。先分清类型…

阅读更多 →
同城信息发布软件开发案例:整合家政、搬家、招聘与地图找房服务 2026/10/1 15:58:08

同城信息发布软件开发案例:整合家政、搬家、招聘与地图找房服务

同城信息平台看似只是将家政、搬家、招聘和租房等内容集中展示,真正开发时却不能简单地把所有信息放进同一种列表。不同业务分类需要展示的字段不同,用户的操作路径也存在差异:家政服务可能需要选择人员并预约付款,招聘板块主要呈…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉