QoS 概述
在传统的IP网络中,所有的报文都被无区别地等同对待,每个路由器对所有的报文均采用先进先出(FIFO)的策略进行处理,尽最大的努力(best-effort)将报文送到目的地,但对报文传送的可靠性、传送延迟等性能不提供任何保证。
随着IP网络上新应用的不断出现,对IP网络的服务质量也提出了新的要求,传统IP网络的“尽力服务”已不能满足应用的需要,如VoIP业务,如果报文传送延时太长,将是用户所不能接受的。为IP网络提供支持QoS(Quality of Service)的能力是解决问题的可行方法。
QoS即服务质量,旨在针对各种应用的不同需求,提供不同的服务质量,如提供专用带宽、降低报文丢失率、减少报文传送时延及时延抖动等。为实现上述目的,QoS提供了下列功能:
-
报文分类
-
报文标记
-
流量监管和流量整形
-
拥塞避免
-
拥塞管理
综合服务和差分服务
为了实现IP网络的QoS,需要通过对带宽分配、改进丢包特性、避免和管理网络拥塞、测量网络流量、或设置跨网络的业务流优先级等特性的配置来提供更好、更加可预测的网络服务。
QoS是在尽力发送方式的IP层上为提供一定的服务保障而提出的一系列措施的集合,QoS可分为两种类型的服务:综合服务(Int Serve)和差分服务(Diff Serve)。
-
综合服务可以满足多种QoS需求。这种服务模型在发送报文前,需要向网络申请特定的资源。这个请求是通过信令来完成的,应用程序先通知网络自己的流量参数和需要的特定服务质量,包括带宽、时延等,应用程序一般在收到网络的确认信息,即确认网络已经为这个应用程序的报文预留了资源后,才开始发送报文,同时应用程序发出的报文被控制在流量参数描述的范围内。
这种服务能很好地满足QoS的要求,但由于网络需要为每个流维护一份QoS记录,会造成扩展上的问题,因此综合服务在实际应用中并不广泛。
-
与综合服务不同,差分服务不需要信令,即应用程序在发出报文前,不需要通知路由器。网络不需要为每个流维护状态,只需根据每个报文指定的QoS来提供特定的服务。可以用不同的方法来指定报文的QoS,如IP包的优先级位(IP Precedence),报文的源地址和目的地址等。网络通过这些信息来进行报文的分类、流量整形、流量监管和排队。
差分服务可以看作是综合服务和尽力模式的一个折中,其服务粒度比综合服务大,但比尽力发送小,又能支持一定的流量优先级选择。
差分服务主要分为以下两个相辅相成的部分:
→ 流量分类:主要有按照ACL、流量大小、ToS、NBAR的分类
→ 分类管理策略:包括队列策略、丢弃策略、整形策略
QoS 工具
路由器设备中的QoS工具通常包括分类与标记工具、流量监管与整形工具、拥塞管理工具、拥塞避免工具等。
-
报文分类
报文分类工具能够将网络业务流分割成多个优先级或服务类别。
例如:使用IP包头中的DSCP字段,可以将报文最多分成64种业务类别。报文分类完成后,可以对不同的业务类别应用不同的QoS处理策略,包括拥塞管理、流量监管与整形、报文标记或重标记等。
常见的报文分类依据包括:物理接口、子接口、PVC、MAC地址、802.1Q/p CoS、MPLS EXP、DSCP、IPP、IP五元组、甚至包括包头或净荷中的URL等。
-
报文标记:标记工具通常用来建立其它QoS工具所依赖的信任边界。可以根据用户策略对不同的业务类型施加不同的标记,该标记可以作为下一级分类的标准,也可以由报文携带到其他设备。此外,路由器还可以根据流量监管的结果对报文重新标记,例如报文的降格处理等。
-
流量监管和整形工具
流量监管及时地检查流量违约,并在违约出现的时候立即采取规定的动作。流量监管能够确定入接口是否超过了约定的速率,对于超过约定的速率部分进行重新标记或丢弃。
流量整形是与排队机制一起工作的流量平滑工具。流量整形的目的是使平滑流量不会超过指定的速率。如果进入的流量临时超过了指定的速率,那么过量的流量会被缓存并延迟发送。
-
拥塞管理工具:在所有的QoS工具中,拥塞管理工具对应用程序服务质量的影响最为显著。拥塞管理工具也被称为排队工具,当网络发生了拥塞的时候,决定不同业务流的出队策略。常见的拥塞管理工具包括PQ、WFQ、CBWFQ等。
-
拥塞避免工具:拥塞避免工具是拥塞管理工具的补充,拥塞管理工具管理一个队列的头部,而拥塞避免工具则管理一个队列的尾部 。
常见的拥塞避免机制包括:随机早期检测(RED)、加权随机早期检测(WRED)、显式拥塞通知(ECN)等。
队列策略
队列策略主要实现了以下三种队列,即:
-
FIFO(先进先出队列,First In First Out Queue)
FIFO队列是最简单的队列,也是路由器采用的默认的队列处理方式。该方式将所有要从该接口输出的报文,按照到达的先后顺序进入接口的FIFO队列尾部,而接口在发送报文时,从FIFO队列的头部开始,依次发送报文。所有的报文在发送过程中,没有任何区别,也不对报文传送的质量提供任何保证。
-
Priority Queue(优先队列PQ)
PQ队列是将流量分放入高、中、普通、低四个队列中,对这四个队列的处理是严格按照优先级别来进行的。在报文出队的时候,PQ先让高优先队列中的报文出队并发送,直到高优先队列中的报文发送完,再发送中优先队列中的报文。同样,中优先队列中的报文发送完后,再发送正常优先队列中的报文,最后是低优先队列。
这样,分类时属于较高优先级队列的报文将会得到优先发送,而较低优先级的报文将会在发生拥塞时被较高优先级的报文抢先。这使得关键业务的报文能够得到优先处理,非关键业务的报文在网络处理完关键业务后的空闲中得到处理,既保证了关键业务的及时处理,又充分利用了网络资源。
-
Weighted-fair Queue(加权平均队列WFQ)
WFQ是基于流的公平队列,即是为了调整封包较大的流对封包较小的流的优势而发展出的一种队列模式。通过基于虚拟发送时钟的调度策略,可以较好地在不同包大小的流之间得到一定的带宽公平。
丢弃策略
丢弃策略是在队列流量到达限制时对包采用何种方式丢弃,常用的是尾部丢弃(Tail Drop)、随机早期检测(RED)、加权随机早期检测(WRED)。
路由器设备中QoS的常用实现流程如图所示。
CAR
流量在报文满足一定的条件时,如某个连接的报文流量过大,流量监管就可以对该报文采取不同的处理动作,例如丢弃报文,或重新设置报文的优先级等。CAR(Committed Access Rata,约定访问速率)不仅可以进行流量控制,还可以对报文进行标记和重标记。
要实现流量的监管,必须有一种机制可以对通过设备的流量进行度量,也就是所谓的粒度控制。令牌桶是目前最常采用的一种流量测量方法,在CAR及流量整形技术中都使用该方法进行流量速率的控制。
要实现流量监管,需要根据预先设置的匹配规则,比如报文的源或目的MAC地址、满足ACL的情况、IP precedence、DSCP、EXP、五元组(源或目的IP地址、源或目的端口号、协议类型)等信息来对报文进行分类;如果是符合令牌桶流量规定的报文,就继续发送,如果是超出流量规定的报文,则被丢弃或重新标记IP precedence、DSCP、EXP等值。
令牌桶可以看作是一个存放令牌的容器,预先设定一定的容量。系统按用户设定的速度向桶中放置令牌,当桶中令牌满时,多余的令牌溢出,且令牌的量不再增加。令牌桶对流量的测量又分为单令牌桶测量和双令牌桶测量。
单令牌桶
在网络流量比较简单的情况下,可以采用单令牌桶测量流量。单令牌桶主要由两个参数构成:
-
CIR(Committed Information Rate,承诺信息速率),表示向令牌桶中投放令牌的速率,即长时间的端口平均速率。
-
CBS(Committed Burst Size,承诺突发尺寸),用来决定在部分流量超过CIR之前的最大突发流量,即为令牌桶的容量(深度)。设置的突发尺寸必须大于报文的最大长度。
还有一个隐含参数为TI,该值为CBS/CIR,其定义了向令牌桶中加入令牌的时间间隔。也就是说每隔TI时间就会有新的令牌加入到令牌桶中,加入的令牌数量是CBS定义的大小。
在用单令牌桶测量流量规格时,是以令牌桶中的令牌数量是否足够满足报文的转发为依据的。如果桶中存在足够的令牌可以用来转发报文(通常用一个令牌关联一个比特的转发权限),称流量遵守或符合这个规格,报文被标记为green;否则称为不符合或超标,报文被标记为red。
每到达一个报文就进行一次测量,每次测量如果桶中有足够的令牌可供使用,则说明流量控制在允许的范围内,此时要从桶中取走与报文转发权限相当的令牌数量;否则说明已经耗费太多令牌,流量超标了。
双令牌桶
为了测量更复杂的情况,实施更灵活的调控策略,可以设置两个令牌桶,即通常说的双令牌桶测量(这两个桶简称C桶和P桶)。双令牌桶主要包括四个参数:
-
CIR(Committed Information Rate,承诺信息速率),表示向C桶中放置令牌的速率,即C桶允许的流的平均速度。
-
CBS(Committed Burst Size,承诺突发尺寸),表示C桶的容量,即每次突发C桶所允许的最大的流量尺寸。
-
PIR(Peak Information Rate,峰值信息速率),表示向P桶中放置令牌的速率,即P桶允许的流的平均速度。
-
PBS(Peak Burst Size,峰值突发尺寸),表示P桶的容量,即每次突发P桶所允许的最大的流量尺寸。
在双令牌桶中,也有两个隐含参数为TI1和TI2,取值分别为CBS/CIR和PBS/PIR。2个参数主要定义了向C令牌桶和P令牌桶中加入令牌的时间间隔。也就是说每隔TI1时间就会有新的令牌加入到C令牌桶中,加入的令牌数量是CBS定义的大小;每隔TI2时间就会有新的令牌加入到P令牌桶中,加入的令牌数量是PBS定义的大小。
每次对到来的报文进行测量:
-
如果C桶有足够的令牌,报文被标记为green。
-
如果C桶令牌不足,但P桶有足够的令牌,报文被标记为yellow。
-
如果C桶和P桶都没有足够的令牌,报文被标记为red。
CAR处理流程
流量监管采用承诺访问速率CAR来对流量进行控制。先根据预先设置的匹配规则来对报文进行分类,再依据不同的评估结果,实施预先设定好的监管动作。这些动作可以是:
-
转发(transmit):对测量结果为“符合”的报文继续正常转发的处理,也可以为Diff- Serv(差分服务)提供带有标记DSCP的服务再转发。
-
丢弃(drop):对测量结果为“不符合”的报文进行丢弃。
-
重标记并转发(set):对测量结果为“不符合”的报文,重新设置IP Precedence、DSCP或EXP值再进行转发。
CAR的处理流程如图所示。
令牌桶按用户设定的速度向桶中放置令牌,并且用户可以设置令牌桶的容量,当桶中令牌的量达到桶的容量时,令牌不再增加。桶中的令牌数表示可接待的数据突发量,这样可以允许数据的突发性传输。
-
如果令牌桶中有足够的令牌可以用来发送报文,则允许报文通过,报文可以被发送出去,同时,令牌桶中的令牌量随报文发送相应减少。
-
如果令牌桶中的令牌少到报文不能再发送时,则报文被丢弃或进入标记器进行IP Precedence、DSCP或EXP值的重标记后再发送。
CAR通过使用令牌桶对流经端口的数据流进行度量,使得在特定时间内只有得到令牌的流量通过,从而实现限速功能。通过CAR可以限制接口入和出两个方向流量的最大速率,同时还可以根据特定的数据特征来对特定的数据流进行速率控制,如针对数据的IP地址、端口号、优先级等。不符合条件的数据流设备将不进行限速处理,以端口原速率转发。
流分类
业务(服务)在网络中就是数据报文流,在提供业务的端对端的QoS前,需要对进入网络中的报文流进行分类和“标记”或“颜色”,以保证特殊的数据包能够得到区别的对待和处理。
流分类主要是根据报文中特定字段的值实现的。
IETF对IPv4的ToS字段和IPv6的流量类(Traffic Class)进行了定义,如下图所示。
数据包的分类使用IP报头中的DSCP进行标记,如下图所示。
报文分类是将报文划分为多个服务类,IP报头中DSCP域有6位,理论上可以支持64个服务类。在对报文进行分类后就可以使用QoS技术制定适当的通信流处理策略,如对于某个通信流等级的拥塞管理、带宽分配以及延迟限制。
对于MPLS报文,采用的是MPLS垫片(shim)中的Exp.字段,如下所示。
Exp.包括3个bit,支持8种不同的QoS优先级。MPLS域的LER在分类后将把Exp.域设置为相应的值,并在MPLS域中的LSR进行标签转发时将根据该值进行区别的对待。
使用分类策略进行报文分类时,应该基于组网情况和业务要求来进行。在网络边界的分类策略很灵活,可以根据报文的三层特性,可能是一个由五元组(源地址、源端口号、协议号、目的地址、目的端口号)确定的数据报文流,也可能是到某个网段的所有报文。
可以对分类后的报文设置IP包头的DSCP或MPLS垫片中的Exp.域,这种设置称为重标记。
进行重标记后,在后面的处理中就可以根据重新设置的DSCP或Exp.域作为分类的依据。下一跳处理(或转发)节点可以选择接受上一跳处理(或转发)节点的分类结果,也可以按照自己的分类策略重新对报文进行分类和重标记。
报文标记
报文标记通常用来建立其它QoS工具所依赖的信任边界。可以根据用户策略对不同的业务类型施加不同的标记,该标记可以作为下一级分类的标准,也可以由报文携带到其他设备。此外,路由器还可以根据流量监管的结果对报文重新标记,例如报文的降格处理等。
流量监管和流量整形
制定流量策略有利于QoS保证的实现,通过进行流量监管和整形应对进入某一网络的某个流的突发。
-
流量监管
使用CAR来限制某类报文的流量。CAR利用令牌桶(Token Bucket)进行流量控制,原理如下图所示。
先根据预先设置的匹配规则来对报文进行分类,如果是没有规定流量特性的报文,就直接继续发送,并不需要经过令牌桶的处理;如果是需要进行流量控制的报文,则会进入令牌桶中进行处理。
→ 如果令牌桶中有足够的令牌可以用来发送报文,则允许报文通过,报文可以被继续发送下去。
→ 如果令牌桶中的令牌不满足报文的发送条件,则报文被丢弃。这样就可以对某类报文的流量进行控制。
令牌桶按照用户设定的速度向桶中放置令牌,并且用户可以设置令牌桶的容量,当桶中令牌的量超出桶的容量的时候,令牌的量不再增加。当报文被令牌桶处理的时候,如果令牌桶中有足够的令牌可以用来发送报文,则报文可以通过,可以被继续发送,同时,令牌桶中的令牌量按报文的长度做相应的减少。当令牌桶中的令牌少到报文不能再发送时,报文被丢弃。
令牌桶是一个控制数据流量的很好的工具。当令牌桶中充满令牌的时候,桶中所有的令牌代表的报文都可以被发送,这样可以允许数据的突发性传输。当令牌桶中没有令牌的时候,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送,这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。
-
流量整形
流量整形(traffic shaping)典型作用是限制流出某一网络的某一连接的流量与突发,使这类报文以比较均匀的速度向外发送流量整形。通常使用缓冲区和令牌桶来完成,当报文的发送速度过快时,先在缓冲区进行缓存,之后在令牌桶的控制下再均匀地发送这些被缓冲的报文。
流量整形采用的技术叫做Generic Traffic Shaping(通用流量整形,简称GTS),可以对不规则或不符合预定流量特性的流量进行整形,以利于网络上下游之间的带宽匹配。
GTS与CAR一样均采用了令牌桶技术来控制流量,GTS与CAR的主要区别在于:利用CAR进行报文流量控制时对不符合流量特性的报文进行丢弃,而GTS对于不符合流量特性的报文则是进行缓冲减少了报文的丢弃,同时满足报文的流量特性。
GTS的基本处理过程如下图所示,其中用于缓存报文的队列称为GTS队列。
GTS可以对接口上指定的报文流或所有报文进行整形。当报文到来的时候,先对报文进行分类:
→ 如果报文不需要进行GTS处理,就继续发送不经过令牌桶的处理。
→ 如果报文需要进行GTS处理,则与令牌桶中的令牌进行比较,令牌桶按用户设定的速度向桶中放置令牌。如果令牌桶中有足够的令牌可以用来发送报文,则报文直接被继续发送下去,同时令牌桶中的令牌量按报文的长度做相应的减少,当令牌桶中的令牌少到报文不能再发送时,报文将被缓存入GTS队列中。
当GTS队列中有报文的时候,GTS按一定的周期从队列中取出报文进行发送。每次发送都会与令牌桶中的令牌数作比较。直到令牌桶中的令牌数减少到队列中的报文不能再发送或是队列中的报文全部发送完毕为止。
例如路由器A和路由器B相连为了减少报文的丢失,可以在路由器A的出口对报文进行GTS处理。对于超出GTS流量特性的报文将在路由器A中缓冲,当可以继续发送下一批报文时,GTS再从缓冲队列中取出报文进行发送。这样发往路由器B的报文将都符合路由器B的流量规定,从而减少报文在路由器B上的丢弃。相反如果不在路由器A的出口做GTS处理,则所有超出路由器A的CAR流量特性的报文将被路由器B丢弃。
拥塞管理
拥塞管理是指当网络发生拥塞情况时,转发设备对数据报文流进行管理和控制,以满足业务的服务质量要求。
当网络接口没有拥塞发生时,数据报文进入接口时就立即被发送出去。当数据报文到达速度大于接口处理报文的速度时,接口就会发生拥塞。接口的拥塞管理需要把到达的报文按优先级等原则分成不同的类,送入优先级不同的队列。队列调度处理对不同优先级的报文进行区别处理。
实现拥塞管理的有效处理方法是使用队列技术。拥塞管理的处理包括队列的创建、报文的分类、将报文送入不同的队列、队列调度等。不同的队列算法适用不同的场合,产生不同的拥塞管理效果。
目前广泛采用的队列技术主要包括:FIFO、PQ、CQ、WFQ、CBWFQ。
-
FIFO
FIFO队列不对报文进行分类,按报文到达接口的先后顺序让报文进入队列,同时,FIFO队列让报文按进队的顺序出队,先进的报文将先出队,后进的报文将后出队,如图9所示。
-
PQ
需要先对报文进行分类,再按报文的类别将报文送入PQ相应的队列。在报文出队列的时候,PQ先让高优先队列中的报文出队,直到高优先队列中的报文发送完,才发送中优先队列中的报文。同样直到发送完中优先队列中的报文,才能发送低优先队列的报文。
这样,分类时属于较高优先级队列的报文将会得到优先发送,而较低优先级的报文将会在发生拥塞时被较高优先级的报文抢先,使得关键业务的报文能够得到优先处理,非关键业务的报文在网络处理完关键业务后的空闲中得到处理。这样处理既保证了关键业务的优先,又充分利用了网络资源。
由于PQ总是保证高优先级的报文得到优先转发,所以当高优先级的流量过多时,可能会造成低优先级的流量没有转发机会,所以使用PQ时应该合理规划各个优先级的流量,适当限制高优先级的流量,使低优先级的流量也获得一定的发送机会。
由于IP包头的ToS字段的优先级位,包括MPLS垫片中的Exp.域,都支持最多达8个优先级,因此ZXR10实现的PQ支持4个优先级队列,这4个队列的优先级依次降低。PQ原理示意如下图所示。
-
CQ
CQ有17个队列,需要先对报文进行分类,将所有报文分成最多至17
类,再按照报文的类别将报文送入CQ相应的一个队列中。
0队列是最优先队列,CQ总是先把0号队列的报文发送完,才处理1到16号队列中的报文。1到16号队列可以按用户的定义分配自己能占用接口带宽的比例,在报文出队列的时候,CQ按定义的带宽比例分别从1到16号队列中取一定量的报文在接口上发送出去。
这样,就可以让不同业务的报文获得合理的带宽,从而既保证关键业务能获得较多的带宽,又不至于使非关键业务得不到带宽。
CQ虽然有自定义队列有优势,但缺点是一个等级内的服务(延迟)仍然是不可预期的。CQ队列示意如下图所示。
-
WFQ
对报文按照流分类,所以也称FBWFQ,具有相同的源IP地址、目的IP地址、源端口号、目的端口号的报文属于同一个流(有些TOS/DSCP也作为划分流的标准),每个流尽量对应一个队列。出队列是按照特定的权值进行调度,权值通过一定的算法实现,这样在公平的基础上对不同优先级的业务实现了区别对待。WFQ队列示意如图12所示。
-
CBWFQ
CBWFQ按照报文进入网络设备的端口、报文的协议、是否匹配ACL来对报文进行分类。每个流量类别对应一个队列,支持64个流量类别,不同类别的报文送入不同的队列。对于不匹配任何类别的报文,则被送入默认队列。队列采用WRR算法进行轮询。
可以为每个流量类别定制一定的传输特性,如带宽、传输权值、传输限制等。为一个队列指定的带宽通常是指在带宽拥塞时为该队列所保证的带宽。调度器按照分配给每个流量类别的权值保证每个队列分配到一定的带宽,可以对每个队列为每个流量类别设置长度限制,长度限制是在该类别队列中允许的最大分组数量。如果队列达到了长度限制,分组丢弃策略生效。CBWFQ可以和队尾丢弃、WRED等丢弃机制相结合。
这样,在端口不发生拥塞的情况下,可以使各个流量类别的报文能获得一定的带宽,在端口拥塞的情况下,又可以保证属于优先队列的报文不会占用超出规定的带宽,保护其他报文得到相应的带宽。
CBWFQ允许为分配给每个流量类别的带宽提供确定性的或"硬"的担保。对于高速链路或骨干网来说重点是带宽分配的硬性担保,CBWFQ是一种功能强大的QoS工具。CBWFQ队列示意如下图所示。
拥塞避免
网络拥塞会导致网络性能的降低和带宽得不到高效的使用,为了避免拥塞,队列可以通过丢弃数据包避免在任何可能的地方出现拥塞。
队列选择丢弃的策略包括:队尾丢弃(tail drop)、 RED、 WRED。
队尾丢弃(tail drop)
队尾丢弃是当队列缓冲区满后对后来需要入队列的数据包进行丢弃。
队尾丢弃可能引起“TCP全局同步”。报文丢弃是基于利用TCP通信流的适应性特性,通过丢弃数据包引发TCP的慢启动和拥塞避免机制来降低TCP传输速率。但是当队列同时丢弃多个TCP连接的报文时,这些TCP连接发向队列的报文将同时减少,使得发向队列的报文的量不及线路发送的速度,减少了线路带宽的利用。当开始同时重新发送时,会再次引起拥塞丢弃,导致网络波浪式的拥塞,即“TCP全局同步”,如下图所示。
RED
RED解决了简单丢弃引起的“TCP全局同步问题”。
RED算法通过对队列缓冲区的长度进行监视并对选定的数据包(以及选定的连接)执行早期丢弃,只有很少的TCP发送方会出现退回和重发的现象。RED丢弃策略如图15所示。
RED通过设置输出缓冲区的最小和最大队列长度阈值,网络设备随后在作出数据包转发决策的同时对这些阈值进行监视。数据包交换决策过程对平均队列长度进行检查:
→ 如果平均队列长度小于最小阈值,数据包将进入队列并与随后被交换。
→ 如果平均队列长度超过最小阈值而小于最大阈值,数据包将按照一定的概率被丢弃。
→ 如果平均队列长度超过了最大阈值,所有数据包都将被丢弃。
WRED
WRED将IP报头中的DSCP和RED结合起来,为优先通信流(高优先级)提供与标准通信流(优先级较低)有差别的丢弃阈值。换句话说,WRED根据IP报头中的DSCP对数据包进行有选择的丢弃。WRED策略实现的差别丢弃阈值如下图所示。
WRED监视网络设备中队列的平均长度,所以可以根据队列长度决定何时开始丢弃数据包。队列的平均长度是队列长度被低通滤波后的结果,既反映了队列的变化趋势,又对队列长度的突发变化不敏感,避免了对突发性的数据流造成不公正的待遇。
当平均队列长度超过用户规定的最小阈值时,WRED开始按照一定的概率丢弃数据包(包括TCP和UDP)。如果平均队列长度超过用户规定的最大阈值,则WRED转为队尾丢弃,即所有后面到达的数据包都将被丢弃。WRED的意图就是使将队列长度维持在最小和最大阈值之间的某个水平。