tc命令介绍
流量控制的一个基本概念就是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系。每当内核需要将报文分组从网卡发送出去,都会首先将该报文分组添加到网卡所配置的队列中,由该队列决定报文分组的发送顺序。因此,所有的流量控制都发生在队列中。
什么是报文分组
报文分组(Packet)是计算机网络中数据传输的基本单位。当一个数据包需要在网络中传输时,它会被分割成多个较小的部分,每个部分被称为报文分组。这种分割的过程称为分组(Packetization)。
报文分组通常包含一些头部信息和有效载荷(Payload)。头部信息包含了发送和接收数据的相关信息,例如源地址、目标地址、数据序号、错误检测等。有效载荷是实际需要传输的数据。
通过将数据划分为报文分组,网络可以更有效地传输大量的数据。它允许网络将分组分别发送到目标地址,然后在目标端重新组装这些分组,恢复原始的数据。这种分组传输方式可以提高数据传输的效率,并允许多个数据流同时在网络中传输。
报文分组还具有一些其他的优势。由于分组较小,因此即使在网络中出现错误或丢失,仅需要重新传输受影响的分组,而不是整个数据。此外,分组传输还允许在网络中进行路由选择,即根据每个分组的目标地址选择最佳路径进行传输。
总而言之,报文分组是计算机网络中数据传输的基本单元,它将数据划分为较小的部分,通过网络进行传输,并在目标端重新组装以恢复原始数据。
要实现功能强大的流量控制,可分类的队列必不可少。因此类别(calss)和过滤器(Filter)也是流量控制的另外两个重要基本概念,而且类别和过滤器都是队列的内部结构,并且可分类的队列可以包含多个类别。
过滤器是队列用来对数据报文进行分类的工具,它决定了一个数据报文被分配到哪个类别中。
通常,要对网卡进行流量控制的配置,需要进行如下的步骤:
1、为网卡配置一个队列
2、在该队列上建立分类
3、根据需要建立子队列和子分类
4、为每个分类建立过滤器
下面,将以HTB队列为主,结合需求来讲述TC的使用。假设eth0出口有100Mbit/s的带宽,分配给WWW 、E-mail和Telnet三种数据流量,其中分配给WWW的带宽为40Mbit/s,分配给Email的带宽为40Mbit/s,分配给Telnet的带宽为20Mbit/s。
需要注意的是, 在TC 中使用下列的缩写表示相应的带宽:
- Kbps:kiIobytes per second,即 “千字节每秒”
- Mbps:megabytes per second,即 “兆字节每秒 ”
- Kbit:kilobits per second,即 “千比特每秒”
- Mbit:megabits per second,即 “兆比特每秒”
有关队列的TC命令的一般形式:
# tc qdisc [add|change|replace|link] dev DEV [parent qdisk-id|root][handle qdisc-id] qdisc[qdisc specific parameters]
1、创建HTB队列
为网卡etho配置一个HTB队列的tc命令:
# tc qdisc add dev eth0 root handle 1: htb default 11
add
表示要添加dev eth0
表示要操作的网卡为eth0root
表示为网卡eth0添加的是一个根队列handle 1:
表示队列的句柄为1:htb
表示要添加的队列为HTB队列default 11
是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:11
2、为根队列创建相应的类别
有关类别的TC一般命令形式:
# tc class [add|change|replace] dev DEV parent qdisc-id [classid class-id] qdisc [qdisc specific parameters]
可以使用以下3个命令为根队列1创建三个类别,分别是1:11、1:12、1:13
tc class add dev eth0 parent 1: classid 1:11 htb rate 40mbit ceil 40mbit
tc class add dev eth0 parent 1: classid 1:12 htb rate 40mbit ceil 40mbit
tc class add dev eth0 parent 1: classid 1:13 htb rate 40mbit ceil 20mbit
各项的含义:
parent 1:
表示类别的父亲为根队列1:classid 1:11
表示创建一个标识为1:11的类别rate 40mbit
表示系统将为该类别确保带宽40mbitceil 40mbit
表示该类别的最高可占用带宽为40mbi
3、为各个类别设置过滤器
有关过滤器的tc一般命令:
# tc filter [add|change|replace] dev DEV [parent qdisc-id|root] protocol protocol prio priority filtertype [filtertype specific parameters] flowid flow-id
由于需要将WWW、E-mail、Telnet三种流量分配到三个类别,即上述1:11、1:12和1:13,因此,需要创建三个过滤器,如下面的三个命令:
# tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11
# tc filter add dev eth0 prtocol ip parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:12
# tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 23 oxffff flowid 1:13
各项的含义:
protocol ip
表示该过滤器应该检查报文分组的协议字段prio 1
表示它们对报文处理的优先级是相同的,对于不同优先级的过滤器,系统将按照从小到大的优先级顺序来执行过滤器,对于相同的优先级,系统将按照命令的先后顺序执行- 这几个过滤器还用到了u32选择器(命令中u32后面的部分)来匹配不同的数据流。以第一个命令为例,判断的是dport字段,如果该字段与Oxffff进行与操作的结果是80,则
flowid 1:11
表示将把该数据流分配给类别1:11
参考文档:
TC命令原理详解一
https://blog.csdn.net/hexf9632/article/details/118568933
TC命令原理详解二
https://blog.csdn.net/hexf9632/article/details/118577477
TC命令原理详解三
https://blog.csdn.net/hexf9632/article/details/118634487
https://blog.csdn.net/shihunyewu/article/details/98984217