本文转自:http://www.hackbase.com/tech/2011-08-05/64822.html

注:每个接口每个方向只支持一个策略;一个策略可以用于多个接口。因此端口下的网段的下载速率的限制都应该定义在同一个策略
  1.在交换机上启动QOS
  Switch(config)#mls qos    //在交换机上启动QOS
  2. 定义访问控制列表
  Switch(config)#access-list 10 permit 59.215.45.0 0.0.0.127
  控制这个端口下59.215.45.0网段的上传流量
  Switch(config)#access-list 100 permit any 59.215.45.0 0.0.0.127
  控制这个端口下59.215.45.0网段的下载流量
  3.定义类,并和上面定义的访问控制列表绑定
  Switch(config)# class-map rate-limit-uplink         /定义上行的类。并绑定访问列表10
  Switch(config-cmap)# match access-group 10
  Switch(config-cmap)# exit
  Switch(config)# class-map rate-limit-downlink      /定义下行的类。并绑定访问列表100
  Switch(config-cmap)# match access-group 100
  Switch(config-cmap)# exit
  4.定义策略,把定义的类绑定到该策略
  Switch(config)# policy-map rate-limit-uplink        //定义上行的速率为30M
  Switch(config-pmap)# class rate-limit-uplink
  Switch(config-pmap-c)# trust dscp
  Switch(config-pmap-c)# police 30000000 1000000 exceed-action drop //这里30M不能写成30720000
  否则会报以下错误:%Error: policer rate should be multiples of 1000000.
  Please choose either 3000000 or 4000000 (bits per second) as the policer rate
  关于100000那个数字的定义,后面做个实验跟大家解释
  Switch(config)# policy-map rate-limit-downlink     //定义下行的速率为30M
  Switch(config-pmap)# class rate-limit-downlink
  Switch(config-pmap-c)# trust dscp
  Switch(config-pmap-c)# police 30000000 1000000  exceed-action drop
  Switch(config-pmap-c)# exit
  5.在接口上应用
  Switch(config)# interface f0/1 (下联口)
  Switch(config-if)# service-policy input rate-limit-uplink
  interface: 用户希望进行流量控制的端口,可以是Ethernet也可以是serial口,但是不同类型的interface在下面的input output上选择有所不同,需要注意一下
  input|output:这是定义数据流量的方向
  Switch(config)# interface g0/20(上联口)
  Switch(config-if)# service-policy input rate-limit-downlink
  注释:
  police  bps | burst-normal burst-max |conform-action action |exceed-action action
  Bps:用户希望该流量的速率上限,单位是bps
  Burst-normal burst-max:这个是指token bucket的大小,一般采用8000,16000,32000  这些值,视乎bps值的大小而定。
  Conform-action :在速率限制以下的流量的处理策略。
  Exceed-action:超过速率限制的流量的处理策略。
  Action:处理策略,包括以下几种:
  Transmit:传输
  Drop:丢弃
  Burst-normal burst-max 这个值最值得我们讨论,这个相当于token bucket的大小,那么就要了解token bucket的原理,网络上抄写一段
  Token Bucket令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发
  送到网络上的数据的数目,并允许突发数据的发送。
  令牌桶这种控制机制基于令牌桶中是否存在令牌来指示什么时候可以发送流量。令牌桶中的每一个令牌都代表一个字节。如果令牌桶中存在令牌,则允许发
  送流量;而如果令牌桶中不存在令牌,则不允许发送流量。因此,如果突发门限被合理地配置并且令牌桶中有足够的令牌,那么流量就可以以峰值速率发送
  token bucket – 算法步骤
  假如用户配置的
  token bucket
  平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中; 假设桶最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃; 当一个
  n个字节的数据包到达时,就从令牌桶中删除n个令牌,并且数据包被发送到网络; 如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在
  流量限制之外;
  算法允许最长b个字节的突发,但从长期运行结果看,数据包的速率被限制成常量r。对于在流量限制外的数据包可以以不同的方式处理:它们可以被丢弃;
  它们可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输;
  它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。
  token bucket – 特别提示
  令牌桶算法不能与另外一种常见算法“漏桶算法(Leaky Bucket)”相混淆。
  token bucket
  这两种算法的主要区别在于“漏桶算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输数据外,还允许某种程度的突发传输在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。
  大家理解上面原理,接着根据以下命令做个实验,结果如下,注意的是。下面一些值。只是通过上传单个文件所得出来参考值
  police 30000000 10000  exceed-action drop
  上传速度为65k左右*8
  police 30000000 100000  exceed-action drop
  上传速度为400k左右*8
  police 30000000 1000000  exceed-action drop
  上传速度为2.96M左右*8
  30000000/1024=29.2M

以下是两个端口限制上传30M后所显示流量图: