TC:用语流量控制的工具。
原则:控发包,不控收包。
队列:决定数据被发送的方式。
无类队列(对所有数据一视同仁,不加区分,适合比较低级的流量控制)
fifo_fast:传统发包方式。
TBF:令牌桶 有点像小时候我们做的一道应用题,一个池子一边放水,一般进水,当进水速度不够时,出水速度也就被限制了。
SFQ:随机公平队列 每一个会话,轮流公平发包,不至于出现某个网络进程独占网络的情况。
分类队列规定(可以对包进行分类处理,分别对待)
用一个例子说明
tc qdisc add dev $BRIDGE root handle 5:0 htb default 2 r2q 64 tc class add dev $BRIDGE parent 5:0 classid 5:1 htb rate ${DOWNLINK_SPEED}kbit ceil ${DOWNLINK_SPEED}kbit quantum 30000 tc class add dev $BRIDGE parent 5:1 classid 5:2 htb rate 1kbit ceil ${DOWNLINK_SPEED}kbit prio 256 quantum 30000 tc qdisc add dev $BRIDGE parent 5:2 handle 502: sfq perturb 10
这个一个限制最大下载速度的脚本。
首先第一行,是在“BRIDGE”这张网卡上建立一个标号(就是一个称呼,就像你名字一样,没有太多意义)5:0的HTB(可以暂时不关心)分类队列。
后三行有这样的字样
parent
5
:
0
classid
5
:
1 这是在建立子类。
他们的关系是这样,5:0-》5:1-》5:2-》502
我们又回到第一行,default 2 在这代表缺省包,直接放在标号为2的后代类中,也就是5:2这个类。
所谓缺省包,就是没有通过滤器处理的数据包。
所谓过滤器,就是按照一定规则如IP 端口等等,将数据包放在指定的类里面工具。
每一个父类都应该有一个过滤器,来确定数据被分到那一个子类
这里我们的分类队列 5:0 由于没有过滤器,缺省将所有数据包放进5:2的子类中。
rate:代表该类数据包强制的最大流量。(理解为保证的最小带宽)
ceil:当父类还用空余流量时,可以借的最大流量。(理解为限制的最大带宽)
这样就可以理解我们第三行的限速脚本了。
最后一行,是由于数据发送时,会遍历所有的子类,才能找到数据包的位置,这样在遍历的过程中,又经过了,SFQ这个无类队列,实现了SFQ的调度功能。
tc class add dev $BRIDGE parent 5:1 classid 5:$lan_pkt_mark htb rate 1kbit ceil ${bandwidth_dl}kbit prio 2 quantum 30000 tc qdisc add dev $BRIDGE parent 5:$lan_pkt_mark handle 5$lan_pkt_mark: sfq perturb 10 tc filter add dev $BRIDGE parent 5:0 protocol ip prio 100 handle $lan_pkt_mark fw classid 5:$lan_pkt_mark
最后一行是将打了lan_pkt_mark标记的数据包,放入
classid
5
:$lan_pkt_mark
子类中。
标记可以用iptables打上
,也就是说,iptables 可以代替TC自带的一些过滤器