随着网络的高速发展,接入网络的用户越来越多,网络提供的服务也越来越多。网络普及、业务多样化、使得网络流量迅速增大,导致网络带宽不能满足网络的需求,这时就出现了网络拥塞现象。
由于网络拥塞导致报文产生不能预期的传达、延迟抖动、丢包等现象,将造成业务质量的下降甚至出现不可用。为了应对网络拥塞,最直接的方式就是扩大网络带宽,但是由于技术和经济等方面的限制,有时不能通过增加带宽的方式来解决,这时就需要一种技术能够在有限的带宽上保证报文的带宽以免出现延迟、丢包等情况,这种技术就成为QoS技术

Qos是一种网络拥塞的解决方法,其基本思想就是把数据进行分类,放到不同队列中,然后根据数据的类型决定传输的先后或保证一定的带宽。而解决网络拥塞的根本方法就是增加带宽,QoS不能代替网络带宽升级。Qos技术在网络发生拥塞时才起到作用,当网络带宽足够时,QoS不起任何作用。
在企业或运营商的网络环境中部署QoS时,能保证低延时、应用业务的快速转发、控制网络的拥塞时的丢包率、在网络拥塞时为不同的业务保留一定带宽等。QoS简单来说就是区分流量,保证重要流量及时被转发,所以得到了广泛的应用。

产生网络拥塞常见的两种情况
1.数据从高速端口进入设备,从低速端口转发出去:
QoS(服务访问质量)
2.流量汇聚,流量由多个端口进入设备,从一个端口转发出去,并且进入设备端口的速率之和大于转发接口的速率:
QoS(服务访问质量)

一般情况下,网络拥塞是由于网络中出现瓶颈造成的。当然还有一些特殊情况,比如:
当某一时间访问网络的流量超过运营商分配的带宽时;
网络上的流量。
出现网络拥塞造成的影响:
报文传输延迟、延迟抖动和丢包率;
由于过高的延迟和丢包导致报文重传,增加网络负担;
由于网络拥塞,报文重传导致网络的有效吞吐量。

Qos在网络中的服务模型分为三种:
1.Best-Effort Service:尽力而为的服务模型:采用默认的先进先出的方式;
2.Integrated Service:综合服务模型,简称IntServ:采用提前申请网络资源,各节点预留资源的方式;
3.Differentiated Service:区分服务模型,简称DiffServ:采用不预留资源,通过多种方法指定报文的QoS(比如ACL)。

QoS涉及的四大组件,分别是:分类和标记、整 形和监管、拥塞避免、拥塞管理

参考模型,如图(仅供参考):
QoS(服务访问质量)
首先,数据进入设备进行流分类,根据流量的重要程度划分不同的类别,并打上不同的标记。然后使用GTS或CAR技术进行整 形和监管,并根据策略对违规报文进行操作,限制流量的速率。随后通过WRED技术随机丢弃不重要的报文避免网络拥塞,最后通过拥塞管理的队列技术将报文放入不同的队列。队列达到最大长度后,后到的报文将被丢弃,通过队列的出队调度转发报文。

通过参考模型可能不太好理解,那我们再通过一个小型的案例了解一下QoS。
QoS(服务访问质量)
如图,正常数据流按照先后顺序先后到达路由器,经过QoS的分类和标记之后,数据根据不同的重要程度,通过颜色进行区分。在整 形和监管流程中,对数据流进行限速,超出指定速率的报文直接被丢弃,如报文3和报文7,或者标记一个更低的优先级,如报文4,拥塞避免是随机丢弃一些不重要的报文,如报文1和报文6。拥塞管理是将不同优先级的数据流加入不同的队列,最终发送报文时,高优先级队列优先发送,如报文8,低优先级队列延迟发送,如报文4。

下面我们详细介绍一下

分类:
流分类是进行区别服务的基础。流分类可以使用报文的优先级来识别不同优先级特征的流量;也可以使用源地址、目的地址、MAC地址、协议和端口信息来识别不同流量。流分类完全由网络管理员的定义。不同的网络,流量的重要性也不同。列入,对于小型公司而言,HTTP流量可能比较重要;对于大型公司而言,语音流量才是比较重要的。重要是相对而言的,任何流量都应该通过网络,QoS只是优先保证重要的流量。流分类必须与某种流量控制或带宽分配的动作关联起来才有意义。
流分类一般通过ACL区分不同的流量,尤其是扩展ACL,基本可以定义大部分流量。比如

R1(config)#access-list 101 permit tcp any any eq 80  
#定义允许网络中所有HTTP流量

标记:
在QoS技术的DiffServ服务模型中,对于IP报文中的DS字段使用DSCP(差异化服务编码点)作为QoS优先级描述,比如:
QoS(服务访问质量)
DS字段一共八位,在DiffServ中使用DS的前六位,即DS0~DS5定义了0~63共64个优先级。
QoS也可以使用DS字段中的IP优先级,使用DS的前三位IP。优先级共八个等级,其中0表示正常流量(尽力转发),遵循尽力发送原则。
默认情况下在实际的网络通信中,如果不做任何设置,正常的数据优先级都是0,当然也有例外,比如:RIP报文默认优先级是6,OSPF报文的默认优先级也是6等等。
QoS中标记可以通过PBR(策略路由)或者Class-Based Marking。前者多用于策略路由,后者通过一个配置模板来实现功能,下面我们通过配置一个Class-Based Marking 为例演示配置过程:

R1(config)#access-list 100 permit tcp any any eq 80
#流量分类
R1(config)#class-map bjdx
配置class map 名为bjdx
R1(config-cmap)#match access-group 100
#匹配之前定义的ACL分类
R1(config)#policy-map beijing
#定义一个策略,名为beijing
R1(config-pmap)#class bjdx
#匹配之前的class map
R1(config-pmap-c)#set ip precedence 4
#定义优先级为4
R1(config-pmap)#int f0/0
R1(config-if)#service-policy output beijing
#接口出方向应用策略
R1#show policy-map         
#查看策略配置
  Policy Map beijing
    Class bjdx
      set ip precedence 4
R1#show policy-map int          
#查看端口策略应用和流量信息
 FastEthernet0/0 

  Service-policy output: beijing

    Class-map: bjdx (match-all)
      0 packets, 0 bytes
      5 minute offered rate 0 bps, drop rate 0 bps
      Match: access-group 100
      QoS Set
        precedence 4
          Packets marked 0

    Class-map: class-default (match-any)
      310 packets, 31086 bytes
      5 minute offered rate 0 bps, drop rate 0 bps
      Match: any            

整 形和监管
为了避免网络拥塞的出现,可以定义流量进行控制,通过采用一定策略控制流量的大小,以减少网络拥塞的出现,主要的流量管理技术是整 形和监管。
为了更好的利用网络资源,避免大量用户产生突发流量导致网络拥塞,需要对网络中的用户进行限速。当端口接收到某一流量超出限制时,就需要采取一定的措施(降低优先级或丢弃)。
在对流量进行监控室一般设定三个参数:
1.承诺平均速率(CIR):允许流量通过的平均速率。(单位为:bits/s)
2.突发量(Bc):允许突发产生流量的大小,设置的大小必须大于最大报文长度。(单位:字节)
3.额外突发量(Be):表示流量超出突发量后还可以转发的流量的大小(单位:字节)
对于符合规定的流量视为合规流量,而对于超出规定部分的流量视为违规流量。设置流量策略时,既可以设置合规流量策略,也可以设置违规流量策略。

一般流量策略有以下几种:
转发:对于合规流量和违规流量都可以设置策略为转发;
丢弃:对于合规流量和违规流量都可以设置策略为丢弃;
标记:标记报文的优先级。例如:将合规流量报文的IP优先级设定为5,而将违规流量报文的IP优先级设定为0;
进入下一级流量策略:流量策略可以多级处理,可以将流量提交给下一级流量策略进行控制。
流量整 形(GTS)是一种调节输出速率的措施,流量整 形使用缓冲区使流量均匀地进行转发。流量进入设备进行分类,不需要进行整 形的流量直接通过设备转发,需要进行整 形的流量根据配置分为合规流量和违规流量。当流量速率超过设定时,设备将多余的流量缓存到GTS队列,然后按照配置的CIR,将报文均匀地转发出去,以保证网络流量平稳。
整 形流量的速率保持在承诺平均速率附近,如图:
QoS(服务访问质量)
由于流量整 形使用缓存来保存违规流量,所以可以减少丢包率,避免了报文重发,但是使用缓存将导致数据转发时增加时延。流量整 形一般应用在整体流量较小,但有时出现突发流量的环境中。

监管是一种流量控制措施,监管使用的三个参数分别是:承诺平均率、Bc和Be。所以在监管中,Bc+Be的大小是允许突发的最大流量的大小。监管的核心技术是承诺访问速率(CAR)。
Bc和Be相当于信用的积累,如果一致守信(小于规定流量),其信用值就不断增加到某个数值(Bc),如果继续守信,则信用值就会继续增加到一个规定的最大值(Bc+Be)。这时,如果出现违规现象(流量速率超过规定速率),信用就会减少,直到信用值为0.所以Bc、Be是一个积累使用的过程,而不是始终存在的(最初时Bc、Be都是满的),类似于我们用的信用卡!

在使用CAR技术限制流量速率时,违规流量一般会被直接丢弃而不进行缓存。所以CAR技术保证了数据的时延,但是增加了丢包率,如图:
QoS(服务访问质量)
QoS(服务访问质量)

CAR技术多应用于接入层,对接入用户进行流量限制。
CIR表示速率,Bc和Be表示大小。

我们简单介绍一下命令:

基本的流量整 形配置

R1(config)#int f0/0
R1(config-if)#traffic-shape rate 1000000
#在F0/0接口上配置流量整 形,,对经过F0/0接口的所有数据进行流量整 形,范围是1M。

基于ACL的流量整 形配置:

R1(config)#access-list 100 permit udp any any
R1(config)#int f1/0
R1(config-if)#traffic-shape group 100 1000000 1000000 1000000
在F1/0接口上配置基于ACL的流量整 形,表示经过F1/0接口的UDP流量进行流量整 形;
承诺平均速率是1M,突发量是1M,额外突发量是1M
R1#show traffic-shape f0/0
#查看GTS配置信息
Interface   Fa0/0
       Access Target    Byte   Sustain   Excess    Interval  Increment Adapt
VC     List   Rate      Limit  bits/int  bits/int  (ms)      (bytes)   Active
-             1000000   6250   25000     25000     25        3125      -   
R1#show traffic-shape statistics f0/0
#查看GTS流量统计信息
                  Acc. Queue Packets   Bytes     Packets   Bytes     Shaping
I/F               List Depth                     Delayed   Delayed   Active
Fa0/0                   0     92        9203      0         0         no
R1#show traffic-shape queue 
#查看GTS队列信息
Traffic queued in shaping queue on FastEthernet0/0
  Queueing strategy: weighted fair
  Queueing Stats: 0/1000/64/0 (size/max total/threshold/drops)
    #1000标识设置的缓存器限制
     Conversations  0/0/64 (active/max active/max total)
     Reserved Conversations 0/0 (allocated/max allocated)
     Available Bandwidth 1000 kilobits/sec

Traffic queued in shaping queue on FastEthernet1/0
 Traffic shape group: 100
  Queueing strategy: weighted fair
  Queueing Stats: 0/1000/64/0 (size/max total/threshold/drops)
     Conversations  0/0/64 (active/max active/max total)
     Reserved Conversations 0/0 (allocated/max allocated)
     Available Bandwidth 1000 kilobits/sec

承诺访问速率配置
基本的承诺速率配置(如果是实验环境,配置完成之后,不可以被NO掉,只能使用R1(config)#default int f1/0恢复默认接口设置)
QoS(服务访问质量)
其中,各参数的含义:

input/output:表示针对端口入/出方向的流量;
CIR burst-normal burst-max:CIR表示承诺平均速率;burst-normal表示普通突发量;burst-max表示最大突发量。最大突发量包含普通突发量,所以在配置时,burst-max的值需要不小于burst-normal的值。这三个参数的单位不同,分别:
CIR:参数范围是8000~2000000000,单位b/s。
burst-normal:参数范围是1000~512000000,单位为字节。
burst-max:参数范围是2000~1024000000,单位为字节。
conform-action:表示对合规流量进行的操作。
exceed-action:表示对违规流量进行的操作。
action:表示相应流量进行操作,主要的选项:
drop:丢弃数据包;
transmit:转发数据包。

配置实例,比如:

R1(config-if)#rate-limit input 8000000 2000 4000 conform-action transmit exceed-action drop
#表示进入端口的流量被限速为8000000b/s(约8Mb/s),最大突发量为4000字节,
符合的流量转发,不符合的流量将被丢弃

除了转发和丢弃报文之外,还可以设置报文的优先级,可以使用set相关参数进行设定

R1(config-if)#rate-limit input 8000000 2000 4000 conform-action  set-prec-transmit 5 exceed-action set-prec-transmit 0
#表示进入端口的流量被限速为8000000b/s(约1Mb/s),最大的突发量是4000字节,符合的流量被标记IP优先级5后转发,超出的流量被标记IP优先级0后进行转发。IP优先级0位默认值,表示尽力发送。当数据传输中出现网络拥塞是,可以根据优先级丢弃数据

配置ACL,定义需要整 形的流量:
QoS(服务访问质量)
配置实例,比如:

R1(config)#access-list 101 permit udp any any
R1(config)#int f0/0
R1(config-if)#rate-limit input access-group 101 100000 20000 40000 conform-action continue exceed-action drop
#表示匹配ACL序号之后的流量,进人端口的流量限速为100000b/s,最大突发量是40000字节,符合的流量转发,不符合的流量删除。
R1#show int f0/0 rate-limit 
#查看端口限速信息
FastEthernet0/0 
  Input
    matches: access-group 101
        #匹配的ACL
      params:  96000 bps, 20000 limit, 40000 extended limit
            #配置的速率限制
      conformed 0 packets, 0 bytes; action: continue
            #符合的流量统计,动作为转发
      exceeded 0 packets, 0 bytes; action: drop
            #不符合的流量统计,动作为丢弃
      last packet: 1547212ms ago, current burst: 0 bytes
            #当前流量突发量信息
      last cleared 00:10:21 ago, conformed 0 bps, exceeded 0 bps
            #速率信息

承诺访问速率与流量整 形的第二种配置
配置CAR
QoS(服务访问质量)
各参数含义:

CIR:承诺平均速率
burst-normal:承诺突发量Bc
burst-max:与rate-limit命令不同,此参数表示过量突发量Be
conform-action:对小于Bc(包含CIR流量)的流量采取的动作,默认转发
exceed-action:对在Bc~Bc+Be之间的流量采取的动作,默认转发
violate-action:对大于Bc+Be的流量采取的动作,默认丢弃
R1(config)#access-list 100 permit tcp any any
R1(config)#class-map bjdx 
R1(config-cmap)#match access-group 100
#配置class map
R1(config)#policy-map bj 
#配置CAR
R1(config-pmap)#class bjdx
R1(config-pmap-c)#police 8000 1500 1500 conform-action transmit exceed-action transmit violate-action drop
#小于Bc转发,在Bc~Bc+Be之间转发,大于Bc+Be丢弃
R1(config-pmap)#int f1/0
R1(config-if)#service-policy input bj
#在F1/0接口应用CAR策略

配置GTS

R1(config)#access-list 100 permit tcp any any
R1(config)#class-map bjdx 
R1(config-cmap)#match access-group 100
#配置class map
R1(config)#policy-map bj2
R1(config-pmap)#class bjdx
#配置GTS
R1(config-pmap-c)#shape average 8000
#配置average形式,只配置CIR
R1(config)#int f0/0
R1(config-if)#service-policy output bj2 
在F0/0接口应用GTS策略

查看信息

R1#show policy-map
#查看策略配置
  Policy Map bj
    #策略名称
    Class bjdx
        #调用的class map
     police cir 8000 bc 1500 be 1500
         #配置的速率参数
       conform-action transmit 
       exceed-action transmit 
       violate-action drop 

  Policy Map bj2
    Class bjdx
      Traffic Shaping
         Average Rate Traffic Shaping
         CIR 8000 (bps) Max. Buffers Limit 1000 (Packets)
R1#show policy-map int
#查看路由器每个端口的策略应用及流量信息

注意GTS只能应用在output方向,而CAR可以应用在两个方向
使用CAR技术,限速后的数据流会出现丢包现象
使用GTS技术,通过×××后的数据延时会变大

拥塞管理
虽然使用GTS和CAR技术可以控制带宽,但是这样也无法避免网络发生拥塞,如果设备没有充足的缓存区域来保存到达的数据,就会导致部分数据丢失,造成超时重传,最终导致恶性循环。那么发生网络拥塞时,如何决定资源的使用、带宽的分配、报文的转发顺序呢?这是就需要使用拥塞管理技术。
拥塞管理技术一般采用队列调度技术,通过队列调度技术的算法使得不同的数据拥有不同的优先级和带宽信息等,从而确定不同数据流被转发的顺序和带宽。
拥塞管理技术主要包括以下五种技术:
FIFQ:先进先出队列;
PQ:优先级队列;
CQ:定制队列;
WFQ:加权公平队列;
CBWFQ:基于类的加权公平队列。
我们主要介绍WFQ和CBWFQ拥塞管理技术。

WFQ(加权公平队列)根据数据流的源IP地址、目的IP地址、协议、端口号、IP优先级等信息将不同的流分配到不同的队列。WFQ尽量将不同的流量分入不同的队列,以从整体上均衡各个流的时延。在出队的时候,WFQ按照流的优先级来分配出口的带宽,优先级越小得到的带宽越小,优先级越大得到的带宽越大。每个流所占用的带宽比例为(自身流优先级加1)/(所有流优先级分别加1的和)。
QoS(服务访问质量)
例如:如果六个流优先级,分别为0、1、2、3、4、5,则带宽总配额为(0+1)+(1+1)+(2+1)+(3+1)+(4+1)+(5+1)=21,每个流获得的端口带宽分别是1/21、2/21、3/21、4/21、5/21、6/21。
最后轮询各个队列,并根据带宽占用比例进行报文转发。WFQ是Cisco低速端口的默认配置,比如串口等。

CBWFQ(基于类的加权公平队列)扩展了WFQ的功能,CBWFQ可以根据数据的优先级、源IP地址、目的IP地址、协议等进行分类,并让不同的报文进入不同的队列。LLQ(低延时队列)是一个优先类队列,首先转发此队列中的数据,只有此队列没有数据时才转发其他队列中的数据,LLQ可以保证实时性要求较高的业务(比如语音流量)的服务质量。BQ共64个,数据分类后每一类进入一个队列,队列采用WFQ方式进行调度。Default class为默认类队列,在数据分类时没有匹配任何条件的数据被系统送入默认类队列,默认类队列一般采用先进先出或WFQ方式,进行调度。
QoS(服务访问质量)
CBWFQ进行出队调度时,首先转发LLQ中的数据,直到LLQ中数据为0,然后采用WFQ方式转发其他队列中的数据。为了避免转发LLQ队列中的数据时其他队列长时间等待,CBWFQ可以设定一个最大带宽参数,来限制在网络发生拥塞时优先类转发的速率。当网络出现拥塞时,优先类队列中超出配置的流量将被丢弃。
BQ进行出队调度时,可以通过配置保证最小带宽参数来保证网络拥塞时队列的最小带宽,当网络没有发生拥塞时,能够保证队列可以获得设定的最小带宽,使数据能够及时被转发。另外,在网络拥塞时,如果某队列没有数据,则其他队列可以按照配置的保证最小带宽的比例公平地得到空闲带宽。
在CBWFQ技术中,当队列达到设定队列长度的最大值时,需要丢弃后到的数据,这就是尾丢弃。除了尾丢弃,还可以采用加权随机预检测(WRED)的丢弃策略。

默认就是WFQ的配置,接下来我们简单介绍一下CBWFQ的配置

R1(config)#access-list 101 permit ip host 10.0.1.2 host 192.168.1.1
#定义ACL
R1(config)#class-map match-all bj1
#定义名为bj1的类
R1(config-cmap)#match access-group 101
#匹配ACL101的流量属于类bj1
R1(config)#policy-map bjdx
#定义名称为bjdx的策略
R1(config-pmap)#class bj1
#进入类bj1
R1(config-pmap-c)#set precedence 5
#设置优先级为5
R1(config-pmap-c)#police rate 5000000
#为类bj1设定策略,不拥塞时带宽为5000000b/s(单位bits)
R1(config-pmap-c)#bandwidth 4000
#为类bj1设定策略,拥塞时带宽为4000kb/s

定义主要的流量之后,接下来定义默认类

R1(config)#policy-map bjdx
#定义名称为bjdx的策略
R1(config-pmap)#class class-default
#配置其他流量为默认类
R1(config-pmap-c)#fair-queue
#启用公平队列,可以和bandwidth同时使用

最后,将策略应用到接口

R1(config)#int f0/0
R1(config-if)#service-policy output bjdx
#CBWFQ策略只能应用于output方向

拥塞避免
虽然拥塞管理可以通过队列技术保证关键业务的带宽,但是过度的网络拥塞对于网络的危害是很大的,那么如何有效地避免拥塞呢?避免拥塞就要主动丢弃部分报文,以减轻网络的拥塞程度。
尾丢弃就是传统的丢包策略,即当队列达到最大长度后,讲后续来到的报文全部丢弃的策略。很显然不太实用。
在CDWFQ中配置尾丢弃的命令是queue-limit,通过此命令来限制队列的长度。
为了避免出现尾丢弃的现象,就需要使用到WRED(加权随机预检测)这种技术。
采用了以下算法:
小于低阈值时,不进行报文丢弃;
大于高阈值时,完全丢弃报文;
在低阈值和高阈值之间时,WRED开始进行随机丢弃报文,队列越长,丢弃的概率越高。
接下来我们进行简单配置
在接口上配置(基于DSCP的配置)
QoS(服务访问质量)
其中,min表示低阈值,max表示高阈值,mark表示最大概率分母(计算丢弃时使用)
我们通过policy-map配置WRED

R1(config-pmap-c)#random-detect 
启用基于policy-map的WRED
R1(config-pmap-c)#random-detect precedence 6 8 10
以下不丢弃,7个随机丢弃,超过8个直接丢弃
R1#show queueing random-detect 
#查看WERD信息

QoS就介绍这么多吧!希望大家多多交流学习。