在传统的 IP 网络中,所有的报文都被无区别的同等对待。即每个网络设备对所有的报文均采用 FIFO(First In First Out,先进先出)的策略进行处理,依照报文到达时间的先后次序分配所需的资源,尽最大的努力(Best-Effort)将报文送到目的地。
这种方式下,对报文传送的可靠性、传递延迟、丢包率等性能不能提供任何保证,仅适用于对服务性能不敏感的普通业务,如WWW、FTP、Email等。随着IP互联网上新型应用不断出现,对 IP 网络的服务质量提出新要求,如远程医疗、游戏、VOIP等,对实时性和连续性方面要求更加苛刻,如果报文传送延时太长将是用户无法接受的,这类应用中不能容忍中间停顿现象。
为支持具有不同服务需求的话音、视频以及数据等业务,要求网络能够区分出不同的业务类型,进而为之提供相应等级的服务。
QoS 正是这样一种可以为不同业务类型报文提供差分服务的技术,通过对网络流量进行调控,可避免并管理网络拥塞,减少报文丢包率。
小米:https://zhidao.baidu.com/question/439781106.html
华为荣耀:https://jingyan.baidu.com/article/414eccf64b65ba6b431f0a12.html
华为WS5200:
家用路由器的 QOS 功能基本是以几部分组成,总带宽的设置,根据应用优
先级设置,根据设备限速,网站过滤。
下面用简单的例子对比了在网络发生拥塞时报文在无QoS保证和有QoS保证网络中的不同处理过程。
下图所示为发生拥塞时网络设备的一个接口在不支持QoS的情况下报文的发送情况:
所有要从该接口输出的报文,按照到达的先后顺序进入接口的FIFO队列尾部。而接口在发送报文时从 FIFO 先入先出队列的头部开始依次发送报文。所有的报文在发送过程中没有任何区别也不对报文传送的质量提供任何保证。
既然上述的方式不好,那就对数据包进行优先级分类,下图为一个优先级队列进行 Qos 处理的过程:
在报文到达接口后,首先对报文进行分类,然后按照报文所属的类别让报文进入所属队列的尾部。
在报文发送时,按照优先级总是在所有优先级较高的队列中的报文,发送完毕后再发送低优先级队列中的报文。这样在每次发送报文时总是将优先级高的先发出去。保证了属于较高优先级队列的报文有较低的时延报文的丢失率和时延。这两个性能指标在网络拥塞时也可以有一定的保障。
从上面可以看出来,QOS的作用部分主要位于两个地方,一个就是队列入口的报文分类,需要把哪些报文放在优先级高,哪些在优先级低的;另一个就是出队列的调度算法,出队列的算法这部分现有很多可以选择的,下面进行说明。
因为调度算法的不同会有不同的类别划分形式,所以先从队列的调度算法选择说起,然后反过来规划类别
内核里面已经实现了很多种调度算法,根据需求来选择适合自己的算法。
下面列举几个常规的调度算法:
最终选择 prio 配合 pfifo 和 hfsc 算法进行设计:
以 prio 做一个基础性的优先级调度分配,分成两个 band。
将一些比较直观性的功能如 ping,放到第一个 band,该级别的调度就按默认的 fifo 即可,让用户感知不出 ping 的延时,另外对于其他不需要经过 QOS 规则的链也直接走 fifo。
对于第二个 band 就用来存放各 qos 规则,使用 hfsc 调度算法
hfsc 算法要求设置总带宽,并且可以按类别设置,有如下四种服务:
现有方案一共分了四个等级的队列,RealTime、Fast、Normal、Slow:
RealTime:为最高优先级,使用rt服务,设置最小/大带宽,分配延迟。(QOS是在带宽不够用时才有竞争一说,如果带宽主够没有被堵塞,完成可以都走实时)
Fast/Normal/Slow:下面三个等级就按带宽比例分配,使用 ls 服务。
(当然等级里面的配置信息是会根据应用需求进行调整的)
上面将等级已经划分好之后,就可以根据应用需求将不同的应用放进相应的等级里面,目前基于端口/IP/包大小对应用进行分类。
规则说明:
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 为准。