3.针对IP地址的限速配置
1.队列控制的分类算法 PRIO介绍
队列控制的分类算法PRIO
PRIO分类优先算法(从左至右优先发包),队列规定并不进行整形,仅仅根据你配置的过滤器把流量进一步细分。
我么可以理解为PRIO队列规定是pfifo_fast的一种衍生物,区别在每个频道都是一个单独的类,而非简单的FIFO。
当数据包进入PRIO队列规则后,将根据你给定的过滤器设置选择一个类。缺省情况下有三个类,这些类仅包含纯FIFO队列规定而没有更多的内部结构。你可以把它们替换成自己需要的任何队列规则。
每当有一个数据包需要出队时,首先处理:1类。只有当标号更小的类中没有需要处理的包时,才会标号大的类。
PRIO配置范例:大批量数据使用30:交互数据使用20:或10:
使用TC进行Linux流量控制主要分为创建队列、创建分类和创建过滤器,最后还可以通过过滤器相配合建立特定的路由表。
创建队列:一般情况下,针对一个网卡只需建立一个队列。
创建分类:一般情况下,针对一个队列需建立一个根分类,然后再在其上建立子分类。对于分类,按其分类的编号顺序起作用,编号小的优先;一旦符合某个分类匹配规则,通过该分类发送数据包,则其后的分类不再起作用。
PRIO配置使用举例:
针对指定的目的IP配置规则进行延迟网卡报文发送:
tc qdisc del dev ens160 root #删除限制规则
tc qdisc add dev ens160 root handle 1: prio bands 4 #创建队列(针对网络物理设备绑定一个队列 handle 1:)
tc qdisc add dev ens160 parent 1:4 handle 40: netem delay 2s #创建分类(在队列上建立分类)
tc filter add dev ens160 protocol ip parent 1:0 u32 match ip dst 192.168.1.210/32 flowid 1:4 #创建过滤器(为每一分类建立一个基于路由的过滤器filter,效果为:本机192.168.1.100发送给目的192.168.1.210的IP报文将被延迟发送)
#路由我这里不使用,就不创建路由了
说明:
"handle 1:" 为规则算法编号
"bands" 为创建频道的数目。每个频道实际上就是一个类,跟priomap参数配合使用。
注意:频道是类,缺省情况下命名为主标号":1"到主标号":3"。如果你的PRIO队列规则是"12:",把数据包过滤到"12:1"将得到最高优先级。0频道的次标号是1,1频道的次标号是2,以此类推。
priomap 给TC提供过滤器,如不提供PRIO队列规则将参考TC_PRIO的优先级来决定如何给数据包入队。
max=10
for((i=1;i<=$max;i++))
do
echo "=== $i/$max"
sleep 1
done
tc qdisc delete dev $interface root
echo "tc deleted!"
3.针对IP地址的限速配置:
#删除限制规则
tc qdisc del dev ens160 root
#创建队列(针对网络物理设备绑定一个队列 handle 1:),添加一个HTB(Hierarchy Token Bucket)类型的控制规则、并为根类别设置一个 80mbit/s(即:10MB/s)的下载速度限制
tc qdisc add dev ens160 root handle 1: htb default 10
tc class add dev ens160 parent 1: classid 1:1 htb rate 80mbit ceil 80mbit
## 将流量限制应用到特定的类别,这里是下行链接(ingress)
#tc filter add dev ens160 parent 1: protocol ip prio 1 u32 match ip sport 0 0xFFFF flowid 1:1
# 如果要针对指定的目的IP进行限速的话(针对目的IP 192.168.1.34/32 限速)
tc filter add dev ens160 parent 1: protocol ip prio 1 u32 match ip dst 192.168.1.34/32 flowid 1:1