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自带的一些过滤器