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 的介入点:
在出站方向,数据包经过 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 三者形成如下协作流程:
- 数据包到达网卡关联的 根 qdisc。
- 根 qdisc 将数据包交给 filter 进行匹配。
- filter 根据规则将数据包导向对应的 class。
- class 按照自身的带宽参数对数据包进行排队和调度。
- 如果 class 有子 qdisc,数据包继续向下传递;否则直接发送。
常见误区:初学者常误以为 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 |