随着网络的发展,互联网流量迅速增加,使得网络产生拥堵,延时增大,有时还会造成丢包现象,导致业务质量下降。那么如何在有限的带宽上控制不同业务的流量?这就需要QoS(Quality of Service,服务质量)技术了
网络拥堵的产生
产生网络拥堵的两种常见情况如下(下图所示):
(1)数据从高速端口进入设备,从低速端口转发出去
(2)流量汇聚,流量从多个端口进入设备,从一个端口转发出去,并且进入端口速率之和大于转发接口的速率
网络拥堵的影响
(1)报文传输延迟、延迟抖动和丢包率增加
(2)由于过高的延迟和丢包导致报文重传,增加网络负担
(3)由于网络拥塞、报文重传导致网络有效吞吐量降低
网络拥堵的解决方法
(1)提高网络带宽
(2)合理利用网络带宽,根据需要使用QoS技术合理分配现有带宽,降低网络拥塞的影响
QOS流量管理
可通过一定的策略控制流量的大小,减少网络拥堵的出现,主要的流量管理技术是承诺访问速率CAR和流量整形GTS。在实际应用中CAR使用的较多,而GTS使用较少。
流分类与流量管理
(1)流分类
流分类是进行区别服务的基础。流分类可以使用报文的优先级,识别不同优先级的流量:也可以使用源地址,目的地址,MAC地址、协议或端口号等信息来识别不同流量。流分类必须与某种流量或带宽分配的动作关联起来才有意义。
(2)流量监控
在对流量进行监控时一般可以设定三个参数:
承诺平均速率(CIR):允许流量通过的平均速率
突发量(Bc):允许突发产生流量的大小,设置的大小必须大于最大报文长度
额外突发量(Be):表示超出突发量后还可以转发的流量的大小
(3)流量策略
转发(transmit):对合规和违规流量设置策略为转发
丢弃(drop):对合规和违规流量设置策略为丢弃
标记(set):标记报文的优先级
(4)流量整形(GTS)
流量整形是一种调节输出速率的措施,使用缓存来保存违规流量,所以可以减小丢包率,避免报文重发,增加延时,一般应用在整体流量小,但有时出现突发流量的环境中。
(5)承诺访问速率(CAR)
承诺访问速率是一种流量控制措施,Bc+Be的大小是允突发的最大的流量,违规流量一般会被直接丢弃而不进行转发,增加了丢包率,CAR多用于接入层。
流量整形与承诺访问速率的配置
1.流量整形配置
有以下两种方式:
(1)基本流量整形配置
1
|
Router(config-
if
)
# traffic-shape rate {CIR[BC[BE]]} [buffer-limit]
|
其中,CIR必须配置,Bc可不用配置。buffer-limit表示缓存区的使用限制,默认为1000(报文数)
(2)基于ACL的流量整形配置
首先,配置ACL,定义需要整形的流量,在配置以下命令:
1
|
Router(config-
if
)
# traffic-shape group access-group {CIR[BC[BE]]}
|
access-group表示定义的ACL的序号
例如:某路由器的配置命令如下:
1
2
3
4
5
|
Router(config)
# access-list 151 permit udp any any
Router(config)
# int f0/0
Router(config-
if
)
# traffic-shape rate 1000000
Router(config-
if
)
# int f0/1
Router(config-
if
)
# traffic-shape group 151 1000000 1000000 1000000
|
(3)查看GTS配置命令
1
2
3
|
Router
# show traffic-shape f0/0 //查看CTS配置信息
Router
# show traffic-shape statistics f0/0 //查看CTS流量统计信息
Router
# show traffic-shape queue //查看CTS队列信息
|
2.承诺访问速率配置
也有以下两种配置方法:
(1)基本承诺访问速率配置
1
|
Router(config-
if
)
# rate-limit {input|output} {CIR} {burst-nlrmal} {burst-max} conform-action {action} exceed-action {action}
|
各参数含义如下
input|output:针对端口如方向|出方向的流量
CIR:承诺访问速率(参数范围 8000---2000 000 000)
burst-nlrmal:普通突发量(参数范围 1000---512 000 000)
burst-max:最大突发量(参数范围 2000---1024 000 000)
conform-action:对合规流量进行的操作
exceed-action:对违规流量进行的操作
action:对相应流量进行的操作(drop丢弃transmit转发 set标记 )
案例1:配置限速流量8Mb/s,最大突发量4000,符合流量转发,超出流量丢弃
1
|
Router(config-
if
)
# rate-limit input 8000000 2000 4000 conform-action transmit exceed-action drop
|
案例2:配置限速流量8Mb/s,最大突发量4000,符合流量被标记5后进行转发,超出流量被标记0后进行转发。优先级为0是默认值,表示尽力发送,当网络拥堵时,根据优先级丢弃数据
1
|
Router(config-
if
)
# rate-limit input 8000000 2000 4000 conform-action set-prec-transmit 5 exceed-action set-prec-transmit 0
|
(2)扩展承诺访问速率
1
|
Router(config-
if
)
# rate-limit {input|output} [access-group access-group] {CIR} {Bc} {Be} conform-action exceed-action
|
(3)查看CAR配置命令
1
|
Router
# show interface f1/0 rate-limit //查看端口限速信息
|
2.承诺访问速率与流量整形的第二种配置
这种配置可以在端口应用一种策略实施多种流量控制
(1)定义匹配策略
1
2
3
4
5
6
|
Router(config)
# class-map [match-all|match-any] {class-map-name} //进入class-map模式,配置匹配条件
Router(config-map)
# match access-group 100 //匹配配置的ACL
Router(config-map)
# match protocol {protocol} //匹配配置的协议
Router(config-map)
# match input-interface int f0/0 //匹配端口进入的流量
Router(config-map)
# match any //匹配任意数据包
Router(config-map)
# match {source-address|destination-address} mac {mac-address} //匹配源或目的MAC地址
|
class-map-name:创建的class-map的名称
match-all:表示匹配class-map定义的所有条件,是默认配置
match-any:表示至少匹配class-map定义的一个条件
(2)定义流量控制策略
通过policy map调用class map,然后分别为每个class map配置策略
1
2
|
Router(config)
# policy-map {policy-map-name} //定义policy-map
Router(config-pmap)
# class {class-map-name} //调用class map
|
然后在调用的class map 中配置的策略包括标记流量、流量整形、CAR等
1
2
|
Router(config-pmap-c)
# set ip dscp {dscp} //标记流量的优先级
Router(config-pmap-c)
# set ip precedence {precedence}
|
配置CAR
1
|
Router(config-pmap-c)
# police {CIR} [burst-normal] [burst-max] conform-action {action} execeed-action {action} violate-action {action}
|
CIR:承诺访问速率
burst-normal:承诺突发量Bc
burst-max:与rate-limit命令不同,此参数表示过量突发量Be
config-action:对小于Bc(包含CIR流量)的流量采取的动作,默认转发
exceed-action:对于Bc和Bc+Be之间的流量采取的动作,默认转发
violate-action:对于大于Bc+Be的流量采取的动作,默认丢弃
action:同rate-limit命令中的action 对流量的相应操作
配置GTS
1
|
Router(config-pmap-c)
# shape average {CIR [Bc[Be]]}
|
average表示平均值,配置完average形式的CTS后,整形后的速率为CIR
配置缓冲区上限
1
|
Router(config-pmap-c)
# shape max-buffers {buffer-limit}
|
buffer-limit:单位报文数,范围为1-4096,默认为1000
(3)在接口上应用策略
1
|
Router(config-
if
)
# service-policy {input|output} {policy-map-name}
|
注意:CTS只能应用在output方向,而CAR可以应用在两个方向
(4)查看配置
1
2
|
Router
# show policy-map [policy-map-name] //查看策略配置
Router
# show policy-map int f0/0 //查看端口策略应用和流量信息
|
例如:某路由器的配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Router(config)
# access-list 100 permit ip 10.0.0.0 0.0.0.255 10.0.0.0 0.0.0.255
Router(config)
# class-map yyy //配置class map
Router(config-cmap)
# match access-group 100 //配置匹配条件,调用ACL
Router(config)
# policy-map ysf1 //定义policy map,配置CAR
Router(config-pmpa)
# class yyy //调用 class map
Router(config-pmap-c)
# police 8000 1500 1500 conform-action transmit exceed-action transmit viliate-action drop
//
配置CAR,小于Bc转发,在Bc- Bc+Be之间转发,大于Bc+Be丢弃
Router(config)
# int f0/0 //在f0/0接口应用CAR策略
Router(config-
if
)
# service-policy input ysf1
Router(config)
# policy-map ysf2 //定义policy map,配置GTS
Router(config-pmap)
# class yyy //调用class map
Router(config-pmap-c)
# shape average 8000 //配置average形式,只配置CIR
Router(config)
# int f0/1 //在f0/1口应用CTS策略
Router(config-
if
)
# service-policy output ysf2
Router
# show policy-map //查看配置策略
|
拥塞管理技术
拥塞管理一般采用队列调度技术,通过队列调度技术的算法使得不同的数据流拥有不同的优先级和带宽信息等,从而确定不同数据流被转发的顺序和带宽。主要有以下六种技术:
1.FIFO:先进先出队列(只有一个队)
2.PQ:优先级队列(4个队列,高级别长期占用,出问题)
3.CQ:定制队列(管理员可加,0保留,1--16轮循环)
4.WFQ:加权公平队列(很多类,包小,优先级高,先发)
5.CBWFQ:基于类的加权公平队列(保证带宽)
6.CBLLQ:基于类低延迟的加权公平队列(保证延迟)
配置CBWFQ
随着技术的发展,最常用的是CBWFQ技术
(1)定义匹配策略,与GTS、CAT第二种配置相同(略)
(2)定义 policy map 并调用class map ,在每一个class map中设置策略
1
|
Router(config-pmap-c)
# bandwidtn {bandwidth-kbps | percent percentage}
|
bandwidth:保证最小带宽
bandwidth-kbps:最小带宽速率(默认情况下,各class map 分配的带宽总和不能超过接口带宽的75%,剩余的25%用于控制和路由选择的流量。可以通过接口模式下的max-reserved-bandwidt 命令进行修改)
percent percentage:最小带宽占端口带宽的百分比
* 然后,配置队列中数据包的个数
1
|
Router(config-pmap-c)
# queue-limit {packets}
|
packets:为设定的队列的数值,范围是1--4096
* 如果需要配置默认类,可用以下命令:
1
|
Router(config-pmap)
# class class-default
|
* 配置LLQ队列的最大带宽
1
|
router(config-pmap-c)
# {bandwidth-kbps | percent percentage}
|
priority:表示队列的最大带宽,其参数的含义与bandwidtn命令相同
(3)在端口实施策略
与CRS、CAR的第二种配置相同,但是需要注意CBWFQ只能配置在端口的output方向
(4)相关查看命令
1
2
|
show policy-map [policy-map-name]
//
查看policy map 的配置信息
show policy-map int f0
/0
//
查看端口的policy map信息和流量信息
|
实验案例:配置CBWFQ,通过为PC1、PC2、PC3、PC4配置最小保证带宽,解决网络拥塞问题
(1)配置网络全网互通(略)
(2)配置CBWFQ,实现网络拥塞时保证最小带宽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
R1(config)
# access-list 100 permit ip host 10.0.1.2 host 10.0.0.4
R1(config)
# access-list 101 permit ip host 10.0.1.2 host 10.0.0.1
R1(config)
# access-list 102 permit ip host 10.0.1.2 host 10.0.0.2 //定义ACL
R1(config)
# class-map match-all ftp1 //定义名称为ftp1的类
R1(config-cmap)
# match access-group 100 //匹配ACL100的流量属于类ftp1
R1(config)
# class-map match-all ftp2
R1(config-cmap)
# match access-group 101
R1(config)
# class-map match-all ftp3
R1(config-cmap)
# match access-group 102
R1(config)
# policy-map ftp //定义名称为ftp的策略
R1(config-pmap)
# class ftp1 //进入类ftp1
R1(config-pmap-c)
# bandwidth 4000 //为类ftp1设定策略,拥塞时带宽为4000Kb/s
R1(config-pmap-c)
# exit
R1(config-pmap)
# class ftp2
R1(config-pmap-c)
# bandwidth 1600
R1(config-pmap-c)
# exit
R1(config-pmap)
# class ftp3
R1(config-pmap-c)
# bandwidth 1600
R1(config-pmap-c)
# exit
R1(config-pmap)
# class class-default //配置其他流量为默认类
R1(config-pmap-c)
# fair-queue //启用公平队列,可和bandwidth同时使用
R1(config)
# interface f0/1
R1(config-
if
)
# service-policy output ftp //CBWPQ只能应用于output方向
|
拥塞避免技术
过度的网络拥塞对于网络的危害是很大的,拥塞避免就是主动丢弃部分报文,以减免网络拥塞程度
1.尾丢弃
传统的丢包策略,即当队列达到最长时,将后面的报文全部丢弃的策略。可能导致网络中流量忽大忽小,极不稳定
在CBWFQ中配置尾丢弃的命令 queue-limit
2.WRED
为避免出现尾丢弃的现象,加权随机预检测(RED)将队列分为两个值,为低阀值和高阀值,并采用如下算法:
* 小于低阀值时,不进行报文丢弃
* 大于高阀值时,完全丢弃报文
* 在低阀值和高阀值之间时,WRED开始进行随机丢弃报文。队列越长,丢弃的概率越高
WRED原理和RED相同,只是在随机丢弃报文时,加入了优先级来区分丢弃策略
WRED的配置
(1)在接口上配置
基于DSCP的配置
1
2
|
Router(config-
if
)
# random-detect dscp-based //启动基于DSCP的WRED
Router(config-
if
)
# random-detect dscp {dscp} { min max }[mark]
|
min:低阀值
max:高阀值
mark:最大概率分母(在计算丢弃时使用)
基于IP优先级的配置
1
2
|
router(config-
if
)
#random-detect
router(config-
if
)
#random-detect precedence {precedence} {min max} {mark}
|
(2)通过policy-map配置WRED
1
2
|
router(config-pmap-c)
#random-detect
router(config-pmap-c)
#random-detect precedence {precedence} {min max} {mark}
|
(3)查看WRED
1
2
|
show queueing random-detect
//
查看WERD信息
show queue [int f0
/0
]
//
查看队列信息
|
LLQ队列不能使用WRED,也不能使用queue-limit 命令