Linux tc流量限速回滚与性能验证 - 第1节

1.1 什么是 TC(Traffic Control)

TC(Traffic Control)是 Linux 内核提供的流量控制子系统,用于管理网络数据包的发送与接收顺序、速率和优先级。它允许系统管理员对出站(egress)和入站(ingress)流量施加策略,实现带宽限制、优先级调度、流量整形(shaping)和策略控制(policing)。

TC 的核心价值在于:在不修改应用程序的前提下,通过内核层面的排队规则对网络流量进行精细化管控。它是 Linux 网络虚拟化、容器网络 QoS、数据中心带宽保障等场景的基础设施。

关键理解:TC 工作在数据包从协议栈发送到网卡驱动之前(出站方向),或从网卡驱动进入协议栈之后(入站方向)。它不修改数据包内容,只控制数据包的发送时机和丢弃策略。

1.2 TC 在 Linux 网络栈中的位置

TC 位于 Linux 内核网络协议栈的链路层与网络层之间。下图展示了数据包发送路径中 TC 的介入点:

TC 在 Linux 网络栈中的位置(出站方向) 应用层 (Socket) 传输层 (TCP/UDP) 网络层 (IP 路由) TC (Traffic Control) — qdisc / class / filter 网卡驱动 (NIC) 数据包发送路径 从上到下依次经过各层 TC 介入点 路由决策之后,网卡发送之前

在出站方向,数据包经过 IP 路由决策后,进入与网卡关联的 qdisc(排队规则)。TC 在此处对数据包进行排队、整形、分类和丢弃。入站方向则通过 ingress qdisc 在数据包进入协议栈前进行策略控制。

1.3 TC 的核心组件

TC 由三个核心组件构成:qdisc、class 和 filter。三者协同工作,形成完整的流量控制管道。

1.3.1 qdisc(排队规则)

qdisc 是 TC 的基础调度单元,每个网络接口至少有一个根 qdisc。qdisc 分为两类:

类型 说明 典型算法
classful qdisc 可包含多个子类和 filter,支持流量分类和分层调度 HTB、CBQ、HFSC
classless qdisc 简单排队,不包含子类,所有流量统一处理 pfifo_fast、TBF、SFQ、fq_codel
实战要点:在限速回滚场景中,最常用的 classful qdisc 是 HTB(Hierarchical Bucket),它支持多层带宽分配和借用机制,适合企业级带宽管控。

1.3.2 class(类)

class 是 classful qdisc 内部的流量分类单元。每个 class 可以拥有独立的带宽参数(rate、ceil、prio),并可以嵌套子类形成树形结构。class 通过 classid 唯一标识,格式为 major:minor。

class 的核心属性:

  • rate:保证带宽(最小带宽)
  • ceil:最大带宽(上限带宽)
  • prio:优先级(数值越小优先级越高)
  • burst:突发流量大小

1.3.3 filter(过滤器)

filter 负责将数据包匹配到指定的 class。TC 支持多种过滤方式:

过滤类型 匹配依据 常用场景
u32 数据包头部字段(IP、端口、协议等) 按 IP 地址或端口限速
fw iptables 设置的 mark 值 与防火墙策略联动
cgroup 进程 cgroup 分类 容器或进程级限速
flow 流哈希(5元组) 连接级负载均衡

1.4 三组件协作关系

qdisc、class、filter 三者形成如下协作流程:

  1. 数据包到达网卡关联的 根 qdisc。
  2. 根 qdisc 将数据包交给 filter 进行匹配。
  3. filter 根据规则将数据包导向对应的 class。
  4. class 按照自身的带宽参数对数据包进行排队和调度。
  5. 如果 class 有子 qdisc,数据包继续向下传递;否则直接发送。
TC 核心组件协作流程 入站数据包 根 qdisc (如 HTB) filter (u32 / fw / cgroup) class 1:1 (高优先级) class 1:2 (普通流量) class 1:3 (低优先级) 协作流程:数据包 → 根 qdisc → filter 分类 → 对应 class 排队 → 按带宽参数发送 每个 class 可独立配置 rate/ceil/prio,实现精细化带宽分配
常见误区:初学者常误以为 filter 直接挂在网卡上。实际上 filter 必须依附于 classful qdisc(如 HTB),且 filter 的 parent 指向 qdisc 或 class。删除 qdisc 时,其下的所有 class 和 filter 会被级联删除,这是回滚操作的核心依据。

1.5 组件关系总结

组件 角色 标识方式 删除影响
qdisc 排队调度器,决定数据包发送顺序和速率 dev eth0 root 或 parent classid 删除根 qdisc 会移除所有子类和 filter
class 流量分类单元,承载带宽参数 classid major:minor 删除 class 会移除其子 qdisc 和子类
filter 数据包分类器,将流量导向指定 class parent qdisc/class + protocol + prio 删除 filter 不影响 qdisc 和 class