流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系, 每当内核需要将报文分组从网卡发送出去, 都会首先将该报文分组添加到该网卡所配置的队列中, 由该队列决定报文分组的发送顺序。因此可以说,所有的流量控制都发生在队列中.
在Linux中,流量控制都是通过TC这个工具来完成的。通常, 要对网卡进行流量控制的配置,需要进行如下的步骤:
- 为网卡配置一个队列;
- 在该队列上建立分类;
- 根据需要建立子队列和子分类;
- 为每个分类建立过滤器。
Linux TC中的队列有CBQ、HTB等,CBQ 比较复杂,不容易理解。HTB(HierarchicaIToken Bucket)是一个可分类的队列, 与其他复杂的队列类型相比,HTB具有功能强大、配置简单及容易上手等优点。
一、创建队列
1 | tc qdisc add dev eth0 root handle 1: htb default 11 |
二、创建分类
1 | tc class add dev eth0 parent 1: classid 1:1 htb rate 40mbit ceil 40mbit |
三、设置过滤器
1 | tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11 |
四、配合iptables
TC作用:建立数据通道, 建立的通道有数据包管理方式, 通道的优先级, 通道的速率(这就是限速)
iptables作用:决定哪个ip 或者 mac 或者某个应用, 走哪个通道.
五、示例
限制网卡eth0 10Mbps1
2tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb lat 400.0ms
tc -s qdisc ls dev eth0