Traffic Controll

来源:互联网 发布:搜狗关键词优化公司 编辑:程序博客网 时间:2024/06/04 18:35
TC--Traffic Control
 

    TC是linux中的流量控制模块,利用队列规定建立起数据包队列,并定义了队列中数据包的发送方式,从而实现对流量的控制。

    TC在流量控制中使用的队列分为两类:1 无类队列  2 有类队列。无类队列比较简单,分类队列则有分类和过滤器等概念,比较复杂。

    无类队列对进入网卡的数据流统一对待,不进行区分,无类队列形成的队列能够接受数据包以及重新编排、延迟、丢包,它可以对网卡流量进行整形,但是不能细分各种情况,无类队列规定主要有pfifo_fast、tbf、sfq等,无类队列的流量整形手段主要是排序、限速、丢包。

    有类队列规定则是对进入网卡的数据包根据不同的需求以分类的方式区分对待的分类规定,数据包进入分类队列后,通过过滤器对数据包进行分类,过滤器返回一个决定,队列就根据这个返回的决定把数据包发送到相应的某一类队列中进行排队。每个子类可以再次使用他们的过滤器进行进一步的分类,直到不需要分类为止,数据包才会进入相关类的队列中进行排队。
 
 
TC流量控制方式
 
SHAPING 限制--流量被限制时,它的传输速率就被控制在某个值以下,限制阈值可以大大的小于有效带宽,这样可以平滑网络的突发流量,是网络更稳定,shaping适用于限制外出的流量。
 
SCHEDULING 调度--通过调度数据包的传输,可以在带宽范围内按照优先级分配,也只适用于限制外出流量。
 
POLICING 策略--用于处理接收到的数据
 
DROPPING 丢弃--如果流量超过设置的带宽就丢弃数据包,向内向外皆管用。
 
 
TC流量控制处理对象
 
流量的处理由三种对象控制,分别是:qdisc-排队规则、class-类别、filter-过滤器。
 
QDISC
 
    qdisc是流量控制的基础,无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照该接口配置的qdisc把数据包加入队列中。内核会尽可能多的从qdisc中取出数据包,然后交给网络适配器进行处理。而qdisc又分为CLASSLESS QDisc--不可分类队列规则、CLASSFUL QDISC--分类队列规则。
 
CLASSLESS QDisc--不可分类队列规则
 
无类qdisc包括以下队列:
[p|b]fifo  最简单的qdsic,先进先出策略,只有一个limit参数用来设置队列长度,pfifo是以数据包个数为单位,bfifo是以字节数为单位。pfifo_fast包含三个波段,band0~band2,每个波段也使用先进先出策略,band0优先级最高,band2最低,如果band0中有数据包,系统就不会去处理band1的数据包,直到band0的数据包处理完。同理band1和band2。
 
red  是Random Early Detection的简写--随机早起检测。当带宽的占用接近指定带宽时随机的丢弃一些数据包。
 
sfq  是Stochastic Fairness Queueing的简写--随机公平队列,它会按照会话为流量进行排序,一般对应于每个tcp或者udp数据流,然后循环发送每个会话的数据包。
 
tbf  是Token Bucket Filter的简写--xx 适合把速率降到某个值。
 
如果没有设置可分类队列规则,则无分类队列规则只能属于设备的根。如下设置:tc qdisc add dev DEV root QDISC QDISC-PARAMETERS,如果一个接口没有设置qdisc,则pfifo_fast是默认的缺省qdisc。
 
 
CLASSFUL QDISC--分类队列规则
 
分类队列规则包括以下队列:
CBQ  是Class Based Queueing的简写,它实现了一个丰富的连接共享类别结构,既有限制带宽能力又有带宽优先级管理能力。带宽限制是通过计算连接的空闲时间完成的,空闲时间的计算标准是数据包离队事件的频率和下层连接的带宽。
 
HTB  是 Hierarchy Token Bucket的简写,它实现了一个丰富的连接共享类别结构,使用HTB可以很容易的保证每个类的带宽,同时也允许特定类可以突破上限,占用其他类等宽等。HTB通过TFB实现带宽限制,也可以为类划分优先级。
 
PRIO 不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO qdisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用 iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。
 
 
CLASS
 
    一些qdisc可以包含一些类,不同的类中又可以包含更深入的qdisc,通过这些细分的qdisc可以为进入队列的数据包排队,通过设置各种类数据包的离队次序,可以设置网络数据流量的优先级。例如,我们要对不同的IP实施不同的流量控制策略,这时就需要用不同的类来控制。
 
 
FILTER
 
    filter用于为数据包分类,决定数据包进入何种qdisc队列,分类的方法有多种filter是一种方法,使用filter时内核会调用属于这个类的所有过滤器,直到返回一个决定,如果么有返回决定,就做进一步处理,处理方式和qdisc有关。filter是在qdisc内部的。目前可用的过滤器有:u32、rsvp、fwmark等。
 
 
 
 
操作原理
 
    类组成一个树,每个类都只有一个父类,却可以有多个子类,某些qdisc允许在运行时动态添加类,如cbq、htb,而有些qdisc在运行时不许动态添加类,如prio。允许动态添加类的qdisc可以有多个子类,由他们为数据包排队。每个类都有一个叶子qdisc,默认这个叶子qdisc使用pfifo的队列,当然也可以用其他队列替换,而且,这个qdisc可以再次包含其他类,但是每个类只能有一个叶子qdisc。当一个数据包进入一个qdisc时,可以使用三种方式为其分类:tc filters、Type of Service、skb->priority。但是并不是所有的qdisc都可以使用这三种方式。
 
 
命名规则
 
    所有的qdiscs, classes and filters都有自己的ID,可以手动指定也可以自动获取,ID包含一个主号码和一个从号码,用冒号分开。
 
QDISC
    一个qdisc会被分配一个主号码,叫做handle,把从号码作为类的命名空间,习惯上需要为有子类的qdisc分配一个handle。一个qdisc如果是根节点,则parent的值就是root,如果qdisc下面有划分类,这时就需要指定handle,handle的值是major:minor格式的,对于root来说,格式是1:,后面不需要指定minor,要指定的话,qdisc的minor必须为0。非根的qdisc的handle的major可以自己设置,minor不用设置,非根的parent的值也是major:minor格式,值是一个已存在的类。
 
CLASS
    在同一个qdisc里面的类共享这个qdisc的主号码,每个类都有自己的从号码,叫做classid,classid只和父qdisc有关,和父class无关,parent值的格式也是major:minor的,major这个指定该类的父节点的handle的major值,父节点可以是class也可以是qdisc,如果是qdisc,则minor可以不用设置或者设置为0,如果是class,则parent的值是其父类的classid值,classid的值格式也是major:minor的,major是父qdisc的handle的major的值,minor值是自己设置。
 
FILTER
    过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。
 
 
tc命令的语法如下
 
tc  qdisc  [  add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]
 
tc  class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc  spe‐cific parameters ] 
 
tc  filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio pri‐ority filtertype [ filtertype specific parameters ] flowid flow-id 
tc  [ FORMAT ] qdisc show [ dev DEV ]
tc  [ FORMAT ] class show dev DEV
tc  filter show dev DEV
 
 
使用tc命令可以对qdisc、class、filter进行如下操作:
add  在一个节点上添加qdisc、class、filter,添加时,需要传递一个parent,传递参数时既可以用ID也可以使用设备的根,在建立qdisc和filter时,可以使用handle来命名,在建立class时可以使用classid来命名
 
remove  删除某个handle指定的qdisc,也可删除根qdisc。被删除的qdisc上的所有子类以及过滤器都会被自动删除。
 
change  以替代的方式修改某些条目,除了handle和parent不能被修改外,其余语法同add,change命令不能移除一个节点
 
replace  添加或者删除一个节点,是一个原子操作,如果节点不存在,则建立节点。
 
link  只适用于qdisc,替代一个存在的节点。
 
 
实施
主要是建立队列、分类、过滤器三步。
1 给物理设备建立一个队列qdisc
2 在相关队列上建立分类,一般是在该qdisc上建立一个根分类,然后在此根分类上建立子类。
3 为每一个分类建立基于路由的过滤器,并把过滤规则与特定的路由结合。一般只需要针对根分类提供一个过滤器,然后为每个子类提供路由映射。
 
 
关于各个策略的参数可以man  tc-cbq  tc-htb  tc-sfq  tc-red tc-tbf  tc-pfifo  tc-bfifo tc-pfifo_fast查看。
0 0