当前位置:首页 > TCP/IP > 正文

【NE探秘】一个报文的路由器之旅 - (4) QoS基础

  • TCP/IP
  • 2022-10-13
  • 1955
  • 更新:2022-10-14 09:30:58

路由器的转发层面,涉及到简单流分类、复杂流分类、流量监管CAR、队列和缓存,这些都是QoS里的概念。因此,为了更好的理解这些概念,特此介绍QoS的基础知识。

QoS是Quality of Service(服务质量)的简称。

为什么需要QoS

通常,新商品刚出来时,用户和厂家不怎么关心质量问题。但出现了同类产品以后,用户就开始挑了,于是,商品就和质量挂钩了。IP网络也不例外。IP网络刚出现的时候,是“尽力而为”的,没有服务质量保证。你只知道报文发出去了,至于能不能到,什么时候到,就靠你运气了。这时的IP QOS,被称为“尽力而为”模型。

但随着技术的进步、竞争的加剧,客户的要求越来越高,IP网络提供有质量保证的服务是大势所趋。为此,出现了许多IP QoS服务模型,其中比较突出的有2种:集成服务(IntServ)模型和差分服务(DiffServ)模型。

集成服务模型

集成服务模型,要求用户要事先申请,声明想要什么样的服务,网络在资源满足的情况下,预留资源以满足该请求。就像旅游巴士一样,能保证每个人都有座位,但是有的车没坐满也照常开,座位空着就空着了。

而且,车辆服务方也要为此维护大量订车信息:

所以,集成服务模型从上世纪90年代中叶提出至今,没有在IP网络中商用过。目前IP网络广泛使用的是差分服务模型

差分服务模型

差分服务,其实就是将网络中的流量分成多个类,不同的类采用不同的处理。也就是说,先对流量分类,然后把类别标记在报文头中,通过报文携带到网络上,网络各节点只需要简单地识别报文中的这些标记,进行相应的处理。好比你去坐火车,火车票就是用来标记你所要享受的服务,是软卧、硬卧、硬座还是无座。火车票你随身携带,上车时你根据火车票进入对应的车厢,享受相应的服务:进入卧铺车厢的,可以舒服的躺着,进入硬座车厢,表示要坐着或站着。报文头里的那些标记就相当于“火车票”。

DSCP与PHB

DSCP和PHB是差分服务里两个很重要的概念。理解差分服务,先从这两个概括开始。

DSCP

前面说过,报文头里的那些标记就相当于“火车票”。那么,报文头有很多,二层的帧头、2.5层的MPLS头、3层的IP头,那些标记到底是标在哪层里呢?其实,每层都有标记,对应的标记分别被称为802.1P,EXP、DSCP。

为啥每个层都要有这个标记呢?因为报文在网络中传输,中间可能要经过二层以太网、MPLS网络、IP网络等,不同网络转发行为不一样,比如二层,网络节点只分析以太帧头,不会再去分析里面的MPLS头或IP头了。

除了802.1P,EXP、DSCP,书上说还有一种标报文头里的那些标记就相当于“火车票”记叫ToS,它又是虾米东东呢?其实,ToS也是IP头里的字段。IP头的经历也比较坎坷,最初,标准定义的IPv4报文头,并没有DSCP,而是有个8bit的ToS域,且前三位才是表示优先级的,即Precedence,一共才8种等级。

后来,标准重新定义了这个域,将保留位的其中一比特定义为C比特位,并将D、T、R和C共4个比特位称为ToS域。所以提ToS,得区分是哪个标准的。华为路由器遵从的是RFC 1349。

再后来,标准又重新定义了这个8比特,把前6位改名为DSCP。

PHB

PHB是Per Hop Behavior的缩写,即每跳行为,即设备对报文的处理。可能有人理解为PHB就是调度、丢包、监管、整形、重标记等动作,实际上不完全是,这些动作是设备具体的行为,而PHB只定义了一些外部可见的转发行为,并没有指定特定的实现方式。说白了,PHB就是将各种行为,概括成几类。就如同星级酒店的标准,可以有3、4、5这样的星级。RFC定义了四类标准的PHB,并用CS、EF、AF、BE这些符号来表示,每类PHB都对应一组DSCP。其实,PHB这样分类,是根据那些可见的服务特征,如时延、抖动或丢包率

CS、EF、AF、BE!没错,我们经常见到它们。

l BE,没有质量保证,一般对应于传统的IP分组投递服务,只关注可达性,其他方面不做任何要求。IP网络中,缺省的PHB就是BE。任何路由器都必须支持BE PHB。

l AF,代表带宽有保证、时延可控的服务,适用于视频、语音、企业VPN等业务 。

l EF,低时延、低抖动、低丢包率,对应于实际应用中的视频、语音、会议电视等实时业务。

l CS,因为现网有些存量设备不支持差分服务,只解析DSCP前3位,为了后向兼容,标准预留了所有格式为XXX000的DSCP值 ,这类值就对应为CS PHB。

可是,大家经常看到的是,AF带有后缀的,比如AF11、AF21等,CS也有CS6、CS7等,而BE、EF都不带后缀。这怎么回事呢?那是因为,BE和EF对应的只有唯一的一个DSCP值,CS和AF有多个DSCP值与之对应。例如AF,被细分为4个等级,且每个等级有3个丢弃优先级,其表达形式为:AF1x-AF4x(x代表丢弃优先级,取值为1-3)。

举个例子来说明AF怎么用。假设有4个小区的网络,接入到ISP的同一台边缘路由器。如果某个小区发送了大量的FTP数据,可能导致拥塞,干扰其他小区的FTP传输。为了公平,约定每个小区FTP总速率不能超过500Mbps。但有时他们可随意发送,甚至会超过1Gbps。怎么办呢?可以在每个入接口上(用CAR)监测FTP速率,并重标记报文的DSCP。如果速率小于等于500Mbps,标记为AF11,如果速率在500Mbps~1Gbps之间,标记为AF12,如果速率超过1Gbps,标记为AF13。当拥塞发生时,优先丢弃AF13,其次AF12,AF11就会在最后被丢弃。皆大欢喜。

PHB = 服务质量?

PHB体现的是等级的高低,而不是服务质量(QoS)的好坏,不能说CS的等级最高,服务质量最好;BE等级最低,质量最差。PHB只是逐跳行为,而服务质量是端到端的**。服务质量,通常用如下参数来衡量:
l 带宽/吞吐量

l 时延

l 时延变化(抖动)

l 丢包率

l 可用性

除了PHB,还有很多个因素会影响服务质量,例如链路带宽、设备处理性能、网络的稳定性、传输距离,……

PHB = 队列?

华为路由器上的队列名称,也叫BE、AF1、AF2、AF3、AF4、EF、CS6、CS7。是否就是PHB?

其实,队列不等同于PHB,即队列的名称不代表服务等级的高低。举个例子,假如某车厢是硬座车厢,一开始被称为“硬座”车厢,如果把该车厢里的座椅全改装成硬卧铺位,那么该车厢虽然叫“硬座”车厢,实际的PHB是“硬卧”。
队列也可以做类似改装,例如将BE队列配置为SP调度(当然一般不会这么做^_^),其余队列配置为WFQ调度,则BE队列的服务等级比其余7个都高,其PHB不再是BE了(SP、WFQ的概念下面的“队列机制”会介绍)。是不是已经很晕了,既然队列名称不代表PHB,那为啥要这么要跟PHB取相似的名字呢?其实,这是为了更方便、更直观看出各队列优先级的相对高低。这总比队列1、队列2、……队列8这样命名强一些吧。

如何根据DSCP入队列?

可能有人会有疑问,802.1P和EXP都是3比特,刚好8个值,对应8个PHB或8个队列,那DSCP有64个值,怎么和8个PHB/队列对应呢?这个是“简单流分类”考虑的事。

简单流分类(入映射与反映射)

简单流分类,其实一点都不简单。之说以叫“简单流分类”,是因为它的分类规则,相对于“复杂流分类”而言更简单而已。简单流分类,是采用简单的规则(例如,只根据IP报文的优先级标记字段,如IP的DSCP、MPLS的EXP或VLAN的802.1p),对报文进行粗略的分类。而复杂流分类,采用的分类规则稍微“复杂”一点,可以根据除了优先级标记之外的字段(例如,五元组,MAC、协议号、label、TTL等等),对报文进行精细的分类。

前面说过,差分服务是先分类,打标记,然后再进行各种PHB动作。然而,无论哪种流分类,都是根据报文头的字段进行的分类,而报文头的这些字段值需要解析报文才能获得。不可能每次QoS动作,比如入队列、丢包,调度出队等,都去解析报文头吧。

因此,设计师们想了个巧妙的办法:在设备内部为每个报文设置了两个内部标记:Service-Class和Color,对应服务等级(也称为调度优先级)和丢弃优先级。设备在解析报文头的时候,根据报文头的优先级来设置这两个内部标记。这样,设备在执行各种QoS动作时,读取这两个标记就行了。也就是说,设备的各种QoS动作都是围绕这两个内部标记进行的。

IP网络中,缺省的PHB就是BE, 所以这两个内部标记初始值设为<BE, Green>。初始化之后,如果入接口配置了trust upstream命令,则设备上行单板(接口入方向)解析报文时,会根据报文优先级,对照入映射表来重新设置<Service-Class, color>,这一过程称为“入映射” 。

如果对报文配置remark,或者car后remark,无论在入接口或出接口,设备都会去修改<Service-Class, color>。之后,设备根据<Service-Class, color>来对报文进行队列调度等一系列QoS动作。这些QoS动作做完之后,设备下行单板(接口出方向)还要做一个动作:根据内部优先级修改报文优先级,这个过程称为“反映射”。当然,反映射也是可选的配置,毕竟有些场景是不希望改变报文优先级的。

复杂流分类(流策略)

复杂流分类,可以采用复杂的规则,如由五元组,对报文进行精细的分类。分类之后,要和动作关联起来才有意义。将流分类和对应的流动作关联,就是流策略。流策略在配置上采用“模板化”方式,“模板化”的最大优点是可以节省配置,支持批量修改。

流策略“模板”分为三部分:

l 流分类(Classifier):用if-match语句设定流分类的匹配规则。

l 流动作(Behavior):定义针对该类流量实施的流动作,例如重标记、重定向、负载分担、报文分片、流量限速、流量统计等等。

l 流策略(Policy):将流分类Classifier和流动作Behavior关联,设置完毕后还需要应用到流量的入接口/出接口。

拥塞管理(队列机制)

除了流分类和标记,差分服务比较优秀的地方还有强大的队列技术。当网络拥塞,也就是进来的报文太多,设备处理不过来,就让报文排队。日常生活中,求大于供时,基本也用“排队”解决的。不过差分服务的队列技术比现实生活的强大多了。就拿医院排队挂号做例子吧,华为路由器每个端口都设有8个队列,相当于8个挂号窗口。

队列调度算法

对于同一个窗口,先来先服务,也就是先进先出FIFO(First In First Out)。但是对于设备的一个接口,同一时间只能处理一个队列,不像医院每个窗口都坐着一个人。也就是说,对于8个窗口,同一时间只有一人,那么哪些窗口的先处理呢?可以有很多“猫腻”――队列调度算法

比较著名的队列调度算法,比如严格优先调度SP( Strict Priority),相当于医院挂号处设一些VIP窗口,让一些腿脚不便的人能尽快办完,只有VIP窗口的办完了才办理其他窗口。如果哪天来一堆腿脚不便的,其他窗口就办不了了。所以路由器对于高优先级的队列,都限制了带宽,防止其他队列“饿死

其实,比较公平的做法是每个队列轮着来,即轮询调度RR(Round Robin)算法,但有些人一次挂几十个号,所以最好是每人每次限挂一个号。但是,这对一次挂好几个号的非常不方便了,轮一圈才挂一个号,那要挂几个号就得轮几圈才能办完,等的时间太长了。所以科学家又发明了一种算法,给队列设立权重。假设有3个非VIP队列,权重分别设为5:3:1,你多交点钱,到权重为5的队列去,一次给你挂5个号,很省事。这种算法很常用,叫加权公平队列WFQ( Weighted Fair Queuing)算法。

队列调度算法还有很多,不一一介绍了……(此处省略5万字),这是路由器比医院挂号机制强的地方。

拥塞避免(丢弃策略)

在医院,为了预防医生处理不完,就限定数量和时间,比如每天的挂号200个,而且限定早上7点11点,下午2点4点,其他时间不受理。而路由器处理的是网络报文,虽然路由器无时不刻地劳作,但网络突发性很强,经常拥塞,眼看着队列都快排到大门口了,怎么办呢?这时候,路由器就会动用他的秘笈――“丢包”策略。

目前有两种丢弃策略,一种是“尾丢弃”。“尾丢弃”就是在网络拥塞时把新到的报文丢弃。这么做有个问题,如果这些被丢的报文属于多个TCP连接,那这些TCP连接会同时减少发包,这样发往队列的报文将同时减少,而后它们又慢慢尝试增加发包数,于是又会在某个时间同时出现流量高峰……如此反复。 这就是著名的“TCP全局同步”现象。这可如何是好? TCP/IP两大传输协议(TCP和UDP)都得罪了,那还怎么玩?

没事,路由器拿出了飞机中的战斗机,另一种丢包策略――WRED( Weighted Random Early Detection,加权随机早期检测)技术。WRED原理很简单,就是为每个队列都画两条线,如下图。

当队列短,还没排到线,不丢报文;当排到线就开始随机丢掉一些新来的报文,队列越长,丢得越多;当排到红色线时,新来的都丢弃。

对于需要提供最大限度的带宽保证的业务,一般进入SP队里,建议采用尾丢弃,队列满了再丢,这样可以最大限度的保证其带宽。而WFQ队列,是按权重分享带宽,容易发生拥塞,采用WRED策略有效的避免了TCP全局同步现象
但是这样做,你可能还是感觉不是很公平。比如咱俩都在上网,我发了2M,你发200M,结果拥塞了,其实是你用得多导致拥塞的,应该先丢你的啊。为了解决这个问题了,科学家们又造出了一个词――丢弃优先级。IETF标准定义了三个丢弃优先级值,为了方便记忆,用红、黄、绿三种颜色来表示报文已经入队列后,拥塞时被丢弃的优先顺序。比如刚才的问题:你发2M我发200M,那就设置一个上限100M,你发的没超过,全是绿的,不会被丢弃,而我发的超过100M后,就将超过的那部分报文标红优先丢弃。

流量限速(CAR和流量整形)

流量限速也是QoS中的一个重要的概念。对于一台路由器而言,流量限速,是指限制进/出这台路由器的数据流的速率。

流量限速有两种技术,一种是CAR。另一种技术就是流量整形,同CAR一样,都采用令牌桶算法,但不同的是:流量整形是在队列机制里使用,用于限制某个或某些队列的输出速率,超速了就暂停输出,超速的报文暂时存在缓存里,等空闲了还是会输出,不被丢弃;而CAR与队列无关,CAR是没用到缓存的,超速的报文直接丢弃。

声明:本文素材来源于网络,仅供学习使用,如有侵权请联系网站删除(ngdcn_admin@163.com)。

有话要说...