尧图精选

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

🕒 发布时间:2026/10/1 14:29:33 📁 来源:尧图网络
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/或我的
上一篇/下一篇内容由系统自动关联 返回资讯列表 →