RouterOS 中文
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 108 -
第十章 带宽控制(Queue)
带宽控制是一套控制数据率分配,延迟易变性,及时转发(delivery),可靠转发的机制。 MikroTik RouterOS 支持队列规
则:
• PFIFO - 包先进先出
• BFIFO – 字节先进先出
• SFQ - 随机公平队列
• RED – 随机早先探测
• PCQ – 每次连接队列
• HTB – 等级令牌桶
规格
功能包要求: system
等级要求: Level1 (限 1 条规则) , Level3
操作路径: /queue
Queue 机制
服务质量(QoS)即路由器应该优先考虑保证数据流的质量,并形成新的网络数据流。 QoS 并非是只关于限流的,它更多的
是与提供优良品质的服务相关。以下是一些 RouterOS 带宽控制机制的特征:
• 对特定 IP 地址,子网,
,端口以及其他参数限制数据率
• 限制 P2P 流量
• 优先考虑一些数据包流
• 为更快的 WEB 浏览使用队列脉冲串
• 对固定的时间间隔执行队列
• 在用户间平等的或者根据通道负担共享可用流量
• 队列应用在通过路由器真实接口的数据包上(比如:队列应用在向外的接口,像业务流),或者三个添加的虚拟接口中
的任何一个或几个( global-in, global-out, global-total)。
QoS 是通过掉包的方法工作的。被丢掉的包会被再次发送以防止丢弃了 TCP 协议,所以没必要担心会丢失 TCP 信息。用于
描述网络应用的 QoS 等级的术语有:
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 109 -
• Queuing discipline (qdisc) - 一个保存并维护队列包的算法。它指定了向外的数据包(也就是说队列规则可以
对包再排序)以及在没有空间的情况下哪些包需要丢弃。
• CIR (Committed Information Rate) - 约定好了的数据率。 即通信量速率,在不超过这个值的时候应该总
是被转发
• MIR (Maximal Information Rate) - 路由器可以提供的最大数据率
• Priority - 流量将处理的重要性顺序。你可以设置优先级以便一些数据流可以在其他数据留之前被处理
• Contention Ratio - 定义的数据率在用户中共享的比率(当数据率分配给许多用户时)。正是用户的数量拥有应
用于它的简单速度限制。例如:连接比率是 1:4,即分配的数据率将会在最多 4 个用户中共享。
数据包在从接口发送之前会用队列规则进行处理。默认地,队列规则在物理接口的/queue interface 设置(对于虚拟接口
没有默认的规则)。一旦我们对物理接口添加了一个队列(在/queue tree),在/queue interface 定义的默认队列,对
于特定接口将被忽视。就是说,当一个包没有匹配任何过滤器时,它将被发送到带有最高优先权的接口。
调度机和成型机 qdiscs
我们按照对业务流的影响分类队列规则如下:
• 调度机(schedulers) - 队列规则只根据它们的算法对数据包进行重新调度并丢弃在队列中不匹配的数据包。调度
机队列规则包括: PFIFO, BFIFO, SFQ, PCQ, RED
• 成型机(shapers) - 队列规则也履行限制规则,成型机有 PCQ 及 HTB。
虚拟接口
RouterOS 对实际接口增加了三个虚拟接口:
• global-in - 代表了所有普通的输入接口(INGRESS 队列)。请注意在数据包过滤前与 global-in 相关的队列应
用到路由器接的数据流。 global-in 排序就是在 mangle 和 dst-nat 之后执行。
• global-out - 代表了所有普通的输出接口。附属于它的队列会在附属于特定接口的队列之前应用。
• global-total - 表了一个流经路由器的数据都能通过的虚拟接口。当把一个 qdisc 附属到 global-total 时,限制
需要在两个方向起作用。例如,如果我们设置一个为 total-max-limit 256000 限制,我们将得到
upload+download=256kbps(最大值)
队列类型(Queue Type)
操作路径: /queue type
在这个子目录你可以创建自己的客户队列类型。之后,将可以在/queue tree, /queue simple 或 /queue
interface 使用了
PFIFO 及 BFIFO
这些队列规则是基于先进先出算法的(FIFO:First-In First-Out)。PFIFO 和 BFIFO 的区别在于一个是以数据包为单位衡
量的,而另一个是以字节为单位。其中只有一个叫做 pfifo-limit (bfifo-limit)的参数,它是用来定义一个 FIFO 队列可
以容纳多少数据的。每一个不能排队(如果队列满了)的包都要被丢弃,队列长度过大会增加执行时间。
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 110 -
如果你的连接不拥塞的话,建议使用 FIFO 队列规则。
SFQ
随机公平排序(SFQ)不会限制流量。它的主旨是当你的连接完全满的时候均衡业务流(TCP 会话或者 UDP 流)。
SFQ 的公平性是由散列法和 round-robin 算法保证的。散列算法把会话流分成一个有限数量的子队列。在 sfq-perturb
时间之后散列算法改变并划分会话流为其他子队列。Round-robin 算法把从每个子队列的 pcq-allot 字节按照顺序出队列。
整个 SFQ 队列可以容纳 128 个数据包并且对这些包有 1024 个子队列可用。对拥挤的连接使用 SFQ 可以保证一些连接不
至于空等待(starve)。
PCQ
为了解决 SFQ 的不完美,每次连接排序 Per Connection Queuing (PCQ)便产生了。它是唯一一种能限流的无等级排序类
型。它是一种去掉了随机特性的进化版 SFQ。PCQ 也会根据 pcq-classifier 参数产生子队列。每个子队列都有一个
pcq-rate 的数据率限制和 pcq-limit 大小的数据包。PCQ 队列的总大小不能大于 pcq-total-limit 包。
以下实例说明了 PCQ 对数据包的用法,以它们的源地址分类。
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 111 -
如果你以 src-address 对包分类那么所有带有不同源 IP 地址的包将被集合在不同的子队列中。现在你可以使用 pcq-rate
参数对每一个子队列进行限制或均衡。或许最重要的部分是决定我们到底应该把这个队列附属到哪个接口上。如果我们把它
依附在本地接口上,那么所有来自公网接口的数据流都将以 src-address(很可能这不是我们想要的)地址分组;相反地如
果我们把它依附到公共接口,所有来自我们客户的数据都会以 src-address 分组——于是我们可以很容易的限制或者均衡客
户的上载。
用 pcq-classifier 分类后为了在子队列中均衡速率,设置 pcq-rate 为 0 几乎不用管理,PCQ 也可以用来对多用户动态
均衡或者形成流量,
RED
随机早先探测(RED)是一种通过控制平均队列长度避免网络拥塞的排序机制。当平均队列长度达到 red-min-threshold
时,RED 随机选择该丢弃哪个包。当平均队列长度变长时,堆砌多少包数的可能性会增加。如果平均队列长度达到
red-max-threshold,则丢弃该包。尽管如此,也存在真实队列长度(非平均的)远大于 red-max-threshold 时,
丢弃所有超过 red-limit 的数据包的情况。
注意:RED 应用在高数据率的拥挤的连接上,它在 TCP 协议上工作的很好,但在 UDP 上就没那么理想了。
属性描述
bfifo-limit (整数; 默认: 15000) - BFIFO 队列可以容纳的最大字节数
kind (bfifo | pcq | pfifo | red | sfq) – 选择队列控制类型
bfifo - 字节先进先出
pcq – 每次连接队列
pfifo – 数据包先进先出
red – 随机早先探测
sfq - 随机公平队列
name (名称) - 队列类型相关名称
pcq-classifier (dst-address | dst-port | src-address | src-port; 默认: "") - PCQ 对其子队列进行分组的分类器。
可以同时被数个分类器使用。例如:src-address,src-port 可使用不同源地址和源端口把所有包分为独立的子队列
pcq-limit (整数; 默认: 50) - 可以容纳一个单个 PCQ 子队列的包的数目
pcq-rate (整数; 默认: 0) - 对每个子队列允许的最大数据率。 0 值指的是没有任何限制
pcq-total-limit (整数; 默认: 2000) - 可以容纳整个 PCQ 队列的包的数目
pfifo-limit (整数) - PFIFP 队列可以容纳包的最大数目
red-avg-packet (整数; 默认: 1000) - 被 RED 用来对平均队列长度计算
red-burst (整数) - 用来决定平均队列长度被真实队列长度影响的快慢的字节值。较长的值将减慢 RED 的计算速度——较
长的脉冲串也是允许的
red-limit (整数) - 以字节计算。如果真实队列长度(非平均值)超过了这个值那么所有大于这个值的包都将被丢弃。
red-max-threshold (整数) - 以字节计算。数据包标记概率最高的平均队列长度
red-min-threshold (整数) - 当平均 RED 队列长度达到这个值时,数据包标记才有可能
sfq-allot (整数; 默认: 1514) - 在一个 round-robin 循环中从子队列发出的字节数
sfq-perturb (整数; 默认: 5) - 以秒计时。指定改变 SFQ 的散列算法的频率
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 112 -
Bursts 脉冲串
脉冲串用来在一段很短的时间允许更高数据率。每 1/16 burst-time 时间,路由器都会计算每个类在上一个 burst-time
时间的平均数据率。如果这个平均数据率小于 burst-threshold,脉冲串就会被启用且实际数据率达到 burst-limit bps,
否则实际数据率将跌至 max-limit 或 limit-at。
让我们考虑如果我们有个 max-limit=256000, burst-time=8, burst-threshold=192000 以及
burst-limit=512000 的设置情况。当一个用户通过 HTTP 下载一个文件,我们可以观察到这样的现象:
在最开始的 8 秒中平均数据率是 0bps 因为在应用队列规则前没有流量通过。由于这个平均数据率小与 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。在第三秒之后达到临界点
此时平均数据率变得大于 burst-threshold。这个时候脉冲串将被禁用且当前数据率降至 max-limit (256kbps)。
Simple Queue 简单队列
限制数据率的 IP 地址和子网的最简单方法就是使用简单队列。你也可以使用简单队列建立高级 QoS 应用:
• P2P 流量队列
• 在选定时间间隔执行队列规则
• FIFO 优先级
• 从 /ip firewall mangle 使用多重包标记
• 形成双向流量(对上传和下载的带宽限制)
属性描述
burst-limit (整数/整数) - 当脉冲串以 in/out(目标上传/下载)形式激活时可以达到的最大数据率
burst-threshold (整数/整数) - 用于计算是否允许脉冲串。如果上一次脉冲时间的平均数据率低于 burst-threshold 则
实际数据率可能达到 burst-limit。以 in/out(目标上传/下载)的形式。
burst-time (整数/整数) - 用于计算平均数据率。以 in/out(目标上传/下载)的形式。
direction (none both upload download) - 流量控制方向
none – 队列停止有效的工作
both – 队列同时限制目标上行和目标下行
upload – 队列仅限制目标上行,下行的数据不会被限制
download - 队列仅限制目标下行,上行的数据不会被限制
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 113 -
dst-address (IP 地址/子网掩码) - 要匹配的目标地址
dst-netmask (子网掩码) - dst-address 的掩码
interface (文本) - 队列应用的对象端口。
limit-at (整数/整数) – 该队列以 in/out(目标上传/下载)的形式约定的数据率
max-limit (整数/整数) - 在有足够带宽情况下可以达到的数据率,以 in/out(目标上传/下载)的形式。
name (文本) - 队列的描述性名称
p2p (any | all-p2p | bit-torrent | blubster | direct-connect | edonkey | fasttrack | gnutella | soulseek | winmx)
– 控制匹配的 P2P 流量类型
all-p2p – 匹配的所有 P2P 传输
any – 匹配任何数据包(即不会检查该属性)
packet-marks (名称; 默认: "") - /ip firewall 中的数据包标记
mangle 更多数据包标记使用逗号(",")搁开。
parent (名称) - 父队列在等级
中的名称。只能是其他简单队列
priority (整数: 1..8) -队列的优先级。 1 是最高级的,8 是最低的
queue (名称/名称; 默认: default/default) - 以 in/out(目标上传/下载)的形式来自/queue type 的队列名称
target-addresses (IP 地址/子网掩码) - 限制目标 IP 地址(源地址)。使用多地址用逗号分搁开
time (时间,sat | fri | thu | wed | tue | mon | sun{+}; 默认: "") - 限制队列在一个特定时间段的影响
total-burst-limit (整数) - global-total 队列的脉冲串限制
total-burst-threshold (整数) - global-total 队列的脉冲串门限
total-burst-time (时间) - global-total 队列脉冲串时间
total-limit-at (整数) - 限制累计的上传和下载为 total-limit-at bps
total-max-limit (整数) - global-total 队列的限制上限 (限制累计的上传和下载为 total-max-limit bps)
total-queue (名称) - global-total 队列的队列规则
应用举例
下面假设我们想要对网络 192.168.0.0/24 流量限制为:下行 1Mb 上行 512kb,这里我们需要让服务器 192.168.0.1
不受流量控制。网络的基本设置如图:
这里我们使用(simple queue)简单队列,首先我们配置 RouterOS 的 IP 地址、网关和 NAT 等基本网络参数:
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 114 -
[admin@MikroTik] ip address> print
Flags: X – disabled, I – invalid, D - dynamic
# ADDRESS NETWORK BROADCAST INTERFACE
0 192.168.0.254/24 192.168.0.0 192.168.0.255 Local
1 10.5.8.104/24 10.5.8.0 10.5.8.255 Public
[admin@MikroTik] ip address>
路由配置:
[admin@MikroTik] ip route> print
Flags: X – disabled, A – active, D – dynamic,
C – connect, S – static, r – rip, b – bgp, o - ospf
# DST-ADDRESS G GATEWAY DISTANCE INTERFACE
0 ADC 10.5.8.0/24 Public
1 ADC 192.168.0.0/24 Local
2 A S 0.0.0.0/0 r 10.5.8.1 Public
[admin@MikroTik] ip route>
最后不要忘记在 ip firewall nat 中配置 src-nat 的伪装或 nat,做地址转换操作。
为网络 192.168.0.0/24 的所有客户端添加一个限制下载流量为 2Mb 上传流量 1Mb 的简单队列规则。
[admin@MikroTik] queue simple> add name=Limit-Local target-address=192.168.0.0/24
max-limit=1000000/2000000
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
0 name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
parent=none priority=8 queue=default/default limit-at=0/0 max-limit=1000000/2000000
total-queue=default
[admin@MikroTik] queue simple>
max-limit 限制了最大可用带宽,从客户的角度看,参数 target-addresses 定义限制带宽的目标网络或者主机(也可
以用逗号分隔开网络段或主机地址)。
这里不想让服务器受到我们添加上面规则的任何流量限制,我们可以通过添加一个没有任何限制的规则(max-limit=0/0
代表没有任何限制)并把它移到列表的顶部:
[admin@MikroTik] queue simple> add name=Server target-addresses=192.168.0.1/32
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
0 name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
parent=none priority=8 queue=default/default limit-at=0/0 max-limit=65536/131072
total-queue=default
1 name="Server" target-addresses=192.168.0.1/32 dst-address=0.0.0.0/0
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 115 -
parent=none priority=8 queue=default/default limit-at=0/0 max-limit=0/0
total-queue=default
[admin@MikroTik] queue simple> move 1 0
[admin@MikroTik] queue simple> print
Flags: X - disabled, I - invalid, D - dynamic
0 name="Server" target-addresses=192.168.0.1/32 dst-address=0.0.0.0/0
parent=none priority=8 queue=default/default
limit-at=0/0 max-limit=0/0 total-queue=default
1 name="Limit-Local" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0
parent=none priority=8 queue=default/default
limit-at=0/0 max-limit=65536/131072 total-queue=default
[admin@MikroTik] queue simple>
HTB 介绍
HTB 等级令牌桶允许创建一个等级队列结构,并确定队列之间的关系,就像“父亲与儿子”或“兄弟之间”。
一旦队列添加了一个 Child(子队列)将会变为 inner(内部队列),所有向下没有 Children(子队列)称为 Leaf 队列(叶队
列),内部队列仅负责传输的分配,所有 Leaf 队列对符合的数据进行处理。 在 RouterOS 必须指定 Parent(父级)选项并指定
一个队列为子队列。
双重限制
每个队列在 HTB 有 2 个速率限制:
• CIR (约定信息速率 Committed Information Rate) – (在 RouterOS 中的参数为 limit-at) 最坏的情况下,
无论如何都会将得到给定的的 CIR 传输量(假设我们能发送那么多的数据量)
• MIR (最大信息速率 Maximal Information Rate) – (在 RouterOS 中的参数为 max-limit) 最好的情况下,
如果父级有剩余带宽,将获得该速率值
换句话说,首先 Limit-at(CIR)都会被满足,仅当子队列尝试借调必要的数据传输从他们的父级,以达到最大的带宽
max-limit (MIR).
注: 无论如何 CIR 都将会被分配到符合队列的带宽 (即使父级的 max-limit 满载) ,那就是为什么,确保最佳的使用双
重限制功能,我们建议坚持这些规则:
• CIR 约定速率之和,即所有子级速率必须小于或等于可获得父级传输量。
CIR(parent)* ≥ CIR(child1) +...+ CIR(childN)
*如果父级与主父级可以设置为 CIR(parent)=MIR(parent)
• 任何子级的最大速率必须小于或者等于父级的最大速率
MIR (parent) ≥ MIR(child1) & MIR (parent) ≥ MIR(child2) & ... & MIR (parent) ≥ MIR(childN)
在 winbox 中队列的颜色变化:
• 0% - 50% 使用情况 – 绿色
• 51% - 75% 使用情况 – 黄色
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 116 -
• 76% - 100% 使用情况 – 红色
优先级
这里已经知道,所有队列的 limit-at (CIR)都有可能将会被耗尽,优先级则主要负责分配父级队列剩余的带宽给 Child(子
队列)达到 max-limit。队列高的优先级最优先达到 max-limit,优先级低的则不会。8是最低优先级,1则最高。
注意,优先级工作环境:
• 对于 leaf 叶队列–优先级对于 inner(内部队列)没有任何意义,即 inner 内部队列与 leaf(叶队列)的优先级
不可比较
• 如果 max-limit 被设定(非 0)
下面这部分我们将分析 HTB 的操作,将演示一个 HTB 结构并将涵盖可能出现的所有情况和功能,我们的 HTB 结构由下面 5
个队列构成:
• Queue01 内部队列有 2个子级 - Queue02 和 Queue03
• Queue02 内部队列有 2个子级 - Queue04 和 Queue05
• Queue03 叶队列
• Queue04 叶队列
• Queue05 叶队列
Queue03,Queue04 和 Queue05 的需要 10Mbps,我们接口处理能力在 10Mbps 的流量
事例 1: 普通事例
• Queue01 limit-at=0Mbps max-limit=10Mbps
• Queue02 limit-at=4Mbps max-limit=10Mbps
• Queue03 limit-at=6Mbps max-limit=10Mbps priority=1
• Queue04 limit-at=2Mbps max-limit=10Mbps priority=3
• Queue05 limit-at=2Mbps max-limit=10Mbps priority=5
事例 1 结果:
• Queue03 得到 6Mbps
• Queue04 得到 2Mbps
• Queue05 得到 2Mbps
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 117 -
• 结论:HTB 建立在一种方式上,通过满足所有的 limit-at,主队列已没有带宽进行分发。
事例 2:max-limit 事例
• Queue01 limit-at=0Mbps max-limit=10Mbps
• Queue02 limit-at=4Mbps max-limit=10Mbps
• Queue03 limit-at=2Mbps max-limit=10Mbps priority=3
• Queue04 limit-at=2Mbps max-limit=10Mbps priority=1
• Queue05 limit-at=2Mbps max-limit=10Mbps priority=5
事例 2 结果
• Queue03 得到 2Mbps
• Queue04 得到 6Mbps
• Queue05 得到 2Mbps
• 结论: 在满足所有的 limit-at 后,HTB 将把剩余的带宽分配给优先级高的队列。
事例 3: inner 队列 limit-at
• Queue01 limit-at=0Mbps max-limit=10Mbps
• Queue02 limit-at=8Mbps max-limit=10Mbps
• Queue03 limit-at=2Mbps max-limit=10Mbps priority=1
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 118 -
• Queue04 limit-at=2Mbps max-limit=10Mbps priority=3
• Queue05 limit-at=2Mbps max-limit=10Mbps priority=5
事例 3 结果
• Queue03 得到 2Mbps
• Queue04 得到 6Mbps
• Queue05 得到 2Mbps
• 结论:在满足所有的 limit-at 后,HTB 将分配剩余带宽给优先级高的,但在这个事例中,内部对列
Queue02 指定了 Limit-at, 这样他会保留 8Mbps 的流量给 Queue04 和 Queue05,Queue04 有
更高的优先级,那就是为什么会得到更高的带宽。
事例 4:leaf 队列的 Limit-at
• Queue01 limit-at=0Mbps max-limit=10Mbps
• Queue02 limit-at=4Mbps max-limit=10Mbps
• Queue03 limit-at=6Mbps max-limit=10Mbps priority=1
• Queue04 limit-at=2Mbps max-limit=10Mbps priority=3
• Queue05 limit-at=12Mbps max-limit=15Mbps priority=5
事例 4 结果
• Queue03 得到 3Mbps
• Queue04 得到 1Mbps
• Queue05 得到 6Mbps
• 结论:为了满足所有的 Limit-at,HTB 被强迫分配 20Mbps,Queue03 为 6Mbps ,Queue04 为 2Mbps,Queue05
为 12Mbps,但我们的接口只能处理 10Mbps,因此接口队列通常 FIFO 带宽发分配将保持比例 6:2:12,
即 3:1:6。
RouterOS 中的 HTB
在 RouterOS 中有 4 个 HTB 树:
• global-in
• global-total
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 119 -
• global-out
• interface queue
当添加一个简单队列时,将产生 3 个 HTB 类(in global-in, global-total and global-out),但在接口队列中不添加任何
类。
当数据包通过路由器时,它将穿过所有 4 个 HTB 树——global-in, global-total, global-out 和 interface queue。如
果是指向路由器的它将穿过 global-in 及 global-total HTB 树,如果数据包是从路由器发出的,它们将穿过 global-total,
global-out 及 interface 队列。
Queue tree 队列树
操作路径: /queue tree
当你想使用基于协议,端口,IP 地址等的复杂数据分配流量时,你需要使用队列树。首先通过在/ip firewall mangle 下
标记数据包流然后使用这个标记作为在这个队列树的数据包流标识。
属性描述
burst-limit (整数) - 当脉冲串激活时可以达到的最大数据率
burst-threshold (整数) - 用于计算是否允许脉冲。如果上一次脉冲时间的平均数据率低于 burst-threshold 则实际数
据率可能达到 burst-limit。
burst-time (整数) - 用于计算平均数据率。
flow (文本) - 在/ip firewall mangle 下标记的数据包流。 当前队列参数仅应用于用这个数据流标记标识了的数据包。
limit-at (整数) - 这个队列的约定流量
max-limit (整数) - 在有足够带宽可用的情况下可达到的流量
name (文本) - 队列的描述性名称
parent (文本) - 父队列的名称。顶级的父队列是可用的接口(实际上是主 HTB)。低级点的父队列可能是其他的队列。
priority (整数: 1..8) - 队列的优先级。 1 是最高级等级, 8 为最低。
queue (文本) - 队列类型名称。类型是在/queue type 下定义的。这个参数仅应用于树等级制中的子队列。
Queue tree HTB 实例
这个事例中,设定 3 类数据 VIP、Web 和 Other,这三类数据中 VIP 为网络内的重要用户优先级最高为 1,访问网页的数
据 web 其次为 2,而剩下的数据 Other 级别最低为 7,假设我们的网络是 1M 的 ADSL,我们通过配置 HTB 策略来保证网
络内的优先数据。
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 120 -
通过用 new-connection-mark 标记向外的连接,并采取 mark-connection 动作。当这个完成时你可以使用
new-packet-mark 标记属于这个连接的所有数据包并采用 mark-packet。
首先 VIP 数据标记,我们通过 ip firewall address-list 定义 VIP 用户的地址列表,定义完成后通过 src-address-list 调用:
[admin@Office] /ip firewall mangle> print
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; vip
chain=forward action=mark-connection new-connection-mark=vip
passthrough=yes src-address-list=vip
1 chain=forward action=mark-packet new-packet-mark=vip passthrough=no
connection-mark=vip
跟着定义 web 数据,这里我们需要针对访问网页的 tcp/80 端口和域名解析的 DNS 端口 tcp/53 和 udp/53 端
口标记:
2 ;;; web
chain=forward action=mark-connection new-connection-mark=web
passthrough=yes protocol=tcp dst-port=80
3 chain=forward action=mark-connection new-connection-mark=web
passthrough=yes protocol=tcp dst-port=53
4 chain=forward action=mark-connection new-connection-mark=web
passthrough=yes protocol=udp dst-port=53
5 chain=forward action=mark-packet new-packet-mark=web passthrough=no
connection-mark=web
最后对剩下的 Other 数据进行标记,因为前面已经标记了 VIP 和 Web 的数据包,所有剩下数据就是其他的
Other 数据:
6 ;;; other
chain=forward action=mark-connection new-connection-mark=other
passthrough=yes
7 chain=forward action=mark-packet new-packet-mark=other passthrough=no
connection-mark=other
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 121 -
标记数据完成后,我们进入queue tree中,对数据进行优先级的配置,ADSL总带宽为1Mbps下行,250kps
的上行,给三类数据带宽分配如下
• VIP:下行 Max-limit=800k limit-at=400k,上行 Max-limit=2200k limit-at=200k,优先级 1
• Web:Max-limit=800k limit-at=400k,上行 Max-limit=200k limit-at=200k,优先级 2
• Other:Max-limit=600k limit-at=200k,上行 Max-limit=150k limit-at=50k,优先级 7
根据以上参数,我们在 queue tree 中配置队列优先级:
[admin@Office] /queue tree> print
Flags: X - disabled, I - invalid
0 name="totalup" parent=ADSL packet-mark="" limit-at=0 queue=default
priority=1 max-limit=250000 burst-limit=0 burst-threshold=0 burst-time=0s
1 name="totaldown" parent=ether2 packet-mark="" limit-at=0 queue=default
priority=8 max-limit=1000000 burst-limit=0 burst-threshold=0
burst-time=0s
2 name="vipdown" parent=totaldown packet-mark=vip limit-at=0 queue=default
priority=2 max-limit=700000 burst-limit=0 burst-threshold=0 burst-time=0s
3 name="vipup" parent=totalup packet-mark=vip limit-at=0 queue=default
priority=2 max-limit=150000 burst-limit=0 burst-threshold=0 burst-time=0s
4 name="otherdown" parent=totaldown packet-mark=other limit-at=0 queue=down
priority=8 max-limit=500000 burst-limit=0 burst-threshold=0 burst-time=0s
5 name="otherup" parent=totalup packet-mark=other limit-at=0 queue=up
priority=8 max-limit=150000 burst-limit=0 burst-threshold=0 burst-time=0s
6 name="webup" parent=totalup packet-mark=web limit-at=0 queue=default
priority=1 max-limit=150000 burst-limit=0 burst-threshold=0 burst-time=0s
7 name="webdown" parent=totaldown packet-mark=web limit-at=0 queue=default
priority=1 max-limit=700000 burst-limit=0 burst-threshold=0 burst-time=0s
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 122 -
PCQ 配置
PCQ 算法比较简单,首先利用分类器从相应数据流中区分一个子数据流,然后在每一个子数据流上建立独立的
FIFO 队列长度和限制,再归类所有的子数据流在一起,并应用全局 FIFO 队列长度和限制。 PCQ 参数:
• pcq-classifier (dst-address | dst-port | src-address | src-port; 默认: "") : 选择子数据流分类类型。
• pcq-rate (数字) : 每个子数据流可获得的最大数据带宽。
• pcq-limit (数字) : 在数据包中一个子数据流的队列长度
• pcq-total-limit (数字) : 全局 FIFO 队列的队列长度
因此,当有 100 个队列需要限制 1000kbps 下载时,我们可以使用 1 个 PCQ 队列和该 PCQ 队列包含的 100 子数据
流队列。
分类器
为更好的理解分类器,我将用一个从指定的地址和端口到一个指定的地址和端口 18 个数据流,这时我们将选择
一种分类器,并通过 PCQ 将 18 个数据流分离到 PCQ 的子数据流。
PCQ 的目标和源地址分类原理图:
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 123 -
端口分类
在局域网中因为网络带宽的问题,需要对网络流做控制,但又因为做固定的流量控制的时候,会造成在上网空闲
时候带宽的浪费,这里我们可以同 RouterOS 的 PCQ 算法完成对内部局域网流量的动态分配,如下图所示:
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 124 -
通过上图,我们可以看到当 PCQ 的速率设定为 128k 的时候,平均每个用户将会得到同样的带宽 128k,当上网高
峰期的时候 PCQ 才会做二次流量分配,如果 PCQ 的速率在开始就设定为 0k,这样在一个用户的时候就可以得到
全部带宽,之后是 2 个用户平均分配,依次类推,但最后带宽会控制在 73k 的范围内,控制最小使用带宽,保证
用户正常使用。
配置这里我们配置 192.168.10.0/24 这个段的 PCQ 流量控制,估计有 100 个用户在线,首先进入 Queue Type 中
配置 PCQ 的上行和下行分别为 512k 和 1m:
首先我们配置下行,每个用户获取 1m 的下行流量。由于是 100 个用户在线,所以在 limit 不变的情况下,total-limit 应该
设置为 50*100=5000,下行指向的是目标地址,所以我们选择 dst-address:
RouterOS 中文教程
此教程用于学习,严谨任何个人、组织和公司用于商业用途!- YuS www.mikrotik.com.cn - 125 -
上行选择 src-address,并配置 512k 的上行流量配置如下:
注意,Limit 和 Total-Limit 的关系:
• 默认情况下 total-limit 是 2000,该规则仅能容纳 40 个用户(total-limit/limit=2000/50=40)
• 解决方法必须增加 total-limit 或