在讲QOS服务质量之前,我们先说一下网络,网络本身提供一个让数据能通讯成功的服务。网络传输的基本服务标准是:流量先到先走。
由于网络的带宽是共享式的,就会导致网络延时的增加、丢包(包传输超时了,就会被丢弃)、抖动。
名词解释:
①延时:从源到目标消耗的总时间。有以下3种:
A、进程延时:设备处理数据必须消耗的时间。
B、队列延时:缓存区排队。
C、线路传播延时:电流在线路的传播时间,若网线质量差传播所花的时间越多。若双绞线受潮或者被曝晒,信号将会衰减,导致网速骤降。
降低延时的方案:
A、针对进程延时:让设备拥有更快的处理能力,CEF
B、针对队列延时:使用手工QOS,让在缓存区内优先传输重要的数据报文。
C、针对线路传播延时:升级链路,让链路的质量更好。
②带宽:取整段路径最小带宽。
③抖动:抖动的产生可能是丢包也可能不是丢包,比如说A发给B三个包,结果卡掉了一个。那么这个包就需要TCP重传,重传导致这个包比原来更晚。例如你在看网页,点了一下刷新,会刷一下,结果没过多久又来了个包,又刷新了一下。
我接下来要说的QOS,就是让数据在缓冲区排队的时候,给它做些文章,控制哪个流量先走,哪个流量后走。
④带宽争抢:
比如说,这张图上,4台PC都在上网,共享2M的带宽,假设他们都在打游戏,那么带宽消耗并不是很大,平均每人就是0.5M,现在还够用。
但现在PC3开始大流量的需求,比如说开迅雷、云盘等,就会发现PC3将会把PC0、PC1、PC2的流量抢走达到一个接近2M的带宽,导致PC0、PC1、PC2连0.5M都没有了。
接下来我们分析一下原因:
打游戏的时候流量是间歇性的,他们发出的数据包相互插插队,即使大家延时偶尔会增加,但都在一个可接受的范围内,这个网就还可以用。当PC3产生了连续性流量的需求时,其它电脑要发的数据包都挤不进去了,其它电脑的网络质量就会下降。
那么我们总结一下手工QOS的意义:
1、优先重要的数据报文,合理的限速。
2、限制具体的服务,例如:迅雷、QQ,淘宝、下载。
QOS有以下工具:
1、分类
2、标记
3、队列技术
4、监管和整形
5、丢弃机制
上述加粗字体是我接下来要讲的,红色字体表示使用QOS必备的工具。这些工具一般要组合使用,有以下几种组合方案:
方案一 | 方案二 | 方案三 | 方案四 |
---|---|---|---|
分类 队列 |
分类 标记 队列 |
分类 队列 监管、整形 |
分类 标记 队列 监管、整形 |
可以把丢弃机制在上述任意四种方案中进行增加。
分类就是说对收到的流量进行分类,对哪些流量先走,哪些流量后走进行分类。
有关分类技术有这些:ACL、NBAR
(1)ACL:
ACL只能针对数据流量,它可以基于二层的MAC、三层的IP或协议号、四层的端口号,来将流量进行分类。
但是对于应用层的流量,ACL是不好做策略的。
(2)NBAR:
对于应用层的流量,我们知道ACL不好做策略,因此有了NBAR。
NABR基于应用层进行数据过滤,例如QQ、迅雷、HTTP、DNS、某个网站等流量都可以。
将流量类别分好之后,确定了哪些流量先走,哪些流量后走,这就是在做策略,策略就是队列。它就是具体执行的,因此这个技术是QOS最核心的技术。
队列技术:PQ、CQ、FIFC、CBWFQ、FBWFQ、LLQ……
一般局域网不用来标记,因为QOS在边界路由器上做。流量在内部没有什么限制,它会在出去时进行限制。
需要标记的原因是因为:如果R1对流量实施了一些规则,我希望第二台路由器和第一台路由器实施一样的规则,第三台路由器和第二台路由器也实施一样的规则。如果没有标记行为也可以,但是就需要第二台路由器重新分类和重新队列,第三台也一样。
如果R1进行了标记,那么R2就可以基于标记的流量进行策略,这样就可以让网络中大量的设备方便实施相同的策略。
对于标记技术有这两个:PBR策略路由、CBMAKE。
这个机制我之后会详细讲解。
NBAR匹配应用层流量,应用层流量首先是不太好匹配的。对于二层、三层、四层只是一个报头,它是有标准格式的,里面每个参数是干嘛的,也是有明确指标的,因此想匹配还是比较好抓的。
而对于应用层流量(音乐、游戏、网页等等非标准格式流量),对于这种流量可以借鉴杀毒软件的思路(识别特征码,评估行为)进行。
NBAR也是通过识别特征码来进行对流量的分类。这个特征文件的后缀名为PDLM,这个PDLM可以在很多网站下到。至于PDLM文件如何给路由器,需要这个工具——TFTP服务器
我们首先可以使用CRT远程连接上路由器,然后输入以下命令:
我们将配置文件进行备份,通过TFTP协议发送给172.16.*
.*
的服务器,并对备份文件进行重命名。
之后要想找到该文件,可以到TFTP的根目录中直接查看到。
如果要想把某个文件发送给路由器,原理同刚才一样,先把某个文件放到TFTP的根目录,然后再进行拷贝。
我们可以使用以下命令查看路由器的flash装了些什么。
CORE#show flash:
综上:NBAR关注应用层流量,基于PDLM进行流量的匹配,PDLM是一个应用层流量的特征代码文件。
假设从互联网中下载一个关于bt的PDLM文档,名为bt.pdlm,需要将其加载到路由器或多层交换机中,使用TFTPserver,先将该文件放置于TFTP,然后下载到设备中。
//将PDLM加载到NBAR中
R1(config)#ip nbar pdlm flash://bt.pdlm
//创建分类列表
R1(config)#class-map bt
//匹配协议、bt。这个一般不是单配的,而是在做标记顺便带进去的,这里配置只是进行示例。
//每台设备实际上支持一些协议,例如:pop、pppoe、IPv6等,可以用?显示出来。但是不够我们使用,需要自己下载相关pdlm文件。
R1(config-cmap)#match protocol bt
//扩展示例:
R1(config)#class-map ccie
R1(config-cmap)#match protocol http url www.taobao.com
R1(config-cmap)#match protocol http mime *.jpg
默认http流量均基于80端口进行限制,若设备上的httpserver是基于非80端口工作。
//基于8080 端口处理http流量
R1(config)#ip nbar port-map http tcp 80 8080
标记的目的就是为了整个网络方便实施相同的策略,这个标记如果没有进行修改,会一直存在下去。
在IPv4中的 服务类型 和IPv6中的 分类表 的服务类型字段都是做标记用的。它们的报头中均存在TOS服务类型字段,在IPv4中的TOS字段存在8位,但只使用6位。
优先级仅取TOS的前3位,也就是8个数,0-7。这也就意味着总共有8个优先级,数值越高优先级越高。
流量 | 优先级别 |
---|---|
默认普通流量 | 0 |
VOIP语言流量 | 5 |
控制层面流量 | 6 |
由于上述优先级数量太少,导致我们优先级不够用,因此有了DSCP差分服务代码。它使用TOS的前6位,也就是64个数,0-63。差分服务代码可以兼容优先级。
我们想想DSCP使用TOS的前6位,但是优先级只能看到TOS的前3位,为了使DSCP兼容优先级,它使用了以下系列。
系列 | 数值 |
---|---|
默认系列 | 全0 |
CS系列 (类的区分器) |
仅使用前3位,cs1-cs7对应7个优先级。 |
AF系列 (确保转发) |
分了12类 |
EF系列 | 固定值为46对应优先级中的5默认均标记语言流量。 |
如果不想考虑兼容性,可以直接使用0-63这些数字标注优先级。
上面说的都是3层标记,现在说的是二层。
正常以太网的二层包,是不存在任何可标记的地方(目标MAC、原MAC、类型号),因此如果需要进行二层标记需要在以下封装中进行标记。
(1)以太网中只能在802.1Q或ISL封装中进行标记,3位8个优先级。修改优先级后的802.1q被称为802.1p
(2)帧中继的数据帧中存在DE位(合法丢弃位)为0,标示在拥塞时优先丢弃。
(3)MPLS中存在EXP(试验位,试验位共3位存在8个优先级)
路由策略:通过干涉控制层面流量来影响路由表。就是说决定目标怎么去,但不能决顶具体的源流量怎么走。
策略路由:通过干涉数据层面流量转发,同时可以实现对IPv4报头的优先级进行标记。
比如说下面这张图,让R1的1.0环回pingR3的3.0环回的时候走上面,R1的2.0环回pingR3的3.0环回走下面。
对于这种情况只有策略路由才可以做到,而对于路由策略改来改去无非只有三种情况,要么都走上、要么都走下,要么等开销负载均衡。
PBR就是将Route-map直接调用到接口上的应用,凌驾于路由表之上,当存在PBR时,流量按PBR要求进行转发,而不查看路由表。注意,必须调用于数据层面的入口,对于未定义Route-map的流量,将基于路由表正常转发。
例:
接下来我们用上图详细来说配置:
我们要求1.1.1.1 ping 5.5.5.5 走上面,而1.1.2.1 ping 5.5.5.5走下面。我们之前说过PBR策略路由必须调用于数据层面的入口上,因此我们需要在R2进行策略。
A、首先抓流量:
只能使用ACL扩展列表。因为只有ACL可以将源、目,目标同时写。
R2(config)#access-list 100 permit ip host 1.1.1.1 host 5.5.5.5
R2(config)#access-list 101 permit ip host 1.1.2.1 host 5.5.5.5
B、定制Route-map:
Route-map不制作空表,未定义Route-map中流量,将基于路由表正常转发。
//名字为pbr
R2(config)#route-map pbr permit 10
R2(config-route-map)#match ip address 100
//选择走出接口,
R2(config-route-map)#set int f1/0
R2(config)#route-map pbr permit 20
R2(config-route-map)#match ip address 101
//选择下一跳为24.1.1.2
R2(config-route-map)#set ip next-hop 24.1.1.2
C、入接口调用:
R2(config)#int f0/0
R2(config-if)#ip policy route-map pbr
之后可以使用Tracer Route来进行验证流量的去向。
PBR本身用于干涉数据层面流量走向,同时可以兼职用于修改IPv4报头中的优先级。
还是这张图,上面那张图已经实现了1.1.1.1/24访问5.5.5.5/24走上面,那么我们对上面经过R3的流量进行标记。同理,我们需要先抓取流量,之后定制Route-map,最后在R3的入向接口进行调用。
//使用扩展ACL抓取
R3(config)#access-list 100 permit icmp host 1.1.1.1 host 5.5.5.5
//定制Route-map,名字为xx
R3(config)#route-map xx permit 10
R3(config-route-map)#match ip address 100
//标记它的优先级为4
R3(config-route-map)#set ip precedence 4
R3(config)#int f0/0
R3(config-if)#ip policy route-map xx
要想验证数据包是否被标记可以使用抓包工具,但这种验证方法,R3将流量进行标记之后,需要在R3~R4之间的链路进行抓包,在链路上抓包就很困难了。
要想验证流量是否被标记,可以在R4上做一个ACL,抓取从 1.1.1.1 ping 5.5.5.5 的ping包。
//抓取1.1.1.1 ping 4.4.4.4的 ping 包,并且保证优先级是4
R4(config)#access-list 100 permit icmp host 1.1.1.1 host 4.4.4.4 precedence 4
//打开debug,动态查看表100里面的数据。若显示,表名成功抓取。
R4#debug ip packet 100
//关闭debug
R4#un all
CBMARK专门用于标记各种流量,可以标记于二层、三层、四层。CBMARK是一种全新的命令配置模式,基于MQC模式化配置。用于各处标记参数,一定是在数据层面方向上调用。
模块化配置:后一张表将关联前一张表
配置分为3步:
(1)定义感兴趣流量:
R4(config)#ip access-list extended ccie
R4(config-ext-nacl)#permit icmp host 1.1.1.1 host 5.5.5.5
R4(config)#ip access-list extended ccnp
R4(config-ext-nacl)#permit icmp host 1.1.2.1 host 5.5.5.5
(2)定制分类列表:
R4(config)#class-map ccie
R4(config-cmap)#match access-group name ccie
R4(config)#class-map ccnp
R4(config-cmap)#match access-group name ccnp
(3)创建策略表:
//创建名为cbmark的策略表
R4(config)#policy-map cbmark
R4(config-pmap)#class ccie
R4(config-pmap-c)#set precedence 4
R4(config-pmap)#class ccnp
R4(config-pmap-c)#set dscp af11
(4)接口调用:
R4(config#int f0/0
R4(config-if)#service-policy output cbmark
队列技术有很多,这里只讲一下CBWFQ,该队列技术也是基于MQC配置。它的主要意义在于限制带宽。
这里举个例子吧:
比如说一个学校,有两个教室,假设A、B俩教室。
A教室使用172.16.10.0/24网段,老师的IP为172.16.10.253
B教室使用172.16.20.0/24网段,老师的IP为172.16.20.253
除上述教室外,还存在办公室,办公室使用的网段为172.16.30.0/24,最后加上服务器172.16.40.250/24
该学校拉了一根企业级宽带共20M:
用户 | 要求 |
---|---|
老师 | 下载为8M,上传6M |
学生 | 下载只有2M,上传0.5M,但是禁止BT(下载)行为,且每天的9:30-12:00、13:30-16:00期间是不可以上网的。 |
办公用户 | 办公下载6M,上传3.5M,不可以有BT行为,不可以访问:www.taobao.com。Server 下载4M,上传10M |
1、下载配置:
(1)抓流量:
R1(config)#ip access-list extended laoshix
R1(config-ext-nacl)#permit ip any host 172.16.10.253
R1(config-ext-nacl)#permit ip any host 172.16.20.253
R1(config)#ip access-list extended xueshengx
R1(config-ext-nacl)#deny ip any host 172.16.10.253
R1(config-ext-nacl)#deny ip any host 172.16.20.253
R1(config-ext-nacl)#permit ip any 172.16.10.0 0.0.0.255
R1(config)#ip access-list extended bangongx
R1(config-ext-nacl)#permit ip any 172.16.30.0 0.0.0.255
R1(config)#ip access-list extended httpx
R1(config-ext-nacl)#permit ip any 172.16.40.250 0.0.0.255
(2)分类:
上面抓了四部分的流量,然后进行分类,因此也要分为四部分。
R1(config)#class-map laoshix
R1(config-cmap)#match access-group name laoshix
R1(config)#class-map xueshengx
R1(config-cmap)#match access-group name xueshengx
R1(config)#class-map bangongx
R1(config-cmap)#match access-group name bangongx
R1(config)#class-map httpx
R1(config-cmap)#match access-group name httpx
(3)策略——CBWFQ直接设置带宽:
CBWFQ:可分为64个类别,存在65个队伍,前64个队伍装载64种分类,第65个队伍装载未分类的流量调度机制,为每个类别的流量分配相对应的带宽。
需要注意的是,调用时的物理链路应该要满足带宽要求。
R1(config)#policy-map xuexiaox
R1(config-pmap)#class laoshix
R1(config-pmap-c)#bandwidth 8000
R1(config-pmap)#class xueshengx
R1(config-pmap-c)#bandwidth 2000
R1(config-pmap)#class bangongx
R1(config-pmap-c)#bandwidth 6000
R1(config-pmap)#class httpx
R1(config-pmap-c)#bandwidth 4000
(4)调用:
调用在路由器的进接口或者出接口。
R1(config)#int f0/0
//注意方向,output是内网(出去后进入内网),input是外网(从外边进来)
R1(config-if)#service-policy output xuexiaox
2、上传配置:
(1)抓流量:
R1(config)#ip access-list extended laoshis
R1(config-ext-nacl)#permit ip host 172.16.10.253 any
R1(config-ext-nacl)#permit ip host 172.16.20.253 any
R1(config)#ip access-list extended xueshengs
R1(config-ext-nacl)#deny ip host 172.16.10.253 any
R1(config-ext-nacl)#deny ip host 172.16.20.253 any
R1(config-ext-nacl)#permit ip 172.16.10.0 0.0.0.255 any
R1(config-ext-nacl)#permit ip 172.16.20.0 0.0.0.255 any
R1(config)#ip access-list extended bangongs
R1(config-ext-nacl)#permit ip 172.16.30.0 0.0.0.255 any
R1(config)#ip access-list extended https
R1(config-ext-nacl)#permit ip 172.16.40.0 0.0.0.255 any
(2)分类:
学生流量有两类:BT流量、非BT流量。
办公流量有三类:BT流量、非BT流量,www.taobao.com的流量。
服务器流量一类、老师流量一类。
R1(config)#class-map laoshis
R1(config-cmap)#match access-group name laoshis
R1(config)#class-map https
R1(config-cmap)#match access-group name https
R1(config)#class-map xueshengbt
R1(config-cmap)#match access-group name xueshengs
//在匹配PDLM文档。
R1(config-cmap)#match protocol bt
R1(config)#class-map xueshengs
R1(config-cmap)#match access-group name xueshengs
R1(config)#class-map bangongbt
R1(config-cmap)#match access-group name bangongs
R1(config-cmap)#match protocol bt
R1(config)#class-map bangonghttp
R1(config-cmap)#match access-group name bangongs
R1(config-cmap)#match protocol http url www.taobao.com
R1(config)#class-map bangongs
R1(config-cmap)#match access-group name bangongs
(3)策略:
R1(config)#policy-map xuexiaos
R1(config-pmap)#class laoshis
R1(config-pmap-c)#bandwidth 6000
R1(config-pmap)#class server
R1(config-pmap-c)#bandwidth 10000
R1(config-pmap)#class xueshengbt
R1(config-pmap-c)#drop
R1(config-pmap)#class xueshengs
R1(config-pmap-c)#bandwidth 500
R1(config-pmap)#class bangongbt
R1(config-pmap-c)#drop
R1(config-pmap)#class bangonghttp
R1(config-pmap-c)#drop
R1(config-pmap)#class bangongs
R1(config-pmap-c)#bandwidth 3500
(4)调用:
R1(config)#int f0/0
//注意方向,对于上传input是内网(出去后进入互联网),output出向调用。
R1(config-if)#service-policy output xuexiaos
(5)上网时间管理:使用基于时间的ACL
//创建名叫xuesheng的time-range
R1(config)#time-range xuesheng
//先设置这个列表生效的总时间,一般为多少年。如果不配置,则该列表永久生效。
R1(config-time-range)#absolute start 12:00 1 aug 2019 end 12:00 1 aug 2020
//周期时间设定
R1(config-time-range)#periodic daily 9:30 to 12:00
R1(config-time-range)#periodic daily 13:30 to 16:00
//制作ACL
R1(config)#ip access-list extended xueshengtime
R1(config-ext-nacl)#permit ip host 172.16.10.253 any
R1(config-ext-nacl)#permit ip host 172.16.20.253 any
R1(config-ext-nacl)#deny ip 172.16.10.0 0.0.0.255 any time-range xuesheng
R1(config-ext-nacl)#deny ip 172.16.20.0 0.0.0.255 any
time-range xuesheng
R1(config-ext-nacl)#permit ip any any
上述没有用到标记,如果再有一个R2要和R1实现相同的策略,那么就要用到标记了。
R1(config)#policy-map xuexiaox
R1(config-pmap)#class laoshix
R1(config-pmap-c)#bandwidth 8000
//使用CBMARK为该分类进行标记
R1(config-pmap-c)#set dscp af11
R1(config-pmap)#class xueshengx
R1(config-pmap-c)#bandwidth 2000
R1(config-pmap-c)#set dscp af12
R1(config-pmap)#class bangongx
R1(config-pmap-c)#bandwidth 6000
R1(config-pmap-c)#set dscp af13
R1(config-pmap)#class httpx
R1(config-pmap-c)#bandwidth 4000
R1(config-pmap-c)#set dscp af14
之后第二台设备,不抓了,然后基于标记分类。
R1(config-pmap)#class-map laoshix
R1(config-pmap-c)#set dscp af11
R1(config-pmap)#class-map xueshengx
R1(config-pmap-c)#set dscp af12
R1(config-pmap)#class-map bangongx
R1(config-pmap-c)#set dscp af13
R1(config-pmap)#class-map httpx
R1(config-pmap-c)#set dscp af14
之后R2再做策略,调整带宽即可。之后的R3、R4、R5都是这么做,它们可以直接复制粘贴一个策略表。
假设,R1首先发1个包给R2,R2收到包之后进行确认。第二次R1发给R2十个包,R2收到包之后进行确认。它们之间的网速是慢启动,可以看到网速随着时间的变化而不断地上升。等R2已经达到所能收包的最大值时,R1还并不清楚R2还能接收多少,R1会继续增大。
多出R2所能承受的能力时,R1那部分发出的包将会被丢弃,之后这些被丢弃的包将再次被重传。此时R1便知道了R2所能接受最大的包的数量。R1之后便会减少发送包的数量,那么网速将会下降。
上图中,我们就会认为此时带宽的瓶颈就是蓝颜色线条。但是,在网速下降之后,路由还会不断地增加发包数量,来试探整个网络地最大带宽。
之后如此反复循环,不断测试网络最大带宽,保持这种状态。之所以这么做,是因为我们不知道现在地传输能力就是永远的传输能力,它需要不断地去尝试。
而它的实际带宽可能介于波峰与波谷之间,慢启动导致的带宽利用率相对要低一些。期间是在不停的丢弃包,这种机制叫做尾丢,它是默认的丢弃机制,带宽的利用率低。
RED丢弃机制:随机原始检测,默认阀值为32到40之间,数据传输量处于32到40间时,将及逆行随机丢弃,每个数据包的丢弃概率为10%,大于40绝对丢弃,以此来延缓被动丢包的周期时长,提高链路的利用率。
在第一次到达发送数据包顶峰(假设为50)降下来之后,第二次便会丢10%的包来减缓传输速度的快速增长。之后传输速度的加速度被降低了,当再次到达顶峰下来之后,再传输的时候会再次丢几个包。用图片来描述就是这个样子:
其实就是拉长了上下时间的总幅度,提高了时间的利用率,虽然挑战最高峰被打下来了,但还是会比之前的高。
WRED:基于不同的优先级数据包存在不同的阀值,目前的IOS默认支持WRED。
R2(config)#int f0/0
//在调用了QOS的接口上配置
R2(config-if)#random-detect
R2#show queueing random-detect
R2(config)#int f0/0
//7优先级,35最小阀值,40最大阀值,10为分母。
R2(config-if)#random-detect precedence 7 35 40 10
缺点:
1、仅支持TCP、优先级
2、不支持CBWFQ