ISP QoS Lab
1-PQ
优先级队列(PQ,Priority Queue)中,有高、中、普通、低优先级四个队列。数据包
根据事先的定义放在不同的队列中,路由器按照高、中、普通、低顺序服务,只有高优先级
的队列为空后才为中优先级的队列服务,依次类推。这样能保证高优先级数据包一定是优先
服务,然而如果高优先级队列长期不空,则低优先级的队列永远不会被服务。我们可以为每
个队列设置一个长度,队列满后,数据包将被丢弃
R1(config)#priority-list 1 protocol ip ? \\可以定义四个优先级
high
medium
normal
low
R1(config)#priority-list 1 protocol ip high tcp 23 \\我们把telenet流量放在最高优先级
R1(config)#priority-list 1 interface f0/0 medium \\把某个接口收到的流量放在中等优先级
R1(config)#priority-list 1 default low
R1(config)#int f1/0
R1(config-if)#pri
R1(config-if)#priority-group ?
<1-16> Priority group
R1(config-if)#priority-group 1
R1#sh int f1/0
FastEthernet1/0 is up, line protocol is up
Hardware is AmdFE, address is cc00.2618.0010 (bia cc00.2618.0010)
Internet address is 192.168.12.1/24
MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 100Mb/s, 100BaseTX/FX
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:04, output 00:00:01, output hang never
Last clearing of "show interface" counters never
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: priority-list 1
Output queue (queue priority: size/max/drops):
high: 0/20/0, medium: 0/40/0, normal: 0/60/0, low: 0/80/0
R1#show queueing priority
Current DLCI priority queue configuration:
Current priority queue configuration:
List Queue Args
1 low default
1 high protocol ip tcp port telnet
1 medium interface FastEthernet0/0
2-CQ
自定义队列(CQ,Custom Queue)和PQ 不一样,在CQ 中有16 个队列。数据包根据事
先的定义放在不同的队列中,路由器将为第一个队列服务一定包数量或者字节数的数据包
后,就转为为第二个队列服务。我们可以定义不同队列中的深度,这样可以保证某个队列被
服务的数据包数量较多,但不至于使得某个队列永远不会被服务。CQ 中的队列0 比较特殊,
只有队列0 为空了,才能为其他队列服务。
R1(config)#queue-list 1 protocol ip 1 tcp telnet \\把telenet流量放到队列1中
R1(config)#queue-list 1 default 6 \\其他流量默认放在队列6中
R1(config)#int f1/0
R1(config-if)#custom-queue-list 1
R1#sh int f1/0
FastEthernet1/0 is up, line protocol is up
Hardware is AmdFE, address is cc00.2618.0010 (bia cc00.2618.0010)
Internet address is 192.168.12.1/24
MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 100Mb/s, 100BaseTX/FX
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:00, output 00:00:01, output hang never
Last clearing of "show interface" counters never
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: custom-list 1
Output queues: (queue #: size/max/drops)
0: 0/20/0 1: 0/20/0 2: 0/20/0 3: 0/20/0 4: 0/20/0
5: 0/20/0 6: 0/20/0 7: 0/20/0 8: 0/20/0 9: 0/20/0
10: 0/20/0 11: 0/20/0 12: 0/20/0 13: 0/20/0 14: 0/20/0
15: 0/20/0 16: 0/20/0
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
3-WFQ
加权公平队列(WFQ,Weight Fair Queue)是低速链路(2.048M 以下)上的默认设置。
WFQ 将数据包区分为不同的流,例如在IP 中利用IP 地址和端口号可以区分不同的TCP 流或
者UDP 流。WFQ 为不同的流根据权重分配不同的带宽,权因子是IP 数据包中的优先级字段。
例如有3 个流,两个流的优先级为0,第三个为5,总权为(1+1+6)=8,则前两个流每个
得到带宽的1/8,第三个流得到6/8。
R1(config)#int f1/0
R1(config-if)#fair-queue 512 1024 10 \\以上是在接口上启用WFQ,实际上在E1 速(2.048M)或者更低速率的链路上,WFQ 是默认启用的。512 是丢弃值,当队列达到512 数据包时,数据将被丢弃;1024 是最大的会话数;10 是RSVP 可预留队列。
Show int f1/0
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: weighted fair
Output queue: 0/1000/512/0 (size/max total/threshold/drops)
Conversations 0/1/1024 (active/max active/max total)
Reserved Conversations 0/0 (allocated/max allocated)
Available Bandwidth 75000 kilobits/sec
4-CBWFQ
基于类的加权公平队列(CBWFQ,Class Based Weight Fair Queue)允许用户自定义类
别,并对这些类别的带宽进行控制。这在实际中很有用,例如我们可以控制我们的网络访问
Internet 时的web 流量的带宽。可以根据数据包的协议类型、ACL、IP 优先级或者输入接口
等条件事先定义好流量的类型,为不同类别的流量配置最大带宽、占用接口带宽的百分比等。
CBWFQ 可以和NBAR、WRED 等一起使用。
Step1: 定义Class map
R1(config)#class-map match-any map1
R1(config-cmap)#match protocol http
R1(config-cmap)#match protocol ftp
R1(config-cmap)#exit
R1(config)#class-map match-all map2
R1(config-cmap)#match protocol telnet
Step2:定义Policy-Map
R1(config)#policy-map my-policy
R1(config-pmap)#class map1
R1(config-pmap-c)#bandwidth 60
R1(config-pmap-c)#class map2
R1(config-pmap-c)#bandwidth 10
R1(config-pmap-c)#exit
Step3:调用到接口
R1(config)#int f1/0
R1(config-if)#service-policy output my-polic
【技术要点】class-map 命令格式为:“class-map [ match-all | match-any ] name”:
match-all:指明下面的条件必须全部满足,才可以执行,此为默认值;
match-any:表示匹配任何一个条件就可以执行。
在class-map 模式下,可以设置各种匹配条件,例如:
匹配一种协议类型:match protocol protocol-name 。协议类型包括EGP,ICMP,EIGRP,
DNS,HTTP,Telnet 等上百种具体协议。
匹配访问列表:match access-group { number | name acl_name } 。可以匹配基
于号码的list 和基于Name 的Access list。
匹配CoS (class of Servie):match cos cos-value 。匹配IP 包中的CoS 值。
匹配IP 优先级(IP Precedence):match ip precedence precedence-value 。匹配
IP 包中的IP 优先级值。
匹配DSCP 值(Differentiated Services Code Point): match ip dscp dscp_value 。
匹配IP 包中的DSCP 值。
匹配入接口:match input-interface type number。匹配IP 包的进入接口。
R1#show class-map
Class Map match-any class-default (id 0)
Match any
Class Map match-any map1 (id 1)
Match protocol http
Match protocol ftp
Class Map match-all map2 (id 2)
Match protocol telnet
R1#show policy-map
Policy Map my-policy
Class map1
Bandwidth 60 (kbps) Max Threshold 64 (packets)
Class map2
Bandwidth 10 (kbps) Max Threshold 64 (packets)
5-LLQ
低延迟队列(LLQ,Low Latency Queue)的配置和CBWFQ 很类似。有的数据包,例如
VOIP 的数据包,对数据的延迟非常敏感。LLQ 允许用户自定义数据类别,并优先让这些类别
的数据传输,在这些数据没有传输完之前不会传输其他类别的数据。
LLQ=CBWFQ + PQ
Default queue默认是WFQ
R1(config)#class-map match-any map3
R1(config-cmap)#match ip precedence critical
R1(config-cmap)#exit
R1(config)#policy
R1(config)#policy-map my-policy
R1(config-pmap)#class map3
R1(config-pmap-c)#priority ?
<8-2000000> Kilo Bits per second
percent % of total bandwidth
R1(config-pmap-c)#priority 15
\\LLQ 的配置和CQWFQ 配置很类似,不过使用了priority 命令,我们这里限制它的带宽为
15k,超过这个带宽的数据包将被丢弃。这样CLASS-MAP3 的流量将优先被发送,然后才发送
CLASS-MAP1 和CLASS-MAP2 等流量。
R1#sh policy-map interface f1/0
FastEthernet1/0
Class-map: map3 (match-any)
0 packets, 0 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: ip precedence 5
0 packets, 0 bytes
5 minute rate 0 bps
Queueing
Strict Priority
Output Queue: Conversation 264
Bandwidth 15 (kbps) Burst 375 (Bytes)
(pkts matched/bytes matched) 0/0
(total drops/bytes drops) 0/0
Class-map: class-default (match-any)
763 packets, 63162 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: any
R1(config)#policy-map my-policy
R1(config-pmap)#class class-default
R1(config-pmap-c)#?
QoS policy-map class configuration commands:
bandwidth Bandwidth
compression Activate Compression
drop Drop all packets
exit Exit from QoS class action configuration mode
fair-queue Enable Flow-based Fair Queuing in this Class
netflow-sampler NetFlow action
no Negate or set default values of a command
police Police
priority Strict Scheduling Priority for this Class
queue-limit Queue Max Threshold for Tail Drop
random-detect Enable Random Early Detection as drop policy
service-policy Configure Flow Next
set Set QoS values
shape Traffic Shaping
R1(config-pmap-c)#no fair-queue \\更改default 队列机制
6-WRED
加权随机早期检测(WRED,Weight Random Early Detect)是RED 的Cisco 实现。当
多个TCP 连接在传输数据时,全部连接都按照最大能力传输数据,很快造成队列满,队列满
后的全部数据被丢失;这时所有的发送者立即同时以最小能力传输数据,带宽开始空闲。接
着全部发送者开始慢慢加大速度,于是又同时达到最大速率,又出现堵塞,如此反复。这样
网络时空时堵,带宽的利用率不高。RED 则随机地丢弃TCP 的数据包,保证链路的整体利用
率。WRED 是对RED 的改进,数据包根据IP 优先级分成不同队列,每个队列有最小阀值、最
大阀值,当平均长度小于最小阀值时,数据包不会被丢弃;随着平均队列的长度增加,丢弃
的概率也增加;当平均长度大于最大阀值时,数据包按照设定的比例丢弃数据包。
R1(config)#int f1/0
R1(config-if)#random-detect
//以上在接口上启用WRED
R1(config-if)#random-detect precedence 0 18 42 12
//以上配置IP 优先级为0 的队列,最低阀值为18,平均队列长度小于18 时,数据包不会
被丢弃;当平均队列长度大于18 时,开始丢弃数据包,平均队列长度越大,丢弃的数据包
越多;最大阀值为42,平均队列长度小于42 时,数据包按照1/12 的比例丢弃。
R1#show queueing random-detect
Current random-detect configuration:
FastEthernet1/0
Queueing strategy: random early detection (WRED)
Random-detect not active on the dialer
Exp-weight-constant: 9 (1/512)
Mean queue depth: 0
class Random drop Tail drop Minimum Maximum Mark
pkts/bytes pkts/bytes thresh thresh prob
0 0/0 0/0 18 42 1/12
1 0/0 0/0 22 40 1/10
2 0/0 0/0 24 40 1/10
3 0/0 0/0 26 40 1/10
4 0/0 0/0 28 40 1/10
5 0/0 0/0 31 40 1/10
6 0/0 0/0 33 40 1/10
7 0/0 0/0 35 40 1/10
rsvp 0/0 0/0 37 40 1/10
\\以上显示WRED 的配置情况,默认时不同IP 优先级的队列的最低有所不同,我们更改了
IP 优先级为0 的队列。
7-CAR
承诺访问速率(CAR,Commited Access Rate)是一种流量策略的分类和标记的方法,
它基于IP 优先级、DSCP 值、MAC 地址或者访问控制列表来限制IP 流量的速率。标记则可以
改变IP 优先级或者DSCP。
CAR 使用令牌桶的机制,检查令牌桶中是否有足够的令牌。如果一个接口有可用的令牌,
令牌可以从令牌桶中挪走,数据包被转发,当这个时间间隔过去后,令牌会重新添加到令牌
桶中。如果接口没有可用的令牌,那么CAR 可以定义对数据包采取的行为。CAR 使用3 种速
率定义来定义流量的速率:
Normal rate(正常的速率):令牌被添加到令牌桶中的平均速率,就是数据包的平均
传输速率。
1- Normal burst(正常的突发):正常的突发时在时间间隔内允许正常流量速率的流量。
2-Excess burst(过量突发):超过正常突发的流量。当配置过量突发时,会借令牌并且
将它添加到令牌桶中来允许某种程度的流量突发。当被借的令牌已经使用后在这个接口
上收到的任何超出的流量会被扔掉。流量突发只会发生在短时间内,直到令牌桶中没有
令牌存在才停止传输。
通常建议正常的流量速率配置为等于在一段时间内的平均流量速率。正常的突发速率应
当等于正常速率的1.5 倍。过量速率是正常突发速率的2 倍。
R1(config-if)#rate-limit output access-group 101 64000 12000 16000 conform-action
set-prec-transmit 3 exceed-action set-prec-transmit 0
//以上在接口上启用CAR,对于符合ACL 101 的流量,平均速率为64000 位/秒,正常突发
量为12000 字节/秒,过量突发量为12000 字节/秒。
rate-limit { output | input } { CIR BC BE } conform-action { action } exceed-action
{ action }
CIR 单位是bit/s;而BC 和BE 的单位是byte/s。
conform-action 的条件是指当要发的数据小于正常突发(bc)的时候
exceed-action 是指要发的数据大于普通突发,小于最大突发(be)的时候。
action 的选项共有如下这些:
continue:继续执行下一条CAR 语句
drop:丢弃数据包
tranmsit:转发数据包
set-prec-continue { precedence }:设置IP 优先级并继续执行下一条CAR 语句
set-prec-transmit { precedence }:设置IP 优先级并转发数据包
set-dscp-continue { dscp }:设置dscp 值并继续执行下一条CAR 语句
set-dscp-transmit { dscp }:设置dscp 值并转发数据包
R1#show interfaces rate-limit
9-NBAR
基于网络的应用识别(NBAR,Network Based Application Recognition)实际上一个
分类引擎,它查看数据包,对数据包包含的信息进行分析。NBAR 使得路由器不仅要做转发
数据的工作,还要对数据包进行检查,这样会大大增加负载。NBAR 可以检查应用层的内容,
例如可以检查URL 是否有“.java”字样。NBAR 可以和许多QOS 配合使用。
R1(config)#class-map exchange
R1(config-cmap)#match protocol exchange
R1(config-cmap)#exit
R1(config)#policy-map deny-exchange
R1(config-pmap)#class exchange
R1(config-pmap-c)#?
QoS policy-map class configuration commands:
bandwidth Bandwidth
compression Activate Compression
drop Drop all packets
exit Exit from QoS class action configuration mode
netflow-sampler NetFlow action
no Negate or set default values of a command
police Police
priority Strict Scheduling Priority for this Class
queue-limit Queue Max Threshold for Tail Drop
random-detect Enable Random Early Detection as drop policy
service-policy Configure Flow Next
set Set QoS values
shape Traffic Shaping
R1(config-pmap-c)#drop
R1(config)#int f1/0
R1(config-if)#service-policy output deny-exchange
NABR 的配置和CBWFQ 没什么差别,因为NBAR 实际上只是一个分类技术。
在旧的IOS 中,class-map 模式下不能使用“match protocol bittorrent”等命令,要先从Cisco 网站下载bittorrent.pdlm 等文件,上传到路由器上的FLASH 中,并使用命令“ip nbar pdlm flash: bittorrent.pdlm”后,才能在class-map 模式下,使用“matchprotocol bittorrent”命令。
【提示】NBAR 需要路由器启用CEF,默认时CEF 是开启的,如果没有开启,可以使用“ip cef”
命令。
10-命令总结
priority-list 1 protocol ip high tcp telnet创建优先级队列,标号为1。把telnet 流量放在高优先级队列中
priority-list 1 queue-limit 20 30 40 50 定义优先级队列高、中、普通、低队列中的长度
priority-group 1 把定义好的优先级队列应用接口上
show queueing priority 查看优先级队列情况
debug priority 调试优先级队列
queue-list 1 protocol ip 1 tcp telnet 创建自定义队列,标号为1。把telnet 流量放在队列1 中
queue-list 1 queue 1 limit 40 定义队列1 的深度为40,
custom-queue-list 1 把定义好的自定义队列应用接口上
fair-queue 512 1024 10 在接口上启用WFQ,512 是丢弃值,1024 是最大的会话数,10 是RSVP 可预留队列
class-map match-any CLASS-MAP1 定义class-map,名为CLASS-MAP1
match protocol http 匹配http 协议