首页 > 代码库 > linux tc流量控制 学习
linux tc流量控制 学习
楼主最近学习了一下tc,感觉真的不好理解,一下是个人的理解,有不正确的地方请高手指点
在介绍tc的逻辑前,我要强调tc的逻辑流程图,你要把它想象成树形结构
何为树形结构,章节下面我会具体说明
顶层qdisc分为两种类型:
无分类qdisc和有分类qdisc
什么叫做无分类qdisc:没有class,在qdisc上做限制
什么叫做有分类qdisc:qdisc---class---filter 结构
一.qdisc又有2种算法的分类
其中针对带宽的算法,分为3种
1.CBQ:(1)限制带宽 默认的算法
(2)优先级的概念
2.HTB:也具有以上两点特性,唯一不同的在于,可以保障提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量.当一个类需要的带宽少于分配的带宽时,剩余的带宽被分配给其他需要服务的类
3.PRIO:不能限制带宽,对带宽进行优先级管理,不允许动态添加类
其中针对队列的算法,分为2种
1.pfifo:为先进先出,以数据包个数为单位(来进行队列长度的规定)
2.bfifo:也为先进先出,以字节数为单位(规定队列长度的大小)
二.class
一般class都会有一个父类,父类下面再分很多的子类。每个子类里定义限制流量的具体逻辑
三.filter
fllter服务于分类
下面先说下怎么创建一个完整的tc规则,并被使用
1.创建qdisc队列
2.创建class,指明所用的那个队列
3.创建filter,指明要服务于那个class
下面说明一下qdisc和class的命名规则
例如
tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit #handle 1:是创建一个队列名称为1:0,注意只有qidsc可以在从序列号上定义为0,class不可以
class的命名规则为1:* 1叫做句柄也就是qdisc的handle *为class自身的id,也可以理解为 主序列号:从序列号
下面我来说明一个具体的例子
1.tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit default 12
解释:我创建了针对于eth0的队列,队列的句柄名称为1:0,这个网卡的实际带宽为10Mbit,转换成MB也就是1MB,用cbq算法,filter中没有规定的也就是带宽可以借用,什么叫做带宽可以借用,下面我会说明,借用谁的
2.tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit
解释:我创建了一个针对于eth0的类,其父类为上面定义的1:0,自身的id为1:1,实际带宽为10Mbit,允许使用带宽为10Mbit,利用cbq算法,上面已经说过cbq算法的大体特性
3.tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit
解释:我创建了一个针对于eth0的类,其父类是class id为1:1的类,实际带宽为10Mbit,允许使用带宽为8Mbit
4.tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 1Mbit
解释:我创建了一个针对于eth0的类,其父类是class id为1:1的类,实际带宽为10Mbit,允许使用带宽为1Mbit
下面我就不再创建了,解释下文章最开头所说的树形结构的意思,就拿这个例子来说
qdisc 1:0 1:0队列
|
class 1:1 父分类
|
class 1:2 class 1:3 子分类
上面又说过htb规则的特点流量的借用,着又是什么呢,那这个结构来说明
如果class 1:2这个分类的算法设计的是允许带宽为8Mbit,如果不够用了,可以向父类去借,父类定义的带宽为10Mbit,也就是说可以去借2Mbit,但是父类下面有很多的子类,这些子类也在被使用着,导致带宽不足,这时父类就无法借给,索要带宽的子类,这就是htb规则的最大特性
tc的内容还有很多很多,这里面我先介绍到这里,比较基础的内容,在之后的博客里还会继续更新tc的使用说明
linux tc流量控制 学习