1-智能QOS方案介绍

1. QOS是什么

在传统的 IP 网络中,所有的报文都被无区别的同等对待。即每个网络设备对所有的报文均采用 FIFO(First In First Out,先进先出)的策略进行处理,依照报文到达时间的先后次序分配所需的资源,尽最大的努力(Best-Effort)将报文送到目的地。

这种方式下,对报文传送的可靠性、传递延迟、丢包率等性能不能提供任何保证,仅适用于对服务性能不敏感的普通业务,如WWW、FTP、Email等。随着IP互联网上新型应用不断出现,对 IP 网络的服务质量提出新要求,如远程医疗、游戏、VOIP等,对实时性和连续性方面要求更加苛刻,如果报文传送延时太长将是用户无法接受的,这类应用中不能容忍中间停顿现象。

为支持具有不同服务需求的话音、视频以及数据等业务,要求网络能够区分出不同的业务类型,进而为之提供相应等级的服务。

QoS 正是这样一种可以为不同业务类型报文提供差分服务的技术,通过对网络流量进行调控,可避免并管理网络拥塞,减少报文丢包率。

2. 现有厂家的方案

小米:https://zhidao.baidu.com/question/439781106.html

image.png

华为荣耀:https://jingyan.baidu.com/article/414eccf64b65ba6b431f0a12.html

image.png

华为WS5200:

image.png

家用路由器的 QOS 功能基本是以几部分组成,总带宽的设置,根据应用优
先级设置,根据设备限速,网站过滤。

3. QOS原理

下面用简单的例子对比了在网络发生拥塞时报文在无QoS保证和有QoS保证网络中的不同处理过程。

下图所示为发生拥塞时网络设备的一个接口在不支持QoS的情况下报文的发送情况:
image.png

所有要从该接口输出的报文,按照到达的先后顺序进入接口的FIFO队列尾部。而接口在发送报文时从 FIFO 先入先出队列的头部开始依次发送报文。所有的报文在发送过程中没有任何区别也不对报文传送的质量提供任何保证。

既然上述的方式不好,那就对数据包进行优先级分类,下图为一个优先级队列进行 Qos 处理的过程:

image.png

在报文到达接口后,首先对报文进行分类,然后按照报文所属的类别让报文进入所属队列的尾部。

在报文发送时,按照优先级总是在所有优先级较高的队列中的报文,发送完毕后再发送低优先级队列中的报文。这样在每次发送报文时总是将优先级高的先发出去。保证了属于较高优先级队列的报文有较低的时延报文的丢失率和时延。这两个性能指标在网络拥塞时也可以有一定的保障。

从上面可以看出来,QOS的作用部分主要位于两个地方,一个就是队列入口的报文分类,需要把哪些报文放在优先级高,哪些在优先级低的;另一个就是出队列的调度算法,出队列的算法这部分现有很多可以选择的,下面进行说明。

因为调度算法的不同会有不同的类别划分形式,所以先从队列的调度算法选择说起,然后反过来规划类别

4. 队列调度算法选择

内核里面已经实现了很多种调度算法,根据需求来选择适合自己的算法。

image.png

下面列举几个常规的调度算法:

  • PFIFO:这个队列的特点就像它的名字一样——先进先出(FIFO),也就是说没有任何数据包被特殊处理,这也是默认的队列方式。
  • PRIO:PRIO QDisc 不能限制带宽,使用 PRIO QDisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。
  • CBQ:CBQ 是 Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。
  • HTB:HTB 是 Hierarchy Token Bucket 的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用 HTB 可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过 TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。
  • HFSC:HFSC - Hierarchical Fair Service Curve’s(层次公平服务曲线) 层次公平服务曲线。HFSC允许按比例分配频宽并且控制及分配延迟(latency)。这能够在只有一条实体网路连线的情况下,又快又好地同时提供频宽密集的资料传输服务及互动式服务。

最终选择 prio 配合 pfifo 和 hfsc 算法进行设计:

image.png

以 prio 做一个基础性的优先级调度分配,分成两个 band。

将一些比较直观性的功能如 ping,放到第一个 band,该级别的调度就按默认的 fifo 即可,让用户感知不出 ping 的延时,另外对于其他不需要经过 QOS 规则的链也直接走 fifo。

对于第二个 band 就用来存放各 qos 规则,使用 hfsc 调度算法

5. 等级制定

hfsc 算法要求设置总带宽,并且可以按类别设置,有如下四种服务:

  • rt : realtime service curve(即时服务)
  • ls : linkshare service curve(共享服务/百分比)
  • sc : rt+ls service curve(组合型)
  • ul : upperlimit service curve(上限值/带宽设置)

现有方案一共分了四个等级的队列,RealTime、Fast、Normal、Slow:

RealTime:为最高优先级,使用rt服务,设置最小/大带宽,分配延迟。(QOS是在带宽不够用时才有竞争一说,如果带宽主够没有被堵塞,完成可以都走实时)

Fast/Normal/Slow:下面三个等级就按带宽比例分配,使用 ls 服务。

(当然等级里面的配置信息是会根据应用需求进行调整的)

6. 规则制定/应用分类

上面将等级已经划分好之后,就可以根据应用需求将不同的应用放进相应的等级里面,目前基于端口/IP/包大小对应用进行分类。

  • 端口如:25/smtp,80/http,109/pop2,110/pop3,143/imap,
    443/https,465/smtps,993/imaps,995/pop3s
  • IP如:传输层的TCP/UDP,网络层的IP/ICMP等
  • 包大小:0-100、100-300、300-700、700-
1. 默认规则:

image.png

规则说明:

1、当四个队列全部有规则匹配时,则按上面的比例共享带宽。如总带宽 1000M,Class1=100M,Class2=700M,Class3=180M,Class4=20M

2、当有空闲的队列出现时,则空出的带宽按比例分配给剩余队列使用。如 Class3 和 Class4 的规则没有数据,则 Class1 和 Class2 按比例 10/70 进行分配带宽,Class1=125M,Class2=875M,Class3=0M,Class4=0M

3、如果 rl 分配到的比例带宽小于最小带宽,则以最小带宽为主如 Class1 分配的 10%的带宽,只有 10M,但是设置了最小带宽为 50M,则以 50M 为准。

2. 游戏优先:RT 的带宽设大,并保证时实时性,游戏进入 RT
3. 视频优先:Fast 带宽设大,视频进入 Fast
4. 网页优先:80/http,443/https 进入 Fast 队列