Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)

TC(TrafficControl)是Linux操作系统中的流量控制工具,通过设置队列规定(qdisc)、类(class)和过滤器(filter)来管理网络流量。本文介绍了如何限制网卡eth0速率为10Mbps的示例,并详细讲解了TC的基本原理和组件。无类别队列规定如pfifo_fast、TBF等提供简单的流量整形,而分类队列规定如HTB(HierarchicalTokenBucket)则能实现更精细的控制。HTB因其易用性在流量控制中被广泛使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tc CLI - Linux 流量控制工具


TC(Traffic Control)是 Linux 操作系统的流量控制器,它利用 “队列规定” 建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。

示例:限制网卡 eth0 的速率为 10Mbps

tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb lat 400.0ms
tc -s qdisc ls dev eth0

TC 的基本原理

数据包从 Input Interface 进入,经过 Ingress Policing 时丢弃了不符合规定的数据包,通过的数据包再由 Input De-Multiplexing(输入多路分配器)进行判断选择。

如果数据包的目的地是本主机,那么将数据包送给上层处理;否则需要进行 Forward(转发),将数据包交到 Forwarding Block(转发块)处理。Forwarding Block 同时也接收本主机上层(e.g. TCP、UDP 等网络协议栈)产生的包。 Forwarding Block 通过查看路由表,决定数据包的下一跳。然后,对数据包进行排列并传送到 Output Interface。

一般来说 Linux 只能限制网卡发送的数据包,而不能限制网卡接收的数据包,Linux 可以通过改变发送的次序来控制传输速率。Linux TC(Traffic Control)主要是在输出接口排列时进行处理和实现的。


TC 的组件

TC 主要由 qdisc(队列规定),class(类)和 filter(过滤器)这 3 个组件构成。

  • ​qdisc​:通过队列将数据包缓存起来,用来控制网络收发的速度。
  • ​class​:用来表示控制策略。
  • ​filter​:用来将数据包划分到具体的控制策略。

绘图中一般用圆形表示 qdisc,用矩形表示 class:

Qdisc


Qdisc,队列,更准确应该称之为排队规则,是管理网卡输入/输出数据的一个算法,用于确定数据包的发送方式。每张网卡都与一个 Qdisc 关联,每当 Linux Kernel 需要将数据包从网卡发送时,都会先将数据包添加到该网卡所配置的 Qdisc 中,由 Qdisc 来决定数据包的发送顺序。因此可以说,所有的流量控制都发生在队列中。

TC 的 Qdisc 类型有很多,如:CBQ、HTB 等等。其中 CBQ 比较复杂,不容易理解。而 HTB(Hierarchical Token Bucket,分层令牌桶)是一个可分类的队列,与其他复杂的队列类型相比,HTB 具有功能强大、配置简单及容易上手等优点。下文示例中使用了 HTB。

总的来说,Qdisc 可分为两类:​无类别队列规定​ 和 ​分类队列规定​。前者相对简单,而分类队列规定则具有分类和过滤器等概念,是高级的流量控制功能。

无类别队列规定(Classless Qdiscs)


所谓 “无类别”,即:对进入网卡的数据包不加以区分,使用统一的队列规定。

  • 无类别队列规定的队列支持:接受数据包、重新编排数据包、延迟或丢弃数据包,可以对整个网卡的流量进行整形,但不会细分各种情况。
  • 常用的无类队别规定队列主要有:pfifo _fast(先进现出,默认队列)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(前向随机丢包)等等。
  • 这类队列规定使用的流量整形手段主要是:排序、限速和丢包。


分类队列规定(Classful Qdiscs)


所谓 “分类”,即:对进入网络设备的数据包根据不同的需求以分类的方式区别对待。

数据包进入一个分类队列规定的队列后,就被送到了某一个类中,即对数据包进行分类处理。对数据包进行分类的工具是过滤器,过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的分类中进行排队。
每个分类又可以拥有多个子类,而每个子类都可以再次使用各自的过滤器进一步的分类,直到不需要再次分类为止,数据包才进入该类包含的队列中排队。
除了能够包含其它队列规定之外,绝大多数的分类队列规定还能够对流量进行整形。这在需要同时进行调度和流量控制的场景中非常有用。

Class


如果一个类没有子类,那么这个类被称为叶子类,否则就被成为内部类。如上图,1:1 和 1:12 是内部类,其他均为叶子类。叶子类都拥有一个负责为这个类发送数据的 Qdiscs,而且这个 qdisc 是可以再次分类的,如 1:10 有一个分类的队列规定。

Filter


就是一些规则,根据这些规则对数据包进行分类,过滤器可以属于 Qdiscs,也可以属于内部类,若需要在叶子类上再实现分类,那就必须将过滤器与叶子类的分类队列规定关联起来,而不能与叶子类相关联。

最常用的是 U32 过滤器,由一个过滤器和一个动作组成,选择器用来对数据包进行匹配,一旦匹配成功就执行该动作。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值