tc:traffic control,即交通控制。
1.基本工作流程
使用tc命令,需要理解三个Linux内核网络中的概念:
- qdisc:是Queue Discipline的缩写,中文是队列规则,就是数据包怎么入队,每个网口都有一个总队列。
- class:子出口,每个出口有自己的具体限制规则。这是逻辑上的出口,只是为了便于说明,也可以叫其他名字。
- filter:规定了总队列中的哪类数据,进入到哪个子队列。
qdisc 是挂在网卡上的“总调度员”,class 是它手下的“分车道”(各有各的限速),而 filter 就是站在入口的“交警”,根据数据包的IP/端口,把它们指挥进对应的高速公路”出口“。
所以tc命令的作用是识别网络数据流 + 限制网络数据流,可以精确到每一个数据包。
2.tc的五大应用功能
一般用tc命令实现以下五大功能:
- 流量整形
- 流量调度
- 流量策略
- 流量丢弃
- 网络模拟
对数据包精准控制正是实现这些功能的核心机理。
2.tc命令底层实现
tc是用户态程序,它需要和内核通信才能实现对网络协议栈的控制。通信方式不是一般的系统调用,而是网络模块特有的Netlink通信方式。
tc 命令 (用户态) → 构建 Netlink 消息 → 通过 socket() 等系统调用发送 → 内核 Netlink 子系统接收 → 内核 TC 子系统执行操作。
这里的关键在于,具体的“队列规则”逻辑完全是在Linux内核中实现的。tc 工具本身不执行任何流量整形或排队,它只是一个“配置下发器”,其真正的威力来自于内核中复杂而高效的 TC 子系统。