流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。
qdisc 分类:
# todo 1.CLASSLESS QDisc(不可分类QDisc)
[p|b]fifo
使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位。
pfifo_fast
在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。
red:
red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。
sfq:
sfq是Stochastic Fairness Queueing(随机公平排队)的简写。它按照会话(session--对应于每个TCP连接或者UDP流)为流量进行排序,然后循环发送每个会话的数据包。
tbf
tbf是Token Bucket Filter的简写,适合于把流速降低到某个值。
# todo 2.Classful QDisc(分类QDisc)
可分类的qdisc:
CBQ
CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,
也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接
(数据链路层)的带宽。
HTB等级令牌桶
HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易
地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)
实现带宽限制,也能够划分类别的优先级
PRIO
PRIO QDisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO QDisc可以很容易对流量进行优先级管理,
只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包
FILTER(过滤器)
Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列
TC 中的 Filter 规则
filter 用来将用户划入到具体的控制策略中(即不同的 class 中).比如,现在,我们想对 xxa,xxb两个 IP 实行不同的控制策略(A,B),这时,我们可用 filter 将 xxa 划入到控制策略 A,将 xxb 划入到控制策略 B,filter 划分的标志位可用 u32 打标功能或 IPtables的 set-mark (大多使用iptables 来做标记)功能来实现。
目前,TC 可以使用的过滤器有:fwmark 分类器,u32 分类器,基于路由的分类器和 RSVP分类器(分别用于 IPV6、IPV4)等;其中,fwmark分类器允许我们使用 Linux netfilter 代码选择流量,而 u32 分类器允许我们选择基于 ANY 头的流量 .需要注意的是,filter (过滤器)是在 QDisc 内部,它们不能作为主体。
4、命名规则
所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。
ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。
==================
Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。
1、基本实现步骤为:
(1) 针对网络物理设备(如以太网卡eth0)绑定一个队列QDisc;
(2) 在该队列上建立分类class;
(3) 为每一分类建立一个基于路由的过滤器filter;
(4) 最后与过滤器相配合,建立特定的路由表。
#
要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名
# todo 示范案例:
第一步为网卡创建disc队列:为eth0网卡创建一个qdisc根队列:root表示根队列,handle 表示队列的句柄为1:,htb 表示要添加的队列为HTB队列,r2q 1表示
,是指没有 default 的root
tc disc add dev eth0 root handle 1: htb r2q 1
第二步骤为队列创建分类class:
prio:用来指示借用带宽优先级,值越小优先越高
创建分类1:1,其父分类为1:,rate 20mbit"表示系统将为该类别确保带宽20mbit,"ceil 20mbit"
表示该类别的最高可占用带宽为40mbit
tc class add dev eth0 parent 1: classid 1:1 htb rate 20mbit ceil 20mbit
第三步创建过滤器:
父分类编号为1:;过滤协议为ip,优先级别为16,过滤器为基于$ip。
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst $ip flowid 1:1
#环境还原:
清除 eth0 所有队列规则
tc qdisc del dev eth0 root
#qdisc 查看队列规则使用类型以及设置参数
sudo tc -s -d qdisc show dev eth0
#详细显示指定设备(这里为eth0)的分类状况
sudo tc -s -d class show dev eth0
显示过滤器的状况
tc -s filter ls dev eth0
详细显示指定设备(这里为eth0)的分类状况
tc -s class ls dev eth0
简单显示指定设备(这里为eth0)的队列状况
tc qdisc ls dev eth0
>>>>>>>语法例:
tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]
tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id
tc [-s | -d ] qdisc show [ dev DEV ]
tc [-s | -d ] class show dev DEV tc filter show dev DEV
4.单位
tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。
##4.1 带宽或者流速单位:
kbps 千字节/秒
mbps 兆字节/秒
kbit KBits/秒
mbit MBits/秒
bps或者一个无单位数字 字节数/秒
## 4.2数据的数量单位:
kb或者k 千字节
mb或者m 兆字节
mbit 兆bit
kbit 千bit
b或者一个无单位数字 字节数
## 4.3时间的计量单位:
s、sec或者secs 秒
ms、msec或者msecs 分钟
us、usec、usecs或者一个无单位数字 微秒
4.单位
tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。
##4.1 带宽或者流速单位:
kbps 千字节/秒
mbps 兆字节/秒
kbit KBits/秒
mbit MBits/秒
bps或者一个无单位数字 字节数/秒
## 4.2数据的数量单位:
kb或者k 千字节
mb或者m 兆字节
mbit 兆bit
kbit 千bit
b或者一个无单位数字 字节数
## 4.3时间的计量单位:
s、sec或者secs 秒
ms、msec或者msecs 分钟
us、usec、usecs或者一个无单位数字 微秒
技术群: