1. 从零开始理解Linux流量控制:它到底是什么?
如果你管理过服务器,或者折腾过家里的软路由,大概率遇到过这样的场景:内网某个设备疯狂下载,把整个网络的带宽都占满了,导致其他人连网页都打不开。又或者,你想保证视频会议流量的优先级,让它永远流畅不卡顿。这时候,光靠路由器自带的简单QoS功能可能就力不从心了。而Linux系统内核里,其实藏着一个功能极其强大、但也让很多人望而却步的工具——Traffic Control,简称 tc。
简单来说,tc就是Linux内核自带的网络流量“交警”。它能在数据包离开或进入你的网卡之前,对它们进行精细化的管理和调度。这个“交警”不单单是简单地限速(比如把某个IP的速度限制在1Mbps),它还能做更复杂的事情:比如给不同类型的流量划分不同的“车道”(分类),确保重要的流量(如SSH、视频通话)优先通行;或者像水库蓄水一样,平滑突发的数据流,避免网络拥堵;甚至可以对不守规矩的、超过配额的流量进行“罚款”(丢弃数据包)。
很多朋友一听到“内核”、“流量控制”就觉得是底层开发或者网络专家才需要懂的东西。其实不然,它的应用场景非常贴近我们日常:
- 服务器运维:防止某个服务或用户耗尽出口带宽,影响其他关键业务。
- 家庭网络/软路由:实现比普通路由器更智能、更公平的带宽分配和流量整形。
- 开发测试:模拟弱网环境,比如高延迟、低带宽、丢包等,来测试你的应用程序是否健壮。
- 网络研究:实现复杂的队列调度算法,进行网络性能实验。
我刚开始接触tc时,也被它复杂的术语和命令搞得头晕。但后来发现,只要理解了它的核心设计思想,那些命令就变成了实现想法的工具,用起来就得心应手了。接下来,我们就一起揭开这位“交警”的神秘面纱,看看它到底是怎么工作的。
2. 核心机制拆解:qdisc、class与filter的“树形王国”
tc的强大和灵活,源于其优雅的树形结构模型。这套模型主要由三个核心组件构成:队列规则(qdisc)、类(class) 和过滤器(filter)。你可以把它们想象成一个公司的组织结构。
## 2.1 队列规则(qdisc):流量的总调度中心
qdisc,全称Queueing Discipline,即队列规则。它是附着在每块网卡上的“总调度中心”。所有要从这块网卡出去(egress)的数据包,都必须经过这个调度中心的处理。你可以把它理解为公司的大门,所有人出门都得守这里的规矩。
qdisc分为两大类,这个分类非常重要:
- 无分类qdisc:这种调度中心内部结构简单,没有下级部门。它对所有数据包一视同仁,采用统一的规则进行处理,比如简单的先进先出(FIFO),或者随机公平队列(SFQ)。它只能作为“根qdisc”,直接挂在网卡上。常见的
pfifo_fast(Linux默认的出口队列)、tbf(令牌桶)、sfq都属于这一类。 - 有分类qdisc:这种调度中心本身就是一个复杂的组织结构,它内部可以创建多个下级部门(class),从而对不同流量进行差异化处理。HTB(Hierarchical Token Bucket) 和 CBQ 就是最常用的有分类qdisc。我们实现复杂流量控制,主要就是和它们打交道。
这里有一个非常关键的实战细节:我们通常讨论和配置的qdisc,都是指出口(egress)方向。因为控制数据包何时发送、以什么顺序发送,在出口方向逻辑上更直接。那么,如果想控制入口(ingress)流量(比如限制某个IP的下载速度)该怎么办呢?tc提供了一个特殊的ingress qdisc,但它能力有限,不能包含子类。更通用的做法是借助一个叫 ifb(Intermediate Functional Block) 的内核模块。它的思路很巧妙:把流入的流量,通过一个动作“镜像”到一个虚拟的ifb网卡上,然后在这个ifb网卡的出口方向进行控制,最后再把流量送回去。这样,我们就能用熟悉的egress控制机制来管理in

1万+

被折叠的 条评论
为什么被折叠?



