Qos初体验和基本理论
当我们了解一个新概念的时候往往要提前了解很多基础的概念,比如你要了解Qos,你可能需要提前学习Qos的工作流程、复杂封装、着色等等概念。我们完全可以先不去管这些概念,直接用起来,玩一玩,看看效果,主要目的是产生疑问,带着疑问去学习,接下来我们就尝试在windows利用qos对http的流量进行标识。
基础环境
注意:不要在windows 10/11上尝试,自己尝试多次并不生效,最好在windows server上
C:\Users\Administrator>IPCONFIG
Windows IP 配置
以太网适配器 Ethernet0:
连接特定的 DNS 后缀 . . . . . . . : localdomain
本地链接 IPv6 地址. . . . . . . . : fe80::4915:a662:dc50:f580%2
IPv4 地址 . . . . . . . . . . . . : 192.168.80.132
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.80.2
C:\Users\Administrator>
目标及思路
目标:对http的流量通过Qos进行标识。
思路:
- 先抓包看一下没有被QOS标识时http相关的字段,将抓包保存下来;
- 配置QOS对http进行标识
- 抓包验证和对比,并将数据包保存下来
配置步骤
未配置Qos之前的报文
上图当中的DSCP是啥意思?通过看上图,应该是个缩写,全称应该是Differentiated services codepoint,翻译成中文大概是”差异化服务代码点“,上图当中的值是默认的0。我们在这里面先不管IP首部当中的其它字段含义,但要保持疑问,等会我们操作完之后,Differentiated services codepoint会发生变化,我们注意观察就是了。
步骤
- gpedit.msc进入组策略
- 计算机配置
- windows配置
- 基于策略的Qos
- 新建策略
DSCP我们写入8,先不管是啥意思,先写上,后面我们慢慢解释。
配置QOS之后
- class selector 1 (8),注意这里面变成8了
- explicit congestion notification :显式拥塞通知
分析
大体工作流程
我们大胆猜测一个QOS在windows上的工作过程:
- 第一步是通过我们写的表达式式去匹配报文
- 第二步就是修改IP报文首部当中的DSCP也就差分服务点代码
- 第三步将数据报文发送出去
几个问题
- IP首部原有的字段叫差分服务字段,通过上图抓包可以看出来,整个字段有8位,分成了两个部分:
- 点了其中的6位
- ECN占了两位
- 我们设置的优先级真的会生效吗?
- 我们其实猜到,我们设置的数字8其实就是我们写的优先级,QOS就是通过ESCP字段来区分不同的业务或报文,然后不同的服务采取不同的策略。那我在电脑上这么设置完之后,沿途的路由器就真会按照我们设置的值来进行优先级转发?肯定不会的,为什么?因为如果真这么设置有效的,那各种PC游戏为了用户体验还不都得这么设置?我们通过抓取大型网络游戏的报文发现人家并没有设置,说明大概率我们这么设置的方法其实不会生效的。
- 怎么样才能使我们设置值会生效?
- 我们设置DSCP值的目的直接让沿途路由器的优先转发不太现实,为什么?人家运营商的链路凭什么优先转发你的流量 ?你又没有多交钱?我们大概可以推断出我们在这里设置这个值更多的其实为了让开启了QOS的路由器将我们的流量识别出来,识别出来之后才采取策略。
- 我们还可以推断出,我们不能仅仅在一台设置上做QOS,A通过B、C、给D传路由,结果只有B上开启了QOS,那根本没什么大用,必须沿途的路由器都开启之后,QOS策略才会真正的生效。
概念
QOS
我们看完实验之后,再来看几个前面提到过的概念,把基础概念搞明白,也是我们继续学下去的必要条件,如果人家问你如何实现QOS,你如果仅仅按照我们上面的实验去阐述的话,那就尴尬了,因为匹配某种流量然后修改优先级仅仅是QOS的一部分功能或一部分实现而已,如果你把上面所有的内容当成是QOS本身,就如同人家问你大象样子,你摸着大象的尾巴回答到:”大象是一条蛇的形状一样可笑!
QOS到底是什么?
QOS就是服务质量,我们要重点理解,QOS并不是一项协议,也不某个应用,而是一种描述,比如我们去餐馆,人家让我们评价一下服务质量,它包括多个方面,如果在餐馆当中那比如说有工作人员是否服务周到、用餐环境是否整洁、桌椅是否让人感到舒适,而QOS也包括多个方面,大概这么几个:丢包率、延迟、可用性、抖动等。
Quality of service (QoS) is the description or measurement of the overall performance of a service, such as a telephony or computer network, or a cloud computing service, particularly the performance seen by the users of the network. To quantitatively measure quality of service, several related aspects of the network service are often considered, such as packet loss, bit rate, throughput, transmission delay, availability, jitter, etc.
In the field of computer networking and other packet-switched telecommunication networks, quality of service refers to traffic prioritization and resource reservation control mechanisms rather than the achieved service quality. Quality of service is the ability to provide different priorities to different applications, users, or data flows, or to guarantee a certain level of performance to a data flow.
Quality of service is particularly important for the transport of traffic with special requirements. In particular, developers have introduced Voice over IP technology to allow computer networks to become as useful as telephone networks for audio conversations, as well as supporting new applications with even stricter network performance requirements.
- 服务质量 (QoS) 是对服务整体性能的描述或测量,例如电话或计算机网络,或云计算服务,特别是网络用户看到的性能。
- 为了定量测量服务质量,通常考虑网络服务的几个相关方面,例如丢包率、比特率、吞吐量、传输延迟、可用性、抖动等。在计算机网络和其他分组交换电信网络领域 ,服务质量是指流量优先级和资源预留控制机制,而不是所达到的服务质量。
- 服务质量是指能够为不同的应用程序、用户或数据流提供不同的优先级,或者保证数据流具有一定级别的性能。
- 服务质量对于具有特殊要求的流量传输尤为重要。 特别是,开发人员引入了 IP 语音技术,使计算机网络变得像电话网络一样用于音频对话,并支持具有更严格网络性能要求的新应用程序。
DiffServ与DSCP
DiffServ差分服务:
差分服务或 DiffServ 是一种计算机网络架构,它指定了一种机制,用于对网络流量进行分类和管理,并在现代 IP 网络上提供服务质量 (QoS)。
DSCP差分服务代码点:
差分服务其实是一种方法论或称之为一种模型,肯定有与之相对的非差分服务模型,那IP首部当中的DSCP(差分服务代表点)这仅仅是对差分服务模型的一部分体现而已,通过对不同的应用或报文设置不同的代码点来达到区分的目的。
OK,我们可以大概进行总结一下了,QOS服务质量有多种模型,我们就可以假定就两种模型,差分服务模型和非差分服务模型,在TCP/IP协议线通过DSCP差分服务代码点来体现差分模型,那整个结构就应该是这样:
- QOS
- 非差分服务模型
- 差分服务模型
- 在TCP/IP协议栈当中用DSCP体现
再探DiffServ
注意上图当中的区分服务字段就是区分服务模型当中的直接体现。
我们这一小节,再来看一看区分服务的历史,从一开始DiffServ就使用TCP/IP协议栈当中DSCP来体现吗?
- 其实一开始区分服务并不是直接使用DSCP的,而是使用TOS字段,TOS字段仅仅通过ip precedence(简称IPP优先级)子字段仅占了8位中3位,3位最多才能标识8种优先级,随着互联网发展不够用了,后来升级成为DSCP,占了8位当中的6位,能标识的优先级就很多了,2的6次方,也就是64个种类。
- DSCP是可以兼容过时的TOS的,原来TOS呆的地方就是现在的DSCP,即改名又升级。
- DS字段以极强的兼容性,超多的优先级,取代TOS字段,已经成为区分服务不可或缺的关键部分。
- IP-Precedence与TOS是什么关系?
TOS是整个字段的名字,而IP-Precedence是TOS里面子字段。 - DiffServ Field字段与DSCP是什么关系?
- 如上图所示,DiffServ Field是整个字段的名字,而DSCP是里面的子字段。
- DiffServ Field 与 TOS是什么关系?
- 很早之间IP首部当中体现差分服务的是TOS,只不过它不争气,后来此字段就直接更名为DiffServ Field并兼容TOS。
DiffServ工作原理
一组实现公共的、管理定义的 DiffServ 策略的路由器被称为DiffServ 域。
- DiffServ 不是根据单个流的要求来区分网络流量,而是根据流量分类的原则运行
- 然后将网络上的每个路由器配置为根据其类别区分流量。可以对每个流量类别进行不同的管理,确保优先处理网络上的高优先级流量。
- Diffserv 的前提是可以通过边缘路由器在网络边缘执行数据包分类和监管等复杂功能
- 根据数据包的标记对数据包进行 PHB 处理
- DiffServ 依赖于一种机制来将数据包分类并标记为属于特定类别。DiffServ 感知路由器实现每跳行为(PHB),它定义与一类流量关联的数据包转发属性。可以定义不同的 PHB 以提供例如低损耗或低延迟服务。
分类
我们最前面的实验就是对某种流量的分类,这没错,但这种分类是否生效是DS域当中的边界路由器说了算,因为在边界路由器也会再次进行分类,让客户端决定如何分类,那岂不是乱了套了!所以,必须在DS域当中的边界路由器当中进行分类,没分类的需要分类,已经被客户端进行分类的不算,还要再分类。
边界路由器可以检查传入数据包中的许多不同参数,例如源地址、目标地址或流量类型,并将各个数据包分配给特定的流量类别,这种分类叫做复杂流分类。边界路由器可以接受接收到的数据包中的任何 DiffServ 标记,也可以选择忽略或覆盖这些标记。为了严格控制给定类别中的流量和流量类型,网络运营商可以选择不接受 DiffServ 域入口处的标记。分类一般都是在路由器上做,我们前面的实验是在PC终端上做的复杂流分类,其实一般都是在域里面做,也就是多个开启QOS功能路由器组成的域。
上面我们体会了复杂的流分类(通过windows组策略图形界面做的),我们接着说一下简单的流分类,简单流分类其实指是的域内的其它路由器的行为,当报文从边界路由器上来我们做了复杂流分类之后,一般都会DSCP当中有所体现,那域内的其它路由器就根据DSCP当中值再进行分类就可以了,不需要再进行复杂流分类了。
行为PHB
- PHB(per-hop behaviors)单跳行为,PHB是DS节点作用于数据流的行为,注意这是行为,或称之为动作。
- 我们通过windows组策略当中的qos功能也可以修改这个值,修改值其实就是设置行为,路由器在根据类去设置行为时也是这么去做的。
- 网络管理员可以配置DSCP到PHB的映射关系,如果DS节点接收到一个报文,检查其DSCP,发现未定义PHB的映射,则DS节点将采用缺省PHB,即DSCP=000000,即best-effort(先进先出)进行转发处理,每个DS节点必须支持缺省PHB。
- 其中,class-selector phb是用来兼容TOS当中的IPP的
- expedited forwroding是快速转发,加速转发,一般语音流量
- assured forwarding php 确保能转发,但是不保证速度,保证一定的带宽,发生拥塞的时候根据af值进行丢弃;
通过上面这个图我们知道像class-selector phb这个字符是命名用的,真正在设备上体现或配置的时候还是要写数字的,比如说000代表default。上面这个图很有意思哈,六个比特,分成了两个部分,PHB的三种行为都体现在了前三个比特上,最后三个比特都被class selector占用了,这是因为最后三上字段要兼容比较旧的IPP,IPP是三个比特,为了兼容IPP,所以正好这里面也占用了3位。只有当最后三位全是0(前面的数随便变化),那整个ESCP才是class-selector phb。
我们如果不定义行为,在普通PC上抓到的包都是默认转发,如下所示:
PHB与加速
注意,PHB这种行为仅是打了一个ESCP的标记,并不是因为你打了这个标识就会给你加速,注意这仅仅是一个标记,是带有意义的标记,那怎么才能加速呢?加速实际上通过后面做的策略来实现的,当然我们在做策略的时候也会匹配我们做的PHB。我们可以这么理解,PHB是我们在做加速策略的前期条件。
class selector 类选择器
这个字段主要用来做兼容的,我们知道原来区域服务是通过TOS的IPP字段来体现的,后来才换成DSCP,现网当中仍然有部分老旧设备在使用旧的标准,那当旧的标识与新的标识联动时就会出现问题,你想呀,IPP(IP优先级)只能数到8,而DSCP只数到63,这怎么办呢?所以就出现了class selector ,其实就是在6当中拿出三位,用来兼容原本IPP占用的三位,这样就能很丝滑进行兼容了,下面是谷歌上的解释。
上图当中这个“class selector 1(8)” 是什么意思?
在 DiffServ 之前,IPv4 网络可以使用IPv4 标头的TOS字节中的IP 优先级字段来标记优先级流量。TOS 八位位组和 IP 优先级没有被广泛使用。IETF 同意将 TOS 八位字节重新用作 DiffServ 网络的 DS 字段。为了保持与仍然使用 Precedence 字段的网络设备的向后兼容性,DiffServ 定义了Class Selector PHB。
类选择器代码点的二进制形式为“xxx000”。前三位是 IP 优先级位。每个 IP 优先级值都可以映射到 DiffServ 类中。IP 优先级 0 映射到 CS0,IP 优先级 1 映射到 CS1,依此类推。如果从使用 IP 优先级标记的非 DiffServ 感知路由器接收到数据包,DiffServ 路由器仍然可以将编码理解为类选择器代码点。
RFC 4594 中给出了使用类选择器代码点的具体建议。
通过上图,你再来看下图,是不是感觉就容易理解多了
我们在windows直接改的就是DSCP,我修改的值是8,根据上面那上表,DSCP为8就代表是CS1,即class selector1,低优先级,正在与图中的对应。
映射
从A主机到B主机中间假如说要穿越三个区域,第一个区域是二层的、第二个区域是IP网络,第三个区域是MPLS网络,当边界设备根据分类做好行为之后,最终的终的体现是在报文里面,二层网络会在802.1p当中体现,那到IP网络之后呢?IP网络是要看DSCP的,而到MPLS网络要看EXP,所以在二层、三层、和MPLS当中都会一个字段来保留做QOS。那问题来 了,三种字段是位数是不一样的,如果我在二层里面让语音流量优先,到了三层不会出问题吗?毕竟层与层之间的位数都可能不同,所以为了应对这这种情况,就有了映射关系,二层的报文到达三层之后,或是三层到达MPLS之后,都要进行映射的转换,默认会有一个转换表。
service class和color
上图是边界设备从接入报文处理以及发出报文的流程,交换网板从中做区分。
- 当报文进入到边界路由器之后
- 边界路由器进行复杂流分类,一般都是通过acl进行
- 然后进行打标,即PHB,如果我们假定网络就是IP网段,最终会在DSCP当中体现出来
- 第四步才到上面这个图,打完标之后会进入到路由器的内部进行处理,怎么处理呢?排队,组成一个队列。既然是排队,有的排短,如果排长,那当拥塞出现的时候就必须得做一个取舍,所以它组成队列的同时也会进行不同的着色,当真的发生拥塞的时候优先丢弃红色的。
注意:队列中的值跟DSCP有点像,但不是哈,这一点要注意
上面四步是外部优先级到内部优先级的过程,那当从域内出去的时候会进入到外部优先级,这个时候会进行一个还原,如上图的中右半部分,这时候也需要一个映射,将已经着完色队列里面的内容重新还原成普通的报文发送出去。