TC 是linux自带的模块,可以用来控制网速。

常用命令格式


tc [qdisc/class/filter] [add/del/replace] dev 网卡名字  其他参数


tc限速主要是将数据包发送到不同类型的队列中,然后由队列控制发送。限速队列主要由两种:一种是无类队列,其中包括pfifo_fast(先进先出) 、TBF ( 令牌桶过滤器) 、SFQ(随机公平队列) 、ID (前 向随机丢包)等等。另外一种是分类队列,其中由引出了class(类),filter(过滤器)的概念。

    qdisc,class,filter三者直接关系如下:

    每创建一个class,都会有一个默认的qdisc,该qdisc挂在class作为子节点上。filter挂在队列上,主要决定让数据包向子节点类传递。


假设有如下需求:

WEB 服务器的流量控制为 5Mbps,SMTP 流量控制在 3Mbps 上 . 而且二者一共不得超过 6Mbps, 互相之间允许借用带宽


 #tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8 
  #tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight  
    0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded 
    这部分按惯例设置了根为 1:0, 并且绑定了类 1:1. 也就是说整个带宽不能超过 6Mbps. 
  #tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight 
    0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 
  #tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight 
    0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 
    建立了 2 个类 . 注意我们如何根据带宽来调整 weight 参数的 . 两个类都没有配置成"bounded", 但它们都连
  接到了类 1:1 上 , 而 1:1 设置了"bounded". 所以两个类的总带宽不会超过 6Mbps. 别忘了 , 同一个 CBQ 下面的子
  类的主号码都必须与 CBQ 自己的号码相一致 ! 
  #tc qdisc add dev eth0 parent 1:3 handle 30: sfq 
  #tc qdisc add dev eth0 parent 1:4 handle 40: sfq 
    缺省情况下 , 两个类都有一个 FIFO 队列规定 . 但是我们把它换成 SFQ 队列 , 以保证每个数据流都公平对待 . 
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 
    1:3 
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid 
    1:4