TC(linux下流量控制工具)详细说明及应用实例 联系客服

发布时间 : 星期二 文章TC(linux下流量控制工具)详细说明及应用实例更新完毕开始阅读f02078db50e2524de5187e45

1) 发往主机192.168.1.24的数据包通过分类2转发(分类2的速率8Mbit) ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2 ·2) 发往主机192.168.1.30的数据包通过分类3转发(分类3的速率1Mbit) ·ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3 3)发往子网192.168.1.0/24的数据包通过分类4转发(分类4的速率1Mbit) ·ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4 注:一般对于流量控制器所直接连接的网段建议使用IP主机地址流量控制限制,不要使用子网流量控制限制。如一定需要对直连子网使用子网流量控制限制,则在建立该子网的路由映射前,需将原先由系统建立的路由删除,才可完成相应步骤。

5.2.5. 监视

主要包括对现有队列、分类、过滤器和路由的状况进行监视。 1)显示队列的状况

简单显示指定设备(这里为eth0)的队列状况

·tc qdisc ls dev eth0

qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit 详细显示指定设备(这里为eth0)的队列状况

·tc -s qdisc ls dev eth0

qdisc cbq 1: rate 10Mbit (bounded,isolated) prio no-transmit Sent 7646731 bytes 13232 pkts (dropped 0, overlimits 0) borrowed 0 overactions 0 avgidle 31 undertime 0 这里主要显示了通过该队列发送了13232个数据包,数据流量为7646731个字节,丢弃的包数目为0,超过速率限制的包数目为0。 2)显示分类的状况

简单显示指定设备(这里为eth0)的分类状况

·tc class ls dev eth0

class cbq 1: root rate 10Mbit (bounded,isolated) prio no-transmit class cbq 1:1 parent 1: rate 10Mbit prio no-transmit #no-transmit表示优先级为8 class class cbq cbq 1:2 1:3 parent parent 1:1 1:1 rate rate 8Mbit 1Mbit prio prio 2 1 class cbq 1:4 parent 1:1 rate 1Mbit prio 6 详细显示指定设备(这里为eth0)的分类状况 ·tc -s class ls dev eth0

class cbq 1: root rate Sent 17725304 bytes borrowed class Sent class Sent class Sent borrowed class borrowed 0 0 cbq cbq 0 1:1 16163 cbq 628829 0 cbq 10Mbit 32088 1: 0 1:1 pkts 0 pkts 0 parent 1:1 avgidle 1:1 (bounded,isolated) pkts 0 pkts rate (dropped avgidle 31 0, 8Mbit 0, 4137 0, 159654 rate 0, 10Mbit (dropped avgidle rate (dropped avgidle rate (dropped 587 prio 0, no-transmit 0) 0 0) 0 2 0) 0 1 0) 0 6 0) overlimits undertime overactions parent bytes 1:2 bytes 1:3 28884 parent 3130 parent 0 prio no-transmit 16627774 overlimits undertime prio overlimits undertime prio overlimits undertime prio overlimits borrowed overactions overactions bytes 1:4 1Mbit overactions 1Mbit Sent 5552879 bytes 8076 pkts (dropped borrowed 3797 overactions 0 avgidle 159557 undertime 0 这里主要显示了通过不同分类发送的数据包,数据流量,丢弃的包数目,超过速率限制的包数目等等。其中根分类(class cbq 1:0)的状况应与队列的状况类似。

例如,分类class cbq 1:4发送了8076个数据包,数据流量为5552879个字节,丢弃的包数目为0,超过速率限制的包数目为0。 显示过滤器的状况

·tc -s filter ls dev eth0

filter parent 1: protocol ip pref 100 route filter parent 1: protocol ip pref 100 route fh 0xffff0002 flowid 1:2 to 2 filter parent 1: protocol ip pref 100 route fh 0xffff0003 flowid 1:3 to 3 filter parent 1: protocol ip pref 100 route fh 0xffff0004 flowid 1:4 to 4 这里flowid 1:2代表分类class cbq 1:2,to 2代表通过路由2发送。 显示现有路由的状况

·ip route

192.168.1.66 192.168.1.24 202.102.24.216 192.168.1.30 192.168.1.0/24 192.168.1.0/24 172.16.1.0/24 127.0.0.0/8 default via dev dev via dev ppp0 via eth0 via via proto eth0 192.168.1.66 kernel 192.168.1.66 192.168.1.66 proto dev kernel 192.168.1.66 dev scope dev dev scope dev lo 202.102.24.216 scope eth0 link src eth0 eth0 link eth0 scope dev src realm realm realm scope link 2 3 4 link link ppp0 202.102.76.5 192.168.1.66 default via 192.168.1.254 dev eth0 如上所示,结尾包含有realm的显示行是起作用的路由过滤器。 5.2.6. 维护

主要包括对队列、分类、过滤器和路由的增添、修改和删除。

增添动作一般依照\队列->分类->过滤器->路由\的顺序进行;修改动作则没有什么要求;删除则依照\路由->过滤器->分类->队列\的顺序进行。

1)队列的维护

一般对于一台流量控制器来说,出厂时针对每个以太网卡均已配置好一个队列了,通常情况下对队列无需进行增添、修改和删除动作了。 2)分类的维护

增添,增添动作通过tc class add命令实现,如前面所示。 修改,修改动作通过tc class change命令实现,如下所示:

·tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 7Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 700Kbit split 1:0 bounded 对于bounded命令应慎用,一旦添加后就进行修改,只可通过删除后再添加来实现。

删除,删除动作只在该分类没有工作前才可进行,一旦通过该分类发送过数据,则无法删除它了。因此,需要通过shell文件方式来修改,通过重新启动来完成删除动作。 3)过滤器的维护

增添,增添动作通过tc filter add命令实现,如前面所示。 修改,修改动作通过tc filter change命令实现,如下所示:

·tc filter change dev eth0 parent 1:0 protocol ip prio 100 route to 10 flowid 1:8 删除,删除动作通过tc filter del命令实现,如下所示:

·tc filter del dev eth0 parent 1:0 protocol ip prio 100 route to 10 4)与过滤器一一映射路由的维护

增添,增添动作通过ip route add命令实现,如前面所示。 修改,修改动作通过ip route change命令实现,如下所示:

·ip route change 192.168.1.30 dev eth0 via 192.168.1.66 realm 8 删除,删除动作通过ip route del命令实现,如下所示:

·ip route del 192.168.1.30 dev eth0 via 192.168.1.66 realm 8 ·ip route del 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4

六、dms小组应用场景一个实例

说明:

tc qdisc add dev eth1 root handle 1: prio用以建立一个root(注,这里的root不是指linux下root用户,仅仅单纯指“根”这一概念)优先级队列,句柄为1(对于tc队列的构成及原理请详见参考资料[1],上面讲得非常透彻),此队列所作用的网卡接口为eth1

tc qdisc add dev eth1 parent 1:1 handle 10: netem delay `expr $randdelay`ms distribution normal loss $randloss% 用以在根队列下建立一个子队列,子队列的句柄为10(当然也可以指定为其他,一般为了方便查看,根队列为1位数,子队列为两位??),这个子队列的作用是调用netem模块让通过的网络流量

前面的内容大多是查找的一些资料,下面将介绍一下dms曾经用到的一个脚本实例,脚本如下:

#!/usr/bin/env bash #脚本功能:对目的端口为“32123”的数据包进行随机延迟和丢包(注:tc默认只对出流量有效) randloss=`expr $RANDOM % 30` randdelay=`expr $RANDOM % 20` tc qdisc add dev eth1 root handle 1: prio tc qdisc add dev eth1 parent 1:1 handle 10: netem delay `expr $randdelay`ms distribution normal loss $randloss% tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 32123 0xffff flowid 1:1

延迟,并按一定的丢包率丢包。(注:netem是linux中的另一个模块,并不是内嵌于tc工具中,tc仅仅是调用这模块,所以man tc是看不到相关于netem的信息的,关于netem的使用,详见参考资料[5])

需要再说明一点是,为什么这里要建一个子队列。可以看到,我们的目标是针对相关的端口进行流量控制,但子队列现在的功能是对所有的流量都起作用,因此,需要挂载一个过滤器(filter),对流量进行一个过滤,但在tc中,filter是不能直接挂在根队列上的。

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 32123 0xffff flowid 1:1在子队列上挂载一个filter,所有通过子队列1:1的流量,都会被过滤,只有满足filter条件的流量才会从该子队列中通过,这个条件为“目的地址为32123,IP地址无限制”(注,tc默认只对出流量有效,因此在构建规则时要仔细考虑进这个因素)。

如果不想tc中应用的规则再起作用,执行下以脚本删除它:

参考资料

[1]高旸、聂永峰,一种基于Linux TC的流量控制管理架构,计算机工程与设计,2006.10 [2]网络文章,tc,学习

http://blog.csdn.net/tqyou85/archive/2008/11/06/3226773.aspx [3] Linux下TC使用说明,百度文库 [4]网络文章,linux tc实现ip流量限制,

http://blog.csdn.net/wind0513/archive/2010/03/02/5339127.aspx [5]官方说明,netem

netem The Linux Foundation.mht tc qdisc del dev eth1 root