CBWFQ (Class-based weighted fair queueing)是思科公司在IOS中的一种新的队列技术

CBWFQ (Class-based weighted fair queueing)是思科公司在IOS中的一种新的队列技术,它是WFQ队列技术的拓展。使用CBWFQ技术,可以将数据流根据各种条件分类,同类的数据占用一个队列。当数据被分类完毕后,可以为该类数据定制传输特性,如带宽、传输的权级(weight)、传输限制等。为一个队列指定的带宽通常是指在带宽拥塞时为该队列所保证的带宽。

在分类数据时,需要指明每个队列的长度,即该队列所能存放的数据包的量。如果数据包超出队列的容量,会发生丢包的现象,通常是队列尾部的数据包被丢弃。

配置队列时,可以配置一个默认队列,所有没有具体分类的数据都会被放到默认队列中。默认队列的数据处理可以通过用户配置去定义。如果没有定义默认队列,那么那些没有匹配到任意类的数据会根据数据流(flow)区分并用best-effort方式处理。
数据流(flow)的区分是根据数据包的IP源地址,IP目的地址;源端口号,目的端口号等参数将数据分成不同的组,对同组数据采用同样的处理方式。在将 数据按flow分类后,路由器会保证flow们公平地共享路由器的带宽,这就是思科路由器上WFQ (Weight Fair Queue)处理数据的基本原理。

CBWFQ对WFQ作了一些改进,在WFQ中,weight是用来指明队列的权级的,而在 CBWFQ中,weight是用来指明每个数据包的权级的。数据包到达出口时,根据事先定义好的标准被分成不同的类别,每个包都会有自己的weight。 数据包的weight被指定了以后,数据包会排在相应的类的队列中,CBWFQ通过使用weight来保证数据包的公正处理。

CBWFQ可以为某类流量指定相应的带宽。根据接口的带宽,可以配置多达64类数据,并指定相应的处理方式。这是传统的基于数据流的WFQ所做不到的。也是CBWFQ与WFQ的区别之所在。
CBWFQ在分类定义数据流时,不仅仅可以通过IP地址和端口号;还可以通过扩展访问控制列表(EACL)或数据输入接口(input interface)。这也是WFQ所做不到的。

在采用CBWFQ时,我们通常需要三个步骤:
1 定义数据的分类策略,在这里是通过class map来做分类数据的定义
2 为每类数据定义其处理的策略,通过policy map来定义
3 将所定义的策略应用到接口上。

我们看一个配置的例子:
首先是分类数据:
Router(config)# access-list 101 permit udp host 10.10.10.10 host 10.10.10.20 range
16384 20000
Router(config)# access-list 102 permit udp host 10.10.10.10 host 10.10.10.20 range
53000 56000

Router(config)# class-map class1
Router(config-cmap)# match access-group 101
Router(config-cmap)# exit

Router(config-cmap)# class-map class2
Router(config-cmap)# match access-group 102
Router(config-cmap)# exit
在这里,定义了两类数据,第1类数据用扩展访问控制列表101匹配数据;第2类数据用扩展访问控制列表102匹配数据。

其次是为每类数据定义处理的策略:
Router(config)# policy-map policy1

Router(config-pmap)# class class1
Router(config-pmap-c)# bandwidth 3000
Router(config-pmap-c)# queue-limit 30
Router(config-pmap-c)# exit

Router(config-pmap)# class class2
Router(config-pmap-c)# bandwidth 2000
Router(config-pmap-c)# exit
在这里,为第1类数据指定所保证的带宽是3000Kbps,队列的长度是30个包;为第2类数据指定所保证的带宽是2000Kbps,队列长度使用默认的64个包。

最后,需要把刚才定义的策略应用到具体的出口(output interface)上:
Router(config)# interface e1/1
Router(config-if)# service output policy1
Router(config-if)# exit