- QoS在IOS中的实现与应用
- 张国清编著
- 3045字
- 2020-08-28 04:08:09
3.3 使用MQC分类
使用MQC对数据分类需要3个步骤,分别使用3个命令,如下所示。
(1)使用class-map命令生成数据类。
(2)使用policy-map命令标记数据(DSCP,CoS等),标记后的数据才能区分出不同的类别。
(3)把第2步设置的策略应用在入口上,使用的命令是service-policy input。当数据从接口进入时,应按照策略进行标记。
3.3.1 class-map命令
命令语法如下:
Border_A(config)# class-map [match-all | match-any] class-map-name Border_A(config-cmap)# match {match-criteria}
其中,
● class-map-name——名字。
● match-all——当设定多个match条件时,满足所有条件的数据才是匹配的。
● match-any——当设定多个match条件时,数据满足一个条件即可。
● match-criteria——设定的匹配条件。
如果在命令里既没有使用match-all,也没有使用match-any,系统默认使用的是match-all。
3.3.2 class- map示例
当设定匹配条件时,可以使用以下参数。
(1)ACL(名称或代码)。
Border_A (config-cmap)# match access-group access-group
access-group——访问列表名称或代码。
例3-10:把两个ACL(subnet-a和subnet-b)定义的数据划归为一类。
Router1(config)# ip access-list extended subnet-a Router1(config-std-nacl)# permit ip 192.168.200.0 0.0.0.255 any Router1(config-std-nacl)# end Router1(config)# ip access-list extended subnet-b Router1(config-std-nacl)# permit ip 192.168.300.0 0.0.0.255 any Router1(config)# class-map match-any class1 Router1(config-cmap)# match access-group subnet-a Router1(config-cmap)# match access-group subnet-b Router1(config-cmap)# exit
(2)任意数据。
Border_A (config-cmap)# match any
(3)调用其他class-map,即calss-map嵌套。
Border_A( config-cmap)# match class-map class-name
class-name——其他class-map的名字。
例3-11:class2调用class1。
Router1(config)# class-map match-any class2 Router1(config-cmap)# match class-map class1 Router1(config-cmap)# exit
(4)CoS值。
Border_A (config-cmap)# match cos cos-value1[cos-value2 [cos-value3 [cos-value4]]]
cos-value——CoS值,最多4个。在同一个match语句里的多个值,匹配一个值即满足条件。
例3-12:把CoS=2和CoS=3的数据划归一类。
Router1(config)# class-map match-all class3 Router1(config-cmap)# match cos 2 3 Router1(config-cmap)# exit
(5)目的MAC地址。
Border_A (config-cmap)# match destination-address mac address
address——目的MAC地址(十六进制)。
例3-13:
Router1(config)# class-map match-any class4 Router1(config-cmap)# match destination-address mac 00:01:0c:00:12:34 Router1(config-cmap)# exit
(6)数据进入的接口。
Border_A (config-cmap)# match input-interface interface-name
interface-name——入口编号。
(7)DSCP值。
Border_A (config-cmap)# match dscp dscp-value
dscp-value——DSCP值,最多7个。在同一个match语句里的多个值,匹配一个值即为满足条件。既可以匹配IPv4数据包,也可以匹配IPv6数据包。
例3-14:把DSCP=2,DSCP=3,DSCP=30,AF=11的数据划归一类。
Router1(config)# class-map match-all class5 Router1(config-cmap)# match dscp 2 3 30 af11 Router1(config-cmap)# exit
(8)IP优先级。
Border_A (config-cmap)# match precedence ip-precedence-value
ip-precedence-value——IP优先级值,最多4个值。在同一个match语句里的多个值,匹配一个值即满足条件。既可以匹配IPv4数据包,也可以匹配IPv6数据包。
(9)实时传输协议端口。
Border_A (config-cmap)# match ip rtp starting-port-number port-range
starting-port-number——起始端口号。
port-range——端口号范围,自起始端口号之后的端口号范围。
例3-15:匹配自端口号2024及其后100个端口号(2024~2124)。
Router1(config)# class-map match-all class6 Router1(config-cmap)# match ip rtp 2024100 Router1(config-cmap)# exit
(10)MPLS标签。
Border_A (config-cmap)# match mpls experimental topmost exp-values
exp-values——MPLS实验字段标记值。
(11)反向选择条件。
Border_A (config-cmap)# match not match-criteria
match-criteria——不是该条件的其他情况都匹配。
例3-16:把不是RTP协议的数据归类。
Router1(config)# class-map match-all class7 Router1(config-cmap)# match not rtp Router1(config-cmap)# exit
(12)协议。
Border_A (config-cmap)# match protocol protocol-name
protocol-name——协议名称。
(13)源MAC地址。
Border_A (config-cmap)# match source-address mac address
address——源MAC地址(十六进制)。
(14)RTP(使用NBAR分类时使用的命令)。
Border_A (config-cmap)# match protocol RTP [ audio | video | payload-type payload-type-code ]
audio——音频数据。
video——视频数据。
payload-type-code——数据类型代码。0~23保留给音频数据,24~33保留给视频数据,34~64用户可以自定义。使用代码比仅使用“audio”或“video”关键词产生的匹配更严格。多个类型代码之间使用逗号分隔,也可以使用连线符表示代码区间。代码的表达形式可以是十进制、十六进制和二进制。
例3-17:匹配数据类型代码为2,4,6,7~16的音频数据。
Router1(config)# class-map class8 Router1(config-cmap)# match protocol rtp palyload-type 2,4,6,0x7-0x10 Router1(config-cmap)# exit
提示:根据IOS版本和设备平台的不同,支持的匹配条件会有所不同。这里并没有列出所有可用的匹配条件。读者在使用的时候请注意查阅产品文档和IOS版本。
3.3.3 policy-map命令
使用policy-map命令可对已经使用class-map命令分类的数据进行标记。
语法如下:
Border_A (config)# policy-map policy-name Border_A (config-pmap)# class {class-default | class-name } Border_A (config-pmap-c)# set tag
policy-name——自定义的名称。
class-name——使用class-map命令生成的数据类的名称。
class-default——默认的数据类。系统把不属于任何分类的数据自动归为默认类。默认数据类不需要事先定义,直接调用即可。默认类数据的CoS=0,DSCP=0。
tag——为数据设置的标记值。
标记值可以是以下几种。
(1)CoS值。
Border_A (config-pmap-c)# set cos cos-value
cos-value——CoS值,取值范围为0~7。
(2)DSCP值。
Border_A (config-pmap-c)# set ip dscp ip-dscp-value
ip-dscp-value——DSCP值,取值范围为0~63。
(3)IP优先级值。
Border_A (config-pmap-c)# set ip precedence ip-precedence-value
ip-precedence-value——IP优先级值,取值范围为0~7。
(4)MPLS实验字段值。
Border_A (config-pmap-c)# set mpls experimental value
value——实验字段值,取值范围为0~7。
(5)QoS组。
Border_A (config-pmap-c)# set qos-group qos-group-value
qos-group-value——用户自定义的组ID号,范围为0~99。该命令的作用是把满足某条件的数据人为地划分到一个组里,以便在其他设备上识别。
(6)信任数据携带的标记值。
Border_A (config-pmap-c)# trust {cos | dscp | ip-precedence}
提示:根据IOS版本和设备平台的不同,可被支持的命令有所不同。这里并没有列出所有的用法,请读者在使用的时候查阅产品文档和IOS版本。
3.3.4 policy-map示例
例3-18:对class1的数据标记DSCP=AF21。
Router1(config)#ip access-list extended subnet-a Router1(config-std-nacl)#permit ip 192.168.200.0 0.0.0.255 any Router1(config-std-nacl)#end Router1(config)#ip access-list extended subnet-b Router1(config-std-nacl)#permit ip 192.168.300.0 0.0.0.255 any Router1(config)# class-map match-any class1 Router1(config-cmap)# match access-group subnet-a Router1(config-cmap)# match access-group subnet-b Router1(config-cmap)# exit Router1(config)# policy-map policy-map-1 Router1(config-pmap)# class class1 Router1(config-pmap-c)# set dscp af21 Router1(config-pmap-c)# end
注意:虽然没有调用class-default,系统仍然把非class1的数据放置在class-default里,并设置DSCP=0(默认值)。
例3-19:设置音/视频数据的CoS=5,其他数据的CoS=1。
switch(config)# class-map match-all class6 switch(config-cmap)# match ip rtp 2024100 switch(config-cmap)# exit switch (config)# policy-map policy-map-2 switch (config-pmap)# class class6 switch (config-pmap-c)# set cos 5 switch (config-pmap-c)# exit switch (config-pmap)# class class-default switch (config-pmap-c)# set cos 1 switch (config-pmap-c)# end
例3-20:设置class3 数据的DSCP=af11,class4 数据的DSCP=af21,class5 数据的DSCP=af31,不属于上述三个类别的数据的DSCP=af13。
switch (config)# class-map match-all class3 switch (config-cmap)# match cos 2 3 switch (config-cmap)# exit switch (config)# class-map match-any class4 switch (config-cmap)# match destination-address mac 00:01:0c:00:12:34 switch (config-cmap)# exit switch (config)# class-map match-any class5 switch (config-cmap)# match input-interface f0/10 switch (config-cmap)# exit switch (config)# policy-map policy-map-3 switch (config-pmap)# class class3 switch (config-pmap-c)# set dscp AF11 switch (config-pmap-c)# exit switch (config-pmap)# class class4 switch (config-pmap-c)# set dscp AF21 switch (config-pmap-c)# exit switch (config-pmap)# class class5 switch (config-pmap-c)# set dscp AF31 switch (config-pmap-c)# exit switch (config-pmap)# class class-default switch (config-pmap-c)# set dscp AF13 switch (config-pmap-c)# end
3.3.5 service-policy命令
该命令把policy-map应用在接口上,对进入该接口的数据进行分类和标记。其语法如下:
Border_A (config-if)# service-policy input policy-map-name
policy-map-name——使用的policy-map的名字。
3.3.6 MQC应用示例
例3-21:交换机连接IP电话,桌面PC与IP电话相连。假设数据VLAN=10,地址为172.16.10.0/24;语音VLAN=100,地址为192.168.100.0/24。
Distri-Switch3 (config)# ip access-list extended voice-traffic Distri-Switch3 (config-ext-nacl)# permit ip 192.168.100.0 0.0.0.255 any Distri-Switch3(config-ext-nacl)# ip access-list extended data-application Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 1521 Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 1810 Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 2481 Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 7778 Distri-Switch3(config-ext-nacl)# exit Distri-Switch3(config)# class-map Class-A Distri-Switch3(config-cmap)# match access-group name voice-traffic Distri-Switch3(config-cmap)# exit Distri-Switch3(config)# class-map Class-B Distri-Switch3(config-cmap)# match access-group name data-application Distri-Switch3(config-cmap)# exit Distri-Switch3(config)# policy-map sample-policy1 Distri-Switch3(config-pmap)# class Class-A Distri-Switch3(config-pmap-c)# trust cos Distri-Switch3(config-pmap-c)# exit Distri-Switch3(config-pmap)# class Class-B Distri-Switch3(config-pmap-c)# set dscp af21 Distri-Switch3(config-pmap-c)# exit Distri-Switch3(config-pmap)# class class-default Distri-Switch3(config-pmap-c)# set dscp af13 Distri-Switch3(config-pmap-c)# exit Distri-Switch3(config-pmap)# exit Distri-Switch3(config)# interface GigabitEthernet 1/0/13 Distri-Switch3(config-if)# switchport access vlan 10 Distri-Switch3(config-if)# switchport mode access Distri-Switch3(config-if)# switchport voice vlan 100 Distri-Switch3(config-if)# spanning-tree portfast Distri-Switch3(config-if)# service-policy input sample-policy1 Distri-Switch3(config-if)# exit Distri-Switch3(config)# mls qos map cos-dscp 0 8 16 24 32 46 48 56
由于设置了class-default数据的DSCP=af13,该端口的CoS值由DSCP-CoS的映射表计算而得。
如果在端口上使用了“mls qos trust”命令,则该命令会在应用了service-policy命令后失效。
3.3.7 class-map嵌套
class-map嵌套也叫class-map调用,即由一个class-map语句调用另一个class-map语句,从而达到灵活分类数据的目的。
例3-22:class-map嵌套例子。
class4使用的是match-any关键词,即匹配3个条件中任意一个条件的数据都是符合要求的。
class5调用了class4,并且使用的是match-all关键词,这样的结果是匹配class4中任意一个条件并且同时匹配class5中其他条件的数据才是符合要求的。
policy-map命令调用的是class5,这样就产生了{[A or B or C]and D}的匹配结果。如果不使用class-map嵌套,在一个class-map里是不可能产生这样的结果的,因为在一个class-map里不能同时使用match-any和match-all。程序如下所示。
Router(config)# access-list 2 permit 10.10.0.0 0.0.255.255 Router(config)# class-map match-any class 4 Router(config-cmap)# match protocol ip Router(config-cmap)# match qos-group 3 Router(config-cmap)# match access-group 2 Router(config-cmap)# exit Router(config)# class-map match-all class5 Router(config-cmap)# match class-map class4 Router(config-cmap)# match destination-address mac 00:01:00 Router(config-cmap)# exit Router(config)# policy-map sample-policy 2 Router(config-pmap)# class class5 Router (config-pmap-c)# set dscp af41 Router (config-pmap-c)# exit Router(config-cmap)# exit Router (config)# interface GigabitEthernet 2/0 Router (config-if)# service-policy input sample-policy 2 Router (config-if)# end
3.3.8 policy-map嵌套
类似于class-map调用,policy-map也可以调用。policy-map嵌套形成的是具有分层结构的策略。
例3-23:policy-map嵌套。
Switch(config)# class-map inner-class Switch(config-cmap)# match mpls experimental 2 Switch(config-cmap)# exit Switch(config)# class-map outer-class Switch(config-cmap)# match vlan 203 Switch(config-cmap)# exit Switch(config)# policy-map inner-policy Switch(config-pmap)# class inner-class Switch(config-pmap-c)# set mpls experimental 5 Switch(config-pmap-c)# exit Switch(config-pmap)# exit Switch(config)# policy-map outer-policy Switch(config-pmap)# class outer-class Switch(config-pmap-c)# service-policy inner-policy Switch(config-pmap-c)# exit Switch(config-pmap)# exit Switch(config)# interface GigabitEthernet1/1/2 Switch(config-if)# switchport trunk encapsulation isl Switch(config-if)# switchport mode trunk Switch(config-if)# service-policy input outer-policy
在本例中,inner-class匹配的条件是EXP=2,outer-class匹配的条件是VLAN=203。Inner-policy的目的是把EXP=2的数据更改为EXP=5。Outer-policy调用inner-policy,执行的结果是在VLAN203中,EXP=2的数据都被改写为EXP=5。
提示:inner-class定义的数据集合应该小于或等于outer-class定义的数据集合。
3.3.9 检查配置的命令
(1)查看class-map的命令。
语法如下:
Switch# show class-map class-map-name
例3-24:查看名字叫ipp5的class-map。
Switch# show class-map ipp5 Class Map match-all ipp5 (id 1) Match ip precedence 5 Switch#
输出显示名字叫ipp5的class-map使用的关键词是match-all,匹配的是IP优先级等于5的数据包。
(2)查看policy-map的命令。
语法如下:
Switch# show policy-map policy_name
例3-25:查看名字叫ipp5-policy的policy-map。
Switch# show policy-map ipp5-policy Policy Map ipp5-policy class ipp5 set ip precedence 6
(3)查看接口上应用的policy-map。
语法如下:
Switch# show policy-map interface {vlan vlan_ID |{FastEthernet | GigabitEthernet} slot/interface}
例3-26:查看端口5/36上应用的policy-map。
Switch# show policy-map interface FastEthernet 5/36 service-policy input: policy-1 class-map: c-1 (match-any) 238474 packets match:access-group 100 38437 packets class-map:class-default (match-any) 0 packets match:any 0 packets Switch#
输出显示该端口在入口方向(input)上应用了名字叫policy-1的策略。Policy-1调用了c-1(match access-group 100),有38437个数据包匹配。没有数据匹配默认数据类。
提示:根据设备平台和IOS版本的不同,命令的输出结果会有所不同。