ROS防火墙与服务质量.docx
- 文档编号:30037871
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:81
- 大小:835.35KB
ROS防火墙与服务质量.docx
《ROS防火墙与服务质量.docx》由会员分享,可在线阅读,更多相关《ROS防火墙与服务质量.docx(81页珍藏版)》请在冰豆网上搜索。
ROS防火墙与服务质量
带宽控制
总论
摘要
带宽控制是一组用于控制数据率分配、延迟变化、及时传输和确保传递可靠性的机制。
MikroTik的RouterOS支持以下的排队规则:
∙PFIFO–包先进先出
∙BFIFO–字节先进先出
∙SFQ-随机公平队列
∙RED–随机早期检测
∙PCQ–每个连接排队
∙HTB–分层令牌桶
技术要求
所需安装包:
system
所需许可:
Level1(limitedto1queue),Level3
子菜单级别:
/queue
技术规范:
None
硬件使用:
significant
描述
服务质量(QoS)指路由器应该优化和整形网络流量。
服务质量不像有关限制那样,而是为网络用户提供更多优质的服务。
下面列出了MikroTik的RouterOS流量控制机制的部分功能:
∙限制确定的IP地址、子网、协议、端口和其它参数的速率
∙限制点对点的流量
∙设置一些包流量优先别的包
∙使用队列突发加快web浏览速度
∙定时应用队列。
∙共享可用流量做到用户平等或负载均衡
该队列应用于通过实体接口离开路由器的数据包(即,队列应用于相关数据流的输出接口),或任何一个3个辅助的虚拟接口(global-in,global-out,global-total)
QoS依靠丢弃包来执行。
TCP协议的情况下,被丢弃的数据包将会不满一个慢的速率,因此无需担心因整形而失去TCP的一些信息。
用来描述网络应用程序的服务质量水平的主要条件是:
∙qdisc(队列规则)–保存并保留一个数据包队列的算法。
它累计数据包,并决定输出数据包顺序(这意味着排队规则可以对数据包进行重新排序)。
Qdisc还决定在没有空间的情况下丢弃哪些数据包。
∙CIR(忠于信息速率)-保证数据速率。
这意味着流通率不超过此值应始终送达
∙MIR(最大信息率)-将提供最大数据速率路由
∙Priority–什么样的数据流将按重要的顺序处理。
您可以给一些数据流设定优先级,以便在其它一些数据流前处理
∙ContentionRatio-所定义的数据速率是用户间共享(当某一数据传输率分配到多个用户时)的比率。
它是将一些用户集合在一起而进行单个的速度限制。
例如,1:
4的争用速率(contentionratio)意味着只是4个用户之间共享已分配的数据速率
通过接口发送数据前,它被排队规则(qdisc)处理。
每个接口仅一个排队规则,默认情况下,每个物理接口在/queueinterface下设置队列规则(虚拟接口没有定义排队规则)。
一旦我们将第一个队列(在/queuetree或/queuesimple里)添加到一个物理接口,接口默认队列被该队列的HTB层次结构替换,但一个在/queueinterface中为该特定的接口的定义,不再起作用。
qdiscs计划和整形
我们可以将排队规则分类,由分类器来影响包流量:
∙计划-排队规则只重新安排数据包的算法和丢弃数据包而并不组装数据包。
计划程序排队规则是:
BFIFO,PFIFO,SFQ,PCQ(计划程序和整形机),RED
∙整形–整形排队规则同样还执行限制功能。
整形有PCQ(计划程序和整形机)和HTB
虚拟接口
在RouterOS中,除实际接口外,有3个虚拟接口:
∙global-in-通常代表所有输入的接口(入口队列)。
请注意附加到global-in的队列,适用于在数据包筛选之前接收路由器的数据流。
global-in队列执行在mangle和dst-nat之后
∙global-out-通常表示所有输出的接口(出口队列)。
队列附加到一个特定的接口之前队列附加到的应用
∙global-total-表示一个经历路由器通过所有数据的虚拟接口。
当附加一个qdisc到global-total时,限制是在两个方向。
例如,如果我们设置total-max-limit为256000,我们将得到上传+下载=256kbps(最大)
HTB导论
HTB(层次令牌桶)是一个有益于排队规则的总分类,它基于类采用不同的方法来处理不同类型的数据流。
这种队列依靠主要层次令牌桶(HTB)附加在/queuesimple和/queuetree中。
例如,您可以给一个工作组设置最高的数据传输率,然后在该工作组的成员之间分发数据流
HTB队列规则详解:
HTB项目:
∙filter(过滤器)-对包进行分类的程序。
filter负责数据包的分类,以使他们都放入相应的队列规则。
所有filter应用于HTB的根和直接进入qdiscs分类数据包,而不遍历HTB树。
如果一个数据包,不分类为qdiscs的任何一种,它将穿越HTB直接发送出接口,所以没有HTB规则将应用于那些数据包(它表示比HTB管理的任何数据包流优先级更有效)。
∙level(层)–类在层次结构中的位置。
∙class(类)–限制数据流到某一速率的算法。
它并不存储任何的数据包(此功能只能执行于队列)。
类可能包含一个或多个子类(innerclass)或唯一一个qdisc(leafclass)。
∙innerclass(内部类)-具有一个或多个子类附加到它的类。
由于innerclasses不存储任何数据包,qdiscs不可以附加到他们(因此,他们的qdisc和filter设置被忽略,虽然可能仍会显示在RouterOS配置中),所以他们只做数据流整形。
优先级设置也会被忽略。
∙leafclass(叶类)-有父级,但没有子类的所有类。
Leafclasses始终位于层次结构level0。
每个leafclass有且只有一个qdisc用某一优先级附加到它。
∙selffeed(自馈)-各类活动在其所在的层次结构层的数据包出口(源自HTB树,至接口)。
每个level(层)有一个selffeed,并由8个selfslots组成代表优先级。
∙selfslot(自槽)-是selffeed的元素,对应于每个特定的优先级。
每级的每个优先级有一个selfslot。
作用在同一level(层)具有相同优先级的所有类附加到一个selfslot,通过使用它发送出数据包。
∙activeclass(活动类)(在某个特定层)-在给定的层附加到selfslot上的类。
∙innerfeed(内馈)-类似于selffeed对象,它由innerselfslot组成,存在于各自innerclass中,每个innerclass有一个innerfeed。
∙innerfeedslot(内馈槽)-类似于selfslot。
每个innerfeed由innerslots组成,代表一个优先级。
每个类有一个父类并可能有一个或多个子类。
没有子类的类,放在level0,队列保留并调用leafclasses。
每个层次结构中的类能够优化和整形数据流。
有两个主要的参数引用到整形,有一个列入优先:
∙limit-at–保障一个类的标准速率(CIR)
∙max-limit–一个类能达到的最大速率(MIR)
∙priority-在同一level(层)下,类服务的次序(8是最低优先级,1为最高)
每个HTB类依赖占用的数据速率可以是下列3状态之一:
∙green(绿色)-类的实际速率等于或低于limit-at时。
这种状态下,这个类在它的level上附加到相应的优先级,可满足其CIR限制,而不管其父类的任何限制。
例如,如果我们有一叶类,其limit-at=512000且其父有max-limit=limit-at=128000,该类仍会得到512kbps!
在相同层的所有MIRs和更高层的任何限制前,首先满足特定层的所有CIRs。
∙yellow(黄色)-类的实际速率大于limit-at,且等于或小于max-limit(或burst-limit,如果突发限制处于活动状态)。
在这种情况,如其父类为绿色状态,类将附加到其父类innerfeed相同优先级的innerslot上;如父类也是黄色的,依次,可能附加到父类的父类相同的优先级的innerslot。
过渡到这种状态,类从它所在层的selffeed断开并连接到其父的innerfeed。
∙red(红色)-类的实际速度超过max-limit(orburst-limit如果突发处于活动状态)。
这个类不能借用其父类的速率。
注:
像CIRs总是先于MIRs或更高层其他限制的考量之前得到满足一样,您应该始终确保任何innerclass的limit-at属性等于或大于其子类的所有limit-at参数的和。
Priorities(优先级)
发送数据包可能发生的情况是,HTB查询其所有selfslots的优先级顺序,从最低层的最高优先级开始,直到最高层的最低优先级。
每个叶类(包只在附加到各自叶类的qdiscs中存储并排队)直接或通过父类的一条链路最终将连接到某个selfslot:
如图所示,叶类在绿色状态一定会比那些黄色的有效优先(他们从父类中借用了速度),因为他们的优先级是在较低层(level0)。
图中,Leaf1(优先级7)将在Leaf2(优先级8)发送后才发送,虽然它比Leaf2有更高的优先级。
在同样的优先级及相同的状态情况下,HTB用循环复用算法服务这些类。
HTB例子
下面是一些HTB怎样工作的示例。
假设以下情况-我们有3种不同的数据流(packet_mark1、packet_mark2和packet_mark3),标记在/ipfirewallmangle下,现在建立HTB层次结构:
[admin@MikroTik]queuetree>addname=ClassAparent=Localmax-limit=2048000
[admin@MikroTik]queuetree>addname=ClassBparent=ClassAmax-limit=1024000
[admin@MikroTik]queuetree>addname=Leaf1parent=ClassAmax-limit=2048000\
\...limit-at=1024000packet-mark=packet_mark1priority=8
[admin@MikroTik]queuetree>addname=Leaf2parent=ClassBmax-limit=1024000\
\...limit-at=256000packet-mark=packet_mark2priority=7
[admin@MikroTik]queuetree>addname=Leaf3parent=ClassBmax-limit=1024000\
\...limit-at=768000packet-mark=packet_mark3priority=8
[admin@MikroTik]queuetree>print
Flags:
X-disabled,I-invalid
0name="ClassA"parent=Localpacket-mark=""limit-at=0queue=default
priority=8max-limit=2048000burst-limit=0burst-threshold=0
burst-time=0s
1name="ClassB"parent=ClassApacket-mark=""limit-at=0queue=default
priority=8max-limit=1024000burst-limit=0burst-threshold=0
burst-time=0s
2name="Leaf1"parent=ClassApacket-mark=packet_mark1limit-at=1024000
queue=defaultpriority=8max-limit=2048000burst-limit=0
burst-threshold=0burst-time=0s
3name="Leaf2"parent=ClassBpacket-mark=packet_mark2limit-at=256000
queue=defaultpriority=7max-limit=1024000burst-limit=0
burst-threshold=0burst-time=0s
4name="Leaf3"parent=ClassBpacket-mark=packet_mark3limit-at=768000
queue=defaultpriority=8max-limit=1024000burst-limit=0
burst-threshold=0burst-time=0s
[admin@MikroTik]queuetree>
现在让我们描述一些情况,来使用此HTB层次结构。
1.假设数据包已经到达Leaf1和Leaf2的情况。
因此,Leaf1把自身放到此层(Level0)的selfslot,priority=8;Leaf2依赖于selfslot,priority=7;Leaf3没什么可发送,所以它不执行任何操作。
这是一个简单的情况:
在Level0有两个活动类(Leaf1和Leaf2),他们都在绿色的状态,起先,他们按优先级顺序处理,先服务Leaf2,然后Leaf1。
2.现在假定Leaf2拥有超过256kbps的发送速率,因此它需要看一下它的绿色的限制。
因状态的改变,它自身连接到其父类(ClassB)的innerfeed,并以递归方式将自身附加到Level1的优先级7的selfslot。
Leaf1将保持绿色状态-有数据包发送,但他们的速率是低于1Mbps,Leaf3一直没有数据可发送。
这是很重要的,要明确Leaf1现在有比Leaf2更高、更有效的优先级(如果它是在绿色的状态),尽管我们用比Leaf2低的优先级(8)配置了它。
因为Leaf2已断开本身在Level0的selffeed,而附加到Level1的selffeed并正在从其父(ClassB)借用速率。
因此,Leaf2的优先级已跳到Level1。
请记住最先服务最低层,层的优先级是先低层后高层,以满足附加类的优先级顺序。
3.考虑Leaf1已达到其最大限制,并更改其状态为红色,同时Leaf2现在用量已超过1Mbps(且小于2Mbps),因此它的父类ClassB已向ClassA借并变为黄色。
Leaf3仍未发送的数据包。
这种情况显示Leaf1已达到其max-limit,不能再从其父(ClassA)借用,因此它断开所有selfslots和innerslots。
Leaf2已递归到达Level2,因为它从ClassB借,依次到ClassA借,然可利用的速率并没有足够。
Leaf3仍没有数据包发送,唯一发送的类是Leaf2。
4.假定ClassA达到max-limit(2Mbps),这样,ClassB和Leaf2都不可以发送,因为他们只能依靠借用,又因ClassA不能发送而成不可能。
但现在,Leaf3有一些数据包发送
在这种情况下Leaf2是黄色的状态,但它不能借用(因为ClassB类不能从ClassA借),并且Leaf3是唯一可以发送的类。
请注意,即使没有其它类包括其父类能发送,Leaf3都能完好发送,因为它附加在Level0selffeed。
5.最后,让我们看看发生了什么,如果Leaf1、Leaf2、Leaf3、ClassB在黄色的状态,并且ClassA是绿色的。
Leaf1从ClassA借、Leaf2和Leaf3从ClassB借,而ClassB反而从ClassA借。
现在所有的优先级移到Level2。
如此,Leaf2上有最高的优先级,而最先受服务。
而Leaf1和Leaf3在所在的同一层
(2)上有相同的优先级(8),他们受服务使用循环复用算法。
Bursts突发
突发用于短时间内允许更高的数据速率。
每个突发时间(burst-time)的1/16时,路由器在最近burst-time上计秒,计算每个类的平均数据速率。
如果此时平均数据速率少于突发阈值(burst-threshold),突发被启用并且有效的速率限制(过渡到红色状态)设置为突发限制(burst-limit)bps,否则将有效的最大限制落在max-limit上。
让我们看看下面的设置:
max-limit=256000,burst-time=8,burst-threshold=192000和burst-limit=512000。
当用户开始通过HTTP下载文件时,我们可以看到这种情况:
开始平均数据率在过去8秒是0bps,因为没有数据流通过,此ruke之前已经创建了它。
自平均数据速率小于burst-threshold(192kbps)以后,突发被允许。
第一秒时平均数据率是(0+0+0+0+0+0+0+512)/8=64kbps,这是少于burst-threshold值的。
第二秒时平均数据率是(0+0+0+0+0+0+512+512)/8=128kbps。
第三秒时来了个断点,因此时平均数据率大于突发阈值。
在这一刻,突发被禁用,有效的数据速率限制跌到max-limit(256kbps)。
请注意突发时间被使用的方式。
突发的实际持续时间不只是burst-time!
它还取决于burst-threshold/burst-limit比率和实际通过突发类的数据速率。
在此示例中,突发率是192000/512000=3/8,时间是8,且队列一直试图利用该类提供的所有可用速率,所以突发是3秒时长。
现在,您可以很容易看到,一个正常的操作为何是burst-threshold应限制在limit-at和max-limit之间。
如果您指定的burst-threshold较max-limit高,则平均速率会倾向于burst-threshold,但有效的最大限制将不断地在max-limit和burst-limit点上跳转(取决于实际数据流的速率,它可能发生在每个评估点(1/16的burst-time))
HTBinRouterOS
除接口队列之外(每个接口有一个队列或HTB树),RouterOS保留3个虚拟接口和4个HTB树:
∙global-in
∙global-total
∙global-out
在添加一个简单队列(simplequeue)时,它创建3个HTB类(在global-in,global-total和global-out),但它不添加任何接口队列类。
队列树(Queuetree)更灵活-您可以将其添加到这些HTB中的任何一个。
当数据包传输通过路由器时,它将通过4个HTB树-global-in,global-total,global-out和输出接口queue。
如果它直达路由器,它将通过global-in和global-totalHTB的队列。
如果从路由器发送数据包,他们经历global-total,global-out和输出接口queue。
辅助资源
∙http:
//linux-
∙http:
//luxik.cdi.cz/~devik/qos/htb/
∙http:
//www.docum.org/docum.org/docs/
QueueTypes
子菜单级别:
/queuetype
描述
在此子菜单中,您可以创建您自定义的队列类型。
之后,您将能够在/queuetree,/queuesimple或/queueinterface中使用它们。
请注意这些排队规则不能限制所有的数据速率(除了PCQ)-他们只重组(调度)数据包和删除多余的(如果队列变得太长,管理类不能足够快地发送数据包),所以,在这里你找不到任何限制速率的参数(除了PCQ)-只有存储限制。
另请注意调度只发生在数据包被加入到队列规则时并且数据包进入速度比管理类可以提供的更快(所以这只是一个缓冲区),有5种可用于存储包的队列规则(qdiscs):
PFIFOandBFIFO
这些排队规则基于先进先出(fifo)算法(First-InFirst-Out)。
PFIFO和BFIFO之间的区别是衡量单位-一个是数据包另一个是字节。
有且仅有一个参数调用PFIFO(pfifo-limit)(或bfifo-limit在BFIFO的情况下),它定义了数据先进先出(fifo)队列可以持有多少。
每个数据包若不能加入队列(如果队列已满),则被删除。
大的队列长度可以增加队列等待时间,但有利于更好地利用通道。
如果您有一个不拥挤的链接,请使用先进先出(fifo)队列规则。
SFQ
随机公平队列(SFQ)均衡交通流量(TCP会话或UDP流)的链接时完全完整。
通过循环的哈希算法确保了SFQ的公平性。
哈希算法通过有限数量的子队列划分会话的数据流。
数据流可能用元组(src-address,dst-address,src-port和dst-port)唯一地标识,这些参数使用的SFQ哈希算法把数据包分类成子队列。
整个SFQ队列包含128包,并且有1024子队列供这些数据包使用。
每个包存储在有128包缓冲区的先进先出(fifo)链中,属于某一子队列,由哈希函数(元组的一个简单的函数使用10位输出值,因此子队列的数量是210=1024)。
鉴于排队规则的随机性,有不可预知的数量的流中的数据包实际上可能被分类到相同的子队列。
在sfq-perturb秒后,哈希算法更改并将会话通信划分到其他的子队列,以便没有分离的数据流将长时间与同一个子队列相关联。
循环复用算法依次从每一子队列将pcq-allot字节的数据从队列中分离输出。
使用SFQ到挤塞的链接,以确保连接不挨饿。
SFQ特别有益于无线链路。
PCQ
为解决SFQ的一些不足,创建每个连接队列(PCQ)。
在RouterOS中,它是唯一无类的队列类型并能限制速率。
除了它的stohastic属性外,它是SFQ的改良方案。
PCQ基于pcq-classifier参数创建子队列。
每个子队列具有pcq-rate参数限制数据速率和pcq-limit参数限制数据包的多少。
PCQ队列限制数据包总大小不能大于参数pcq-total-limit的值。
下面的示例演示如何使用PCQ按其源地址对数据包分类。
如果你通过src-address把数据包分类,则用不同源IP地址的所有包将被其分组到不同的子队列。
现在您可以使用pcq-rate参数为每个子队列做限制或均衡。
也许,最重要的部分是决定我们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ROS 防火墙 服务质量
![提示](https://static.bdocx.com/images/bang_tan.gif)