PCQ流量控制通过在线主机数量进行带宽平均分配,因此所有主机都能平等的分配到相同的带宽,如果在网络内需定义指定流量的优先级就需要使用到HTB(Hierarchical Token Bucket)等级令牌桶算法。

HTB (Hierarchical Token Bucket) 是一种流量分类的的队列算法,可有效提高带宽利用率和限制各种网络流量,并能根据IP地址、协议和端口等参数对数据流进行优先级设置,然后针对不同类别的数据流进行带宽控制。指定主机或服务预留带宽、限制最高带宽,也能实现平均分配带宽,并进行优先级管理,特别适合语音视频和数据混合的网络。

HTB等级令牌桶允许创建一个等级队列结构,并确定队列之间的关系,就像“父亲与儿子”或“兄弟之间”。一旦队列添加了一个Child(子队列)将会变为inner(内部队列),所有向下没有Children(子队列)称为Leaf队列(叶队列),内部队列仅负责传输的分配,所有Leaf队列对符合的数据进行处理。 在RouterOS必须指定Parent(父级)选项并指定一个队列为子队列。

每条队列规则,都有2个速率限制参数:

  • CIR (约定信息速率Committed Information Rate) – (在RouterOS中的参数为limit-at) 最坏的情况下,无论如何都会将得到给定的的CIR传输量(假设我们能发送那么多的数据量)。
  • MIR (最大信息速率Maximal Information Rate) – (在RouterOS中的参数为max-limit) 最好的情况下,如果父级有剩余带宽,才能获得这部分剩下的带宽。

换句话说,首先Limit-at(CIR)都会被满足,仅当子队列尝试借调父级剩余带宽时,才可以达到最大的带宽max-limit (MIR).

在HTB中,无论如何CIR 带宽都将会得到满足 (即使父级的max-limit满载) ,那就是为什么,确保最佳的使用双重限制功能,我们建议坚持这些规则:

  • CIR约定速率之和,即所有子队列CIR速率总和必须小于或等于可获得父级总流量。

CIR(parent)* ≥ CIR(child1) +…+ CIR(childN)

父级与主父级可以设置为 CIR(parent)=MIR(parent)

  • 任何子级的MIR最大速率必须小于或者等于父级的MIR最大速率

MIR (parent) ≥ MIR(child1) & MIR (parent) ≥ MIR(child2) & … & MIR (parent) ≥ MIR(childN)

具体的HTB内容请参阅RouterOS入门到精通!

这里演示Parent定义为网络接口,区分上行和下行流量,外网WAN口作为出方向,定义为上行,内网LAN接口则作为下行,实例仍然通过HTB在Queue tree的配置标记不同类型的数据流,实现优先级的带宽控制。

注意:Parent基于网络接口配置,仅适用于单线接入和一个内网接口的网络!

首先查看接口上的IP地址:

[admin@MikroTik] /ip address> print
Flags: X, D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS            NETWORK        INTERFACE

;;; defconf
0   192.168.88.1/24    192.168.88.0   bridge
1 D 100.64.100.119/32  100.64.100.1  pppoe-out1

在/ip address下看到有两个网络接口,一个是内网的bridge,一个是外网的pppoe-out1拨号接口。

基于协议的HTB

Queue tree里建立HTB等级流控,在mangle标记流量,首先提取TCP的80和443端口标记为web流量,然后将剩下的流量标记为other。

先是连接标记,匹配源地址是192.168.88.0/24的内网IP地址段,并提取tcp协议的80和443端口连接标记为web,然后web连接标记中提取数据包,标记为web,passthrough设置为no,不再下行传递。

/ip firewall mangle
add action=mark-connection chain=forward dst-port=80,443 new-connection-mark=\
web passthrough=yes protocol=tcp src-address=192.168.88.0/24

add action=mark-packet chain=forward connection-mark=web new-packet-mark=web \
passthrough=no

最后是标记192.168.88.0/24剩下的连接,选择connection-mark=no-mark的连接,并从中提取数据包标记为other

/ip firewall mangle
add action=mark-connection chain=forward connection-mark=no-mark \
new-connection-mark=other passthrough=yes src-address=192.168.88.0/24

add action=mark-packet chain=forward connection-mark=other new-packet-mark=\
other passthrough=no

在queue tree创建HTB配置,首先创建父级队列down和up,分别对应上行的外网口pppoe-out1和下行的内网口bridge,出口总带宽是150Mbps,上行带宽80Mbps,上行和下行都预留一部分带宽,用于缓冲。

/queue tree
add max-limit=140M name=down parent=bridge
add max-limit=60M name=up parent=pppoe-out1

web流量优先于其他流量priority设置1,其他流量priority优先级设置8,

/queue tree
add max-limit=140M limit-at=50M name=web packet-mark=web parent=down priority=1
add max-limit=140M limit-at=50M name=other packet-mark=other parent=down priority=8
add max-limit=60M limit-at=40M  name=web_up packet-mark=web parent=up priority=1
add max-limit=60M limit-at=20M name=other_up packet-mark=other parent=up priority=8
  • down作为下行父级总带宽140M,子队列包含web和other,
  • up作为上行父级总带宽60M,子队列包含web_up和other_up
  • web:定义max-limit最大可以获取140M,limit-at为90M(保证最少带宽90M,其他子队列无法抢占),优先级1,即最高
  • other:定义max-limit最大可以获取140M,limit-at为50M(保证最少带宽50M,其他子队列无法抢占),优先级8,最低

下行子级的web_up和other_up配置同理

配置完成后通过winbox查看

下载的运行结果:

  • other流量达到140M时,web流量需求不断增加,other优先级低于web,会释放90M带宽给web,由于limit-at的设置保证了other保留50M带宽,这时web流量是90M,other流量是50M
  • 当web流量达到140M时,other流量需求20M,虽然web优先级高于other,但limit-at要求最低保证50M带宽,因此web会释放20M给other,满足limit-at的需求。

配置HTB时需要注意:所有子级的Limt-at总和必须小于等于父级的Max-limit(该实例我没有定义父级的limit-at,以max-limit为准),子队列的max-limit必须小于等于父级的max-limit。当然实际情况中可以根据网络需求,限制低等级的limit-at,从而能让高等级的队列获得更大流量。

基于IP的HTB

网络情况如上,假如网络中有两台主机需要进行优先级的设置,如192.168.88.8和192.168.88.9两台主机进行流量控制,要求192.168.88.8获取带宽优先级高于192.168.88.9。

首先在mangle标记两台主机的连接,并从连接提取数据包,192.168.88.8标记为host8,192.168.88.9标记为host9,配置如下:

/ip firewall mangle
add action=mark-connection chain=forward new-connection-mark=host8 passthrough=\
yes src-address=192.168.88.8

add action=mark-packet chain=forward connection-mark=host8 new-packet-mark=host8 \
passthrough=no

add action=mark-connection chain=forward connection-mark=no-mark \
new-connection-mark=host9 passthrough=yes src-address=192.168.88.9

add action=mark-packet chain=forward connection-mark=host9 new-packet-mark=\
host9 passthrough=no

在queue tree配置主机的HTB流控规则,host8优先级设置为1,host9优先级为7

/queue tree
add max-limit=140M name=down parent=bridge
add max-limit=140M limit-at=100M name=host8 packet-mark=host8 parent=down priority=1
add max-limit=140M limit-at=10M name=host9 packet-mark=host9 parent=down priority=7
add max-limit=60M name=up parent=pppoe-out1
add max-limit=60M name=host8_up packet-mark=host8 parent=up priority=1
add max-limit=60M name=host9_up packet-mark=host9 parent=up priority=7

运行情况是host8优先级高于host9,如果host8和host9同时进行大流量下载数据,host8最大可以获得130M流量,因为host9的limit-at设置为10M,需要保证host9的最低带宽。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章很值,打赏犒劳作者一下