一般来说,基于存储转发机制的Internet(Ipv4标准)只为用户提供了“尽力而为(best-effort)”的服务,不能保证数据包传输的实时性、完整性以及到达的顺序性,不能保证服务的质量,所以主要应用在文件传送和电子邮件服务。随着Internet的飞速发展,人们对于在Internet上传输分布式多媒体应用的需求越来越大,一般说来,用户对不同的分布式多媒体应用有着不同的服务质量要求,这就要求网络应能根据用户的要求分配和调度资源,因此,传统的所采用的“尽力而为”转发机制,已经不能满足用户的要求。

QoS的英文全称为"Quality of Service",中文名为"服务质量"。QoS是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。
对于网络业务,服务质量包括传输的带宽、传送的时延、数据的丢包率等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率以及时延抖动等措施来提高服务质量。


通常 QoS 提供以下三种服务模型:

� Best-Effort service(尽力而为服务模型)
� Integrated service(综合服务模型,简称Int-Serv)
� Differentiated service(区分服务模型,简称Diff-Serv)

1. Best-Effort 服务模型
Best-Effort 是一个单一的服务模型,也是最简单的服务模型。对Best-Effort 服务模型,网络尽最大的可能性来发送报文。但对时延、可靠性等性能不提供任何保证。Best-Effort 服务模型是网络的缺省服务模型,通过FIFO 队列来实现。它适用于绝大多数网络应用,如FTP、E-Mail等。

2. Int-Serv 服务模型
Int-Serv 是一个综合服务模型,它可以满足多种QoS需求。该模型使用资源预留协议(RSVP),RSVP 运行在从源端到目的端的每个设备上,可以监视每个流,以防止其消耗资源过多。这种体系能够明确区分并保证每一个业务流的服务质量,为网络提供最细粒度化的服务质量区分。比如我用VOIP,需要12k的带宽和100ms以内的延迟,集成服务模型就会将其归到事先设定的一种服务等级中。
但是,Inter-Serv 模型对设备的要求很高,当网络中的数据流数量很大时,设备的存储和处理能力会遇到很大的压力。Inter-Serv 模型可扩展性很差,难以在Internet核心网络实施。这种为单一数据流进行带宽预留的解决思路在Internet上想要实现很难,所以该模型在1994年推出以后就没有使用过。

3. Diff-Serv 服务模型
Diff-Serv 是一个多服务模型,由一系列技术组成,它可以满足不同的QoS 需求。与Int-Serv 不同,它不需要通知网络为每个业务预留资源。

区分服务实现简单,扩展性较好。可以用不同的方法来指定报文的QoS,如IP包的优先级/Precedence、报文的源地址和目的地址等。网络通过这些信息来进行报文的分类、流量×××、流量监管和排队。本文提到的技术都是基于 Diff-Serv 服务模型。


QoS 技术综述

� 流分类:采用一定的规则识别符合某类特征的报文,它是对网络业务进行区分服务的前提和基础。

� 流量监管:对进入或流出设备的特定流量进行监管。当流量超出设定值时,可以采取限制或惩罚措施,以保护网络资源不受损害。可以作用在接口入方向和出方向。

� 流量×××:一种主动调整流的输出速率的流量控制措施,用来使流量适配下游设备可供给的网络资源,避免不必要的报文丢弃和延迟,通常作用在接口出方向。

� 拥塞管理:就是当拥塞发生时如何制定一个资源的调度策略,以决定报文转发的处理次序,通常作用在接口出方向。

� 拥塞避免:监督网络资源的使用情况,当发现拥塞有加剧的趋势时采取主动丢弃报文的策略,通过调整队列长度来解除网络的过载,通常作用在接口出方向。


在这些QoS技术中,流量分类和标记是基础,是有区别地实施服务的前提;而其他QoS技术则从不同方面对网络流量及其分配的资源实施控制,是有区别地提供服务


各种 QoS 技术在网络设备中的处理顺序。
(1) 首先通过流分类对各种业务进行识别和区分,它是后续各种动作的基础;
(2) 通过各种动作对特性的业务进行处理。这些动作需要和流分类关联起来才有意义。具体采取何种动作,与所处的阶段以及网络当前的负载状况有关。例如,当报文进入网络时进行流量监管;流出节点之前进行流量×××;拥塞时对队列进行拥塞管理;拥塞加剧时采取拥塞避免措施等。


QoS 策略配置方式

QoS 策略配置方式是指通过配置QoS 策略来实现QoS 功能。

QoS 策略包含了三个要素:类、流行为、策略。用户可以通过QoS 策略将指定的类和流行为绑定起来,灵活地进行QoS 配置。

(1) 类

类的要素包括:类的名称和类的规则。

用户可以通过命令定义一系列的规则来对报文进行分类。同时用户可以指定规则之间的关系:and 或者or。

and:报文只有匹配了所有的规则,设备才认为报文属于这个类。
or:报文只要匹配了类中的任何一个规则,设备就认为报文属于这个类。

(2) 流行为

流行为用来定义针对报文所做的 QoS 动作。
流行为的要素包括:流行为的名称和流行为中定义的动作。
用户可以通过命令在一个流行为中定义多个动作。

(3) 策略

策略用来将指定的类和流行为绑定起来,对分类后的报文执行流行为中定义的动作。
策略的要素包括:策略名称、绑定在一起的类和流行为的名称。
用户可以在一个策略中定义多个类与流行为的绑定关系。

流量分类和QoS标记:


流量分类是将数据报文划分为多个优先级或多个服务类。网络管理者可以设置流量分类的策略,这个策略除可以包括IP报文的IP优先级或DSCP值、802.1p的CoS值等带内信令,还可以包括输入接口、源IP地址、目的IP地址、MAC地址、IP协议或应用程序的端口号等。分类的结果是没有范围限制的,它可以是一个由五元组(源IP地址、源端口号、协议号、目的IP地址、目的端口号)确定的流这样狭小的范围,也可以是到某某网段的所有报文。


标记在网络边界处进行,目的在于将区分数据,表明其之间的不同,这样在网络内部队列技术就可以依据这个标记将数据划分到相应的队列,进行不同的处理。

在IP报文中有专门的字段进行QoS的标记,在IPV4中为TOS,IPv6中为TrafficClass。TOS字段用前6bit来标记DSCP,如果只用前3 bit 就为IP优先级。DSCP和IP优先级都是标记的标准。

IP优先级提供0-7共8种服务质量,6和7都保留,所以常用的是0-5,每个数字都对应一个名称,比如0对应Routine ,这样在更改数据包优先级等配置时,既可以用数字也可以用名称。

注意优先级中的数字本身没有实际的意义,标记为5的数据优先级不一定就比标记为0的高,只是一个分类标准而已。真正的操作是在配置上针对不同的优先级采取不同的措施,比如什么标识的数据包属于什么队列。

IP优先级和DSCP不能同时设置,如果同时设置的话只有DSCP生效,那么标记了DSCP的数据包到了只会识别IP优先级的路由器,就只会看前3bit,而且不管是IP优先级还是DSCP都是用自己的前3bit和二层的CoS值形成映射。

在二层用CoS字段进行标记,正常的以太网帧是没有标记的,但是在ISL的报头和802.1Q的Tag中都有3bit用来定义服务级别,从0到7,不过只有0-5可用,6和7都保留。

流量监管、流量×××和接口限速

流量监管、流量×××和接口限速都可以通过对流量规格的监督来限制流量及其资源的使用,它们有一个前提条件,就是要知道流量是否超出了规格,然后才能根据评估结果实施调控。一般采用令牌桶(Token Bucket)对流量的规格进行评估。

1. 令牌桶的特点

令牌桶可以看作是一个存放一定数量令牌的容器。系统按设定的速度向桶中放置令牌,当桶中令牌满时,多出的令牌溢出,桶中令牌不再增加


2. 用令牌桶评估流量

在用令牌桶评估流量规格时,是以令牌桶中的令牌数量是否足够满足报文的转发为依据的。如果桶中存在足够的令牌可以用来转发报文(通常用一个令牌关联一个比特的转发权限),称流量遵守或符合(conforming)这个规格,否则称为不符合或超标(excess)。

评估流量时令牌桶的参数设置包括:

� 平均速率:向桶中放置令牌的速率,即允许的流的平均速度。通常设置为CIR(Committed Information Rate,承诺信息速率)。

� 突发尺寸:令牌桶的容量,即每次突发所允许的最大的流量尺寸。通常设置为CBS(Committed Burst Size,承诺突发尺寸),设置的突发尺寸必须大于最大报文长度。

每到达一个报文就进行一次评估。每次评估,如果桶中有足够的令牌可供使用,则说明流量控制在允许的范围内,此时要从桶中取走与报文转发权限相当的令牌数量;否则说明已经耗费太多令牌,流量超标了。

流量监管的典型应用是监督进入网络的某一流量的规格,把它限制在一个合理的范围之内,或对超出的部分流量进行“惩罚”,以保护网络资源和运营商的利益。例如可以限制HTTP 报文不能占用超过50%的网络带宽。如果发现某个连接的流量超标,流量监管可以选择丢弃报文,或重新设置报文的优先级。流量监管广泛的用于监管进入 Internet 服务提供商ISP 的网络流量。流量监管还包括对所监管流量的流分类服务,并依据不同的评估结果,实施预先设定好的监管动作。这些动作可以是:


� 转发:比如对评估结果为“符合”的报文继续正常转发的处理。

� 丢弃:比如对评估结果为“不符合”的报文进行丢弃。

� 改变优先级并转发:比如对评估结果为“符合”的报文,将之标记为其它的优先级后再进行转发。

� 改变优先级并进入下一级监管:比如对评估结果为“符合”的报文,将之标记为其它的优先级后再进入下一级的监管。

� 进入下一级的监管:流量监管可以逐级堆叠,每级关注和监管更具体的目标。


TS(Traffic Shaping,流量×××)是一种主动调整流量输出速率的措施。一个典型应用是基于下游网络结点的TP 指标来控制本地流量的输出。流量×××与流量监管的主要区别在于,流量×××对流量监管中需要丢弃的报文进行缓存——通常是将它们放入缓冲区或队列内。当令牌桶有足够的令牌时,再均匀的向外发送这些被缓存的报文。流量×××与流量监管的另一区别是,×××可能会增加延迟,而监管几乎不引入额外的延迟。

 

拥塞管理

所谓拥塞,是指当前供给资源相对于正常转发处理需要资源的不足,从而导致服务质量下降的一种现象。

拥塞有可能会引发一系列的负面影响:
� 拥塞增加了报文传输的延迟和抖动,可能会引起报文重传,从而导致更多的拥塞产生。

� 拥塞使网络的有效吞吐率降低,造成网络资源的利用率降低。

� 拥塞加剧会耗费大量的网络资源(特别是存储资源),不合理的资源分配甚至可能导致系统陷入资源死锁而崩溃。

在分组交换以及多用户业务并存的复杂环境下,拥塞又是不可避免的,因此必须采用适当的方法来解决拥塞。
拥塞管理的中心内容就是当拥塞发生时如何制定一个资源的调度策略,以决定报文转发的处理次序。


对于拥塞管理,一般采用队列技术,使用一个队列算法对流量进行分类,之后用某种优先级别算法将这些流量发送出去。每种队列算法都是用以解决特定的网络流量问题,并对带宽资源的分配、延迟、抖动等有着十分重要的影响。

这里介绍几种常用的队列调度机制。

 

1. FIFO(先进先出队列,First In First Out Queuing)

传统的Best-Effort服务策略,默认应用在带宽大于2.048M的接口上,只适用于对带宽和延迟不敏感的流量,像是WWW,FTP,E-mail 等。FIFO不对报文进行分类,当报文进入接口的速率大于接口能发送速率时,FIFO按报文到达接口的先后顺序让报文进入队列,同时在队列的出口让报文按进队的顺序出队。
每个队列内部报文的发送(次序)关系缺省是 FIFO

2. PQ(优先队列,Priority Queuing)

PQ 队列是针对关键业务应用设计的。关键业务有一个重要的特点,即在拥塞发生时要求优先获得服务以减小响应的延迟。PQ 可以根据网络协议(比如IP,IPX)、数据流入接口、报文长短、源地址/目的地址等灵活地指定优先次序。

4 类报文分别对应4 个队列:高优先队列,中优先队列,正常优先队列和低优先队列。高优先级队列的报文都发送完了才能发送下一个优先级的报文。这样的机制虽然能保证关键数据总是得到优先处理,但是低优先级的队列很可能因此十分拥塞。

缺省情况下,数据流进入正常优先队列。
 

3. CQ(自定义队列,Custom Queuing)

CQ 按照一定的规则将分组分成16 类(对应于16 个队列),分组根据自己的类别按照先进先出的策略进入相应的CQ 队列。CQ的1 到16 号队列是用户队列。用户可以配置流分类的规则,指定16 个用户队列占用接口或PVC带宽的比例关系。在队列调度时,系统队列中的分组被优先发送。直到系统队列为空,再采用轮询的方式按照预先配置的带宽比例依次从1 到16 号用户队列中取出一定数量的分组发送出去。这样,就可以使不同业务的分组获得不同的带宽,既可以保证关键业务能获得较多的带宽,又不至于使非关键业务得不到带宽。缺省情况下,数据流进入1 号队列。定制队列的另一个优点是:可根据业务的繁忙程度分配带宽,适用于对带宽有特殊需求的应用。虽然16 个用户队列的调度是轮询进行的,但对每个队列不是固定地分配服务时间片——如果某个队列为空,那么马上换到下一个队列调度。因此,当没有某些类别的报文时,CQ 调度机制能自动增加现存类别的报文可占的带宽。


4. WFQ(加权公平队列,Weighted Fair Queuing)


FQ 是为了公平地分享网络资源,尽可能使所有流的延迟和抖动达到最优而推出的。它照顾了各方面的利益,主要表现在:

� 不同的队列获得公平的调度机会,从总体上均衡各个流的延迟。

� 短报文和长报文获得公平的调度:如果不同队列间同时存在多个长报文和短报文等待发送,应当顾及短报文的利益,让短报文优先获得调度,从而在总体上减少各个流的报文间的抖动。

WFQ 按数据流的会话信息自动进行流分类(相同源IP地址,目的IP地址,原端口号,目的端口号,协议号,IP优先级的报文同属一个流),并且尽可能多地划分出N个队列,以将每个流均匀地放入不同队列中,从而在总体上均衡各个流的延迟。

在出队的时候,WFQ按流的优先级(precedence 或DSCP)来分配每个流应占有出口的带宽。优先级的数值越小,所得的带宽越少。优先级的数值越大,所得的带宽越多。最后,轮询各个队列,按照带宽比例从队列中取出相应数量的报文进行发送。WFQ是传输速率在2.048M以下的接口默认的队列机制。

举例来说,接口中当前共有5 个流,它们的优先级分别为0、1、2、3、4,则带宽总配额为所有(流的优先级+1)的和。即1 + 2 + 3 + 4 + 5 = 15,每个流可得的带宽分别为:1/15,2/15,3/15,4/15,5/15。

WFQ的限制:WFQ不支持隧道或者采用了加密技术的接口,因为这些技术要修改数据包中WFQ用于分类的信息。WFQ提供的带宽控制的精度不如CBQ,因为是基于流的分类,基于队列的带宽分配,每个队列可能会有多个流,这样无法再针对具体的数据类型指定带宽。

5. CBQ(基于类的公平队列,Class-Based Weighted Fair Queuing)

CBQ 是对WFQ 功能的扩展,为用户提供了定义类的支持。CBQ 为每个用户定义的类分配一个单独的FIFO 预留队列,用来缓冲同一类的数据。在网络拥塞时,CBQ对报文根据用户定义的类规则进行匹配,并使其进入相应的队列,在入队列之前必须进行拥塞避免机制(尾部丢弃或WRED,Weighted Random Early Detection,加权随机早期检测)和带宽限制的检查。在报文出队列时,加权公平调度每个类对应的队列中的报文。

CBQ 提供一个紧急队列,紧急报文入该队列,该队列采用FIFO 调度,没有带宽限制。这样,如果CBQ 加权公平对待所有类的队列,语音报文这类对延迟敏感的数据流就可能得不到及时发送。为此将PQ 特性引入CBQ,称其为LLQ(Low LatencyQueuing,低延迟队列),为语音报文这样的对延迟敏感的数据流提供严格优先发送服务。

LLQ 将严格优先队列机制与CBQ 结合起来使用,用户在定义类时可以指定其享受严格优先服务,这样的类称作优先类。所有优先类的报文将进入同一个优先队列,在入队列之前需对各类报文进行带宽限制的检查。报文出队列时,将首先发送优先队列中的报文,直到发送完后才发送其他类对应的队列的报文。在发送其他队列报文时将仍然按照加权公平的方式调度。
为了不让其他队列中的报文延迟时间过长,在使用LLQ 时将会为每个优先类指定可用最大带宽,该带宽值用于拥塞发生时监管流量。如果拥塞未发生,优先类允许使用超过分配的带宽。如果拥塞发生,优先类超过分配带宽的数据包将被丢弃。LLQ还可以指定Burst-size。

CBQ对WFQ做的一些改进:

在WFQ中weight用来指明队列优先级,而在CBWFQ中weight用来指明某类流量的优先级。数据包根据weight排在相应类的队列中。

CBQ一个队列一种数据,所以可以为某类流量指定相应的带宽,而WFQ无法实现,因为是基于流,种类多的很,最后可能每个队列里都有好几种流量。

CBQ分类数据时除了根据IP地址和端口号,还可以通过ACL或数据输入接口,WFQ无法实现。


PQ和CQ都需要手动配置,在命令中可以看出,并不能依据IP优先级或DSCP来划分队列,而且配置起来比较麻烦,命令烦琐。在WFQ中只有一条命令,执行基本是自动化的,但这样不好控制流量,而且要事先进行QoS标记。

在CBQ中QoS的事先标记不是必须的,因为引入了MQC的概念,通过结构化的命令行匹配特定的数据流(如果匹配的是IP优先级或DSCP,则需要事先的QoS标记)再制定细化的处理策略,不过归队列还是算法自动完成,CBQ是目前推荐使用的模式。

CBQ和QoS标记看起来配置步骤十分相似,都是用class map 和policy map,但是其实有很大不同,而且有先后顺序。首先要明确QoS标记的流程: 

1)用class map 抓住数据流最本质的特点,比如特定源地址,目的地址,协议等。
2)用policy map进行标记动作,比如用Set 命令设置IP优先级,DCSP,COS等。
3)在接口应用该配置。

这样看来,如果是要针对IP优先级,DSCP来做策略,步骤是:

QoS标记(匹配特殊数据流-->设定优先级-->应用在接口)---> CBQ用class map匹配优先级--->CBQ用policy map指定策略--->CBQ应用

在接口

而如果QoS策略不涉及IP优先级或DSCP,没有必要实现标记,因为只用MQC就可以搞定:

CBQ用class map匹配特定数据流--->CBWFQ用policy map指定策略--->CBWFQ应用在接口

6. RTP(Real-time Transport Protocol)优先队列

RTP 优先队列是一种解决实时业务(包括语音与视频业务)服务质量的简单的队列技术。其原理就是将承载语音或视频的RTP 报文送入高优先级队列,使其得到优先发送,保证时延和抖动降低为最低限度,从而保证了语音或视频这种对时延敏感业务的服务质量。

RTP和LLQ一样是独立的队列技术,不过一般不会单独应用。RTP可以同FIFO,PQ,CQ,WFQ和CBQ结合,优先级始终是最高的。


7.WRR 加权轮询队列

WRR是应用在交换机上的队列技术,每个交换机端口支持4个输出队列,调度算法在队列之间轮流调度,通过为每个队列配置一个加权值(依次为W3,W2,W1,W0),使其得到相应的带宽资源,比如一个100M的端口,配置加权值为50,30,10,10,那么最低优先级队列至少会获得10M的带宽。

WRR调度队列的方式虽然是轮询的,但是每个队列不是固定的分配服务时间,如果某个队列为空,那么会马上切换到下一个队列调度。

HQ-WRR调度模式在WRR的基础上,在4个调度队列中以队列3为高优先级队列,如果端口出现了拥塞,首先保证队列3的报文优先发送,然后对其余3份额队列实行WRR调度。


拥塞避免

过度的拥塞会对网络资源造成极大危害,必须采取某种措施加以解除。拥塞避免(CongestionAvoidance)是一种流控机制,它可以通过监视

网络资源(如队列或内存缓冲区)的使用情况,在拥塞有加剧的趋势时,主动丢弃报文,通过调整网络的流量来解除网络过载。

与端到端的流控相比,这里的流控具有更广泛的意义,它影响到设备中更多的业务流的负载。设备在丢弃报文时,并不排斥与源端的流控动作(比如TCP 流控)的配合,更好地调整网络的流量到一个合理的负载状态。丢包策略和源端流控机制有效的组合,可以使网络的吞吐量和利用效率最大化,并且使报文丢弃和延迟最小化。

1. 传统的丢包策略

传统的丢包策略采用尾部丢弃(Tail-Drop)的方法。当队列的长度达到某一最大值后,所有新到来的报文都将被丢弃。这种丢弃策略会引发 TCP 全局同步现象——当队列同时丢弃多个TCP 连接的报文时,将造成多个TCP 连接同时进入拥塞避免和慢启动状态以降低并调整流量,而后又会在某个时间同时出现流量高峰,如此反复,使网络流量不停震荡


2. RED 与WRED

为避免TCP 全局同步现象,可使用RED(Random Early Detection,随机早期检测)或WRED(Weighted Random Early Detection,加权随机早期检测)。

在 RED 类算法中,为每个队列都设定上限和下限,对队列中的报文进行如下处理:

? 当队列的长度小于下限时,不丢弃报文;

? 当队列的长度超过上限时,丢弃所有到来的报文;

? 当队列的长度在上限和下限之间时,开始随机丢弃到来的报文。队列越长,丢弃概率越高,但有一个最大丢弃概率。

与 RED 不同,WRED 生成的随机数是基于优先权的,它引入IP 优先权区别丢弃策略,考虑了高优先权报文的利益,使其被丢弃的概率相对较小。RED 和WRED 通过随机丢弃报文避免了TCP 的全局同步现象,使得当某个TCP连接的报文被丢弃、开始减速发送的时候,其他的TCP 连接仍然有较高的发送速度。这样,无论什么时候,总有TCP 连接在进行较快的发送,提高了线路带宽的利用率


流量重定向

流量重定向就是将符合流分类的流重定向到其他地方进行处理。


? 重定向到 CPU:对于需要CPU 处理的报文,可以通过配置上送给CPU。

? 重定向到接口:对于收到需要由某个接口处理的报文时,可以通过配置重定向到此接口。只针对二层转发报文,接口为二层接口。

? 重定向到下一跳:对于收到需要由某个接口处理的报文时,可以通过配置重定向到此接口。只针对三层转发报文。

? 重定向到业务环回组:当某块业务板收到需要由其它业务板进行处理的报文时,该业务板将此报文发送到能处理该业务的单板上完成报文的处理和转发,将多个业务环回端口绑定在一起就构成业务环回组,能够增加板间业务重定向的吞吐能力。