QoS 即服务质量,是在园区网和ISP网络中应用的主流技术,其目的在于划分服务等级,针对各种应用的不同需求提供不同的服务质量,比如提供专用带宽减少报文丢失率减低报文传送时的延迟和抖动。
在一个网络中需要三个部分来实现端到端的QoS:
1)各网络设备支持QoS提供队列调度和流量×××等功能。
2)信令技术协调端到端之间的网络设备。
3)QoS技术控制和协调端到端的报文在一个网络内的发送。
每个网络设备提供如下功能:
1)报文的分类,不同类别对应不同的处理方式。
2)排队技术满足不同应用要求的不同服务质量。
3)流量监管和流量×××限制和调整报文输出的速度。
4)接入控制确定是否允许用户信息流使用网络资源。
QoS服务模型
1)Best-Effort 尽力而为的服务模型,也就是没有应用QoS,IP网络本身就是这特点。
2)Intserv 集成服务模型,用户在发送报文前要向网络申请特定的业务,通过RSVP 协议(资源预留协议)通知路由器,声明应用程序的QoS需求,比如我用VOIP,需要12k的带宽和100ms以内的延迟,集成服务模型就会将其归到事先设定的一种服务等级中。
总的来说集成服务模型就是一种固定服务的预订机制,灵活性较差,就好比一个大厨只会做土豆丝炒肉和芹菜炒肉,你要芹菜炒土豆丝,他说不会...靠,想吃素都不行。
RSVP只是一个信令协议,在网络节点之间传递,本身不实现QoS 功能。缺点比较致命,就是RSVP协议本身数据太多而且不断刷新,并且这种为单一数据流进行带宽预留的解决思路在浩瀚的Internet上想要实现是根本不可能的,所以该模型在1994年推出以后就没有使用过。
3)Diffserv 区分服务模型,目前广泛应用的模型,由一系列技术组成。Diffserv可以满足不同的QoS需求。与Integrated service不同,它不需要信令,即应用程序在发出报文前,不需要通知路由器。网络不需要为每个流维护状态,它根据每个报文指定的QoS,来提供特定的服务。可以用不同的方法来指定报文的QoS,如IP包的优先级/Precedence、报文的源地址和目的地址等。网络通过这些信息来进行报文的分类、流量×××、流量监管和排队。
QoS标记
标记在网络边界处进行,目的在于将区分数据,表明其之间的不同,这样在网络内部队列技术就可以依据这个标记将数据划分到相应的队列,进行不同的处理。
在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都保留。
PHB
客户在向ISP要求QoS服务的时候,ISP会列出清单,表明可以提供的网络服务,每种服务的性能都不同,并以一个特定的DSCP值来标记,这个值决定在ISP网络中对该流量的PHB,也就是每一台网络设备如何处理这样的流量,通常客户和运营商之间会协商一个配置文件,描述了各种服务等级的提交速率。
服务被定义后,一种服务,分配一个DSCP值,相应指定一种PHB转发行为。PHB的效果是可见的,比如我确实保证了你的流量延迟在100ms以内,但具体是如何实现的就是黑盒子里的内容了。
默认的PHB行为是尽力而为,编码为DSCP 000000,另外还有EF PHB和AF PHB(CBWFQ中会再提到)。
EF PHB 针对VOIP这样的服务,保证低延迟,低抖动和较小的丢包率。因为分组延迟和抖动的主要原因是排队延迟,而排队延迟通常是在拥塞时排队过长引起的,EF PHB 保证通信不需要排队或队列足够短,所以一般要在高度加权的队列上传送。EF PHB的编码为DSCP 101110。
AF PHB 对应4种AF Class,每一个Class都将自己要发的数据包优先级分为高中低三个档次,而且Class之间也有差异,Class等级越高,对应的IP优先级也就越高,QoS质量也就越好。PHB编码的前3bit表示IP报文优先级,接下来的2bit表示丢包优先级(不会是00),最后1bit总是0。
以下是4种Class具体的对应值:
Low Drop Precent Medium Drop Precent High Drop Precent
Class1 001-01-0 001-10-0 001-11-0
Class2 010-01-0 010-10-0 010-11-0
Class3 011-01-0 011-10-0 011-11-0
Class4 100-01-0 100-10-0 100-11-0
队列技术
队列技术是在接口发生拥塞的时候对数据进行排队,应用队列技术的前提是接口有缓冲内存。以Catalyst 5000为例,每个以太网端口有192KB的缓冲区内存,其中24k用于输入,168k用于输出。每个端口最多可以创建2500个64字节的缓冲区,大多数的缓冲区都用于输出队列。
我们在研究各种队列技术时,重点分析以下几个方面:
1)数据已经进行标记,如何依据标记将其分到各队列?
2)如果要分队列的话,分成几个队列?
3)形成队列后要调度数据,先从哪个队列开始?
4)调度时每次从一个队列里取多少数据从接口发出去?
研究队列技术时往往会感到困惑,既然根据队列优先级调度有先后之分,那么带宽的平均分配和占用又是怎么回事,到底是同时发送,占用各自的带宽,还是先后发送,占用全部带宽?
首先明确一点,接口输出的是比特流,在任一时刻不会同时发送两种数据,因为那一时刻通过的是一个bit,这个bit只会属于一个数据包,况且数据类型本来就是上层的东西,接口就认比特流。我们在想象QoS的时候,可以认为是一些队列面对着出口,调度一声令下就从一个队列里出列一些数据冲出接口。
以CQ为例,CQ给队列1分配60 %带宽,每次出队6000字节的数据,队列2分配40 %带宽,每次出队4000字节的数据,那么在轮询调度的时候,首先让队列1中的报文出队,并发送直到不少于6000字节数据后,才开始发送队列2的报文,直到发送不少于4000字节数据后,才开始下一队列。
虽然各队列的数据发送始终有先有后,但是发送6000字节只是一个瞬间完成,至于这个瞬间有多短,取决于接口性能。接着就是一个4000字节的传输瞬间,那么在1s之内会交替着发送N个6000字节和N个4000字节,最后在这宏观上的1秒,我们看到这两种数据在同时传输,占用的带宽分别1.2M和0.8M。
综上所述带宽的同时占用是以秒为单位的宏观体现,调度算法处理数据的时间根本就不在这个量级上,1s实在是太太太长了,在1s内会先后发送数据N次。所以从微小的瞬间来看数据发送始终有先后,而调度算法就是决定谁先谁后,这也是QoS决策的中心问题。
而优先级队列考虑的不是取多少数据,而是先取哪个队列的数据,因为如果先传送并有一定的带宽保证就能实现该数据传输的低延迟效果。
以LLQ优先队列来讲,如果我们事先定义该队列可占用的最大带宽为2M,那么根据这个值就能计算出每次从LLQ队列中取多少数据出来,比如2000字节,在调度的时候优先考虑LLQ,只要队列中还有数据就一直取,直到LLQ队列为空或者已经取出超过2000字节的数据,这时再考虑其它队列。
以下是各种队列技术的介绍:
1. FIFO(先进先出队列,First In First Out Queuing)
传统的Best-Effort服务策略,默认应用在带宽大于2.048M的接口上,只适用于对带宽和延迟不敏感的流量,像是WWW,FTP,E-mail 等。FIFO不对报文进行分类,当报文进入接口的速率大于接口能发送速率时,FIFO按报文到达接口的先后顺序让报文进入队列,同时在队列的出口让报文按进队的顺序出队。
简单来说,数据就排一队,先到先服务。
2. PQ(优先队列,Priority Queuing,升级版为LLQ)
PQ 根据IP优先级和DSCP 等条件将所有报文归为4类。PQ需要用户自己手动设定分类标准,比如针对某一进站接口,或者某一具体协议的流量等等,再将其归到队列中。
4 类报文分别对应4 个队列:高优先队列,中优先队列,正常优先队列和低优先队列。高优先级队列的报文都发送完了才能发送下一个优先级的报文。这样的机制虽然能保证关键数据总是得到优先处理,但是低优先级的队列很可能因此拥塞的要命。
PQ的限制和缺点:PQ为静态配置,不能适应网络结构的变化。数据包要经过处理器的分类,因此转发数据包的速度要比FIFO慢。此外PQ还不支持隧道接口。
(config)# priority-list 1 protocol sna high //设定sna 流量是高优先级
(config)# priority-list 1 protocol ip low tcp 80 //设定www 流量是低优先级
(config)# priority-list 1 protocol ip medium //设定其他ip 流量是中等优先级
(config)# priority-list 1 queue-limit 50 40 60 80 //设定优先级队列的队列深度,从高到低
(config-if)# priority-group 1 //在接口下应用队列
3. CQ(自定义队列,Custom Queuing)
CQ 按照一定的规则将报文分成17类,对应17个队列,每个报文根据自己的类别按照先进先出的策略进入相应的CQ 队列。
在CQ的17个队列中,0 号队列是超级优先队列,不允许用户配置,路由器总是先把0号队列中的报文发送完再考虑1-16号,所以该队列一般被定义为系统队列,把实时性要求高的交互式协议和链路层协议放在0号队列。
1到16 号队列是用户队列,可以自己定义各队列分得带宽的比例,在报文出队的时候,CQ按定义的带宽比例分别从1-16号队列中轮询式的拿一定量的报文在接口发送出去。
CQ的限制和缺点:CQ为静态配置,不能适应网络结构的变化。数据包要经过处理器的分类,因此转发数据包的速度要比FIFO慢。
(config)# queue-list 1 protocol sna 1 //在queue-list 1 中定义sna 流量归到队列1
(config)# queue-list 1 protocol ip 2 //在queue-list 1 中定义ip 流量归到队列2
(config)# queue-list 1 queue 1 byte-count 15000 //定义queue 1的带宽为15000 bytes
(config)# queue-list 1 queue 2 byte-conut 3500 //定义queue 2的带宽为3500 bytes
(config)# queue-list 1 queue 3 byte-conut 1500 //宽默认值就是1500 bytes
(config-if)# custom-queue-list 1 //在接口应用CQ队列
PS:PQ和CQ均为定制优先级的队列技术,目前已不怎么使用。
4. WFQ(加权公平队列,Weighted Fair Queuing)
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提供的带宽控制的精度不如CBWFQ,因为是基于流的分类,基于队列的带宽分配,每个队列可能会有多个流,这样无法再针对具体的数据类型指定带宽。
WFQ在接口下启用,就一条命令:(config-if) # fair-queue
5. CBWFQ(基于类的公平队列,Class-Based Weighted Fair Queuing)
CBWFQ是WFQ的扩展技术,总体看来就是有一个低延迟队列LLQ来支撑EF PHB,被绝对优先发送,另外有64个BQ来支撑AF PHB,可以保证每一个队列的带宽及可控的时延,还有一个WFQ对应Best-effort行为,使用接口剩余带宽进行转发。
LLQ队列是一种单独的队列技术,只不过CBWFQ将其引进作为自己的组成部分,该队列可以排列不同类型的数据,并分别指定带宽,不过关键点是优先级高,处于这个队列的数据总是优先发送,直到该队列为空或数据流超出LLQ预留最大带宽时才调度其他队列的报文。
BQ(Bandwith Queue)是普通队列,编号1-64,每一类报文占一个队列,根据用户设置来分配带宽,各队列为公平调度,具体算法未知。如果有报文不符合用户设定的所有类,就会编入缺省队列中。在这个队列中为各种数据实行WFQ的机制,即基于流的队列调度,这是目前常用的配置方法,不然就是当成BQ来自动处理了。
CBWFQ能保证你设置队列的带宽,在不拥塞的时候,能共享空闲的带宽,使可用带宽超过你设置的带宽,在拥塞的时候,保证设置的带宽。而LLQ只有在拥塞的时候才起作用,LLQ凌驾于CBWFQ队列,被绝对优先转发。
考虑到链路层控制报文的发送,链路层封装开销以及物理层开销,建议LLQ和BQ占用的带宽不要超过接口带宽的75%,LLQ只采用尾丢弃,BQ和WFQ可以采用尾丢弃或者WRED。
CBWFQ对WFQ做的一些改进:
在WFQ中weight用来指明队列优先级,而在CBWFQ中weight用来指明某类流量的优先级。数据包根据weight排在相应类的队列中。
CBWFQ一个队列一种数据,所以可以为某类流量指定相应的带宽,而WFQ无法实现,因为是基于流,种类多的很,最后可能每个队列里都有好几种流量。
CBWFQ分类数据时除了根据IP地址和端口号,还可以通过ACL或数据输入接口,WFQ无法实现。
CBWFQ使用存在的限制: 目前流量×××不支持CBWFQ CBWFQ不支持子接口。
CBWFQ配置,首先看看BQ的:
class-map match-any class0 //定义class map,用match 匹配特殊的数据流
match ip precedence 4
match ip precedence 0
policy-map tos-based //定义policy map,用定义每类数据的处理策略
class class0 bandwidth 6750 //使用关键字bandwith,说明是在配置BQ队列
interface s1/0 //将策略应用在接口上
service-policy output tos-based
再来看看如何配置LLQ,同上面的不同就是定义policy map时用的是priority关键字:
class-map match-all steven24
match access-group 100
access-list 100 permit ip host 141.2.20.20 host 129.2.20.34 precedence critical
policy-map video1 //定义LLQ策略为Video预留1518k的带宽
class steven24 priority 1518 //使用关键字priority说明在配置LLQ队列
set ip precedence 5 //更改IP优先级,下一跳会按更改后的值处理
class class-default fair-queue
interface FastEthernet1/0
service-policy output video1 //在接口下应用策略
总结:PQ和CQ都需要手动配置,在命令中可以看出,并不能依据IP优先级或DSCP来划分队列,而且配置起来比较麻烦,命令烦琐。在WFQ中只有一条命令,执行基本是自动化的,但这样不好控制流量,而且要事先进行QoS标记。
在CBWFQ中QoS的事先标记不是必须的,因为引入了MQC的概念,通过结构化的命令行匹配特定的数据流(如果匹配的是IP优先级或DSCP,则需要事先的QoS标记)再制定细化的处理策略,不过归队列还是算法自动完成,CBWFQ是目前推荐使用的模式。
CBWFQ和QoS标记看起来配置步骤十分相似,都是用class map 和policy map,但是其实有很大不同,而且有先后顺序。首先要明确QoS标记的流程:
1)用class map 抓住数据流最本质的特点,比如特定源地址,目的地址,协议等。
2)用policy map进行标记动作,比如用Set 命令设置IP优先级,DCSP,COS等。
3)在接口应用该配置。
这样看来,如果是要针对IP优先级,DSCP来做策略,步骤是:
QoS标记(匹配特殊数据流-->设定优先级-->应用在接口)---> CBWFQ用class map匹配优先级--->CBWFQ用policy map指定策略--->CBWFQ应用在接口
而如果QoS策略不涉及IP优先级或DSCP,没有必要实现标记,因为只用MQC就可以搞定:
CBWFQ用class map匹配特定数据流--->CBWFQ用policy map指定策略--->CBWFQ应用在接口
6. RTP(Real-time Transport Protocol)优先队列
RTP 优先队列是一种解决实时业务(包括语音与视频业务)服务质量的简单的队列技术。其原理就是将承载语音或视频的RTP 报文送入高优先级队列,使其得到优先发送,保证时延和抖动降低为最低限度,从而保证了语音或视频这种对时延敏感业务的服务质量。
RTP和LLQ一样是独立的队列技术,不过一般不会单独应用。RTP可以同FIFO,PQ,CQ,WFQ和CBWFQ结合,优先级始终是最高的。
7.WRR 加权轮询队列
WRR是应用在交换机上的队列技术,每个交换机端口支持4个输出队列,调度算法在队列之间轮流调度,通过为每个队列配置一个加权值(依次为W3,W2,W1,W0),使其得到相应的带宽资源,比如一个100M的端口,配置加权值为50,30,10,10,那么最低优先级队列至少会获得10M的带宽。
WRR调度队列的方式虽然是轮询的,但是每个队列不是固定的分配服务时间,如果某个队列为空,那么会马上切换到下一个队列调度。
HQ-WRR调度模式在WRR的基础上,在4个调度队列中以队列3为高优先级队列,如果端口出现了拥塞,首先保证队列3的报文优先发送,然后对其余3份额队列实行WRR调度。