WMM and VLAN priority
本页说明 MikroTik RouterOS 如何为 QoS 实现 WMM(Wi-Fi MultiMedia)和 VLAN priority,详细介绍了流量如何被归类到接入类别(background、best effort、video、voice)、VLAN priority 的处理,以及使用 IP firewall mangle 规则或 bridge filter 设置数据包优先级的方法。
WMM and VLAN priority
WMM 的工作原理
WMM 通过将流量划分为 4 个接入类别来工作:background、best effort、video、voice。QoS 策略(对接入类别的不同处理)应用于发送的数据包,因此发送设备会对不同的数据包区别对待,例如 AP 无法控制客户端如何发送数据包,客户端也无法控制 AP 如何发送数据包。
Mikrotik AP 和客户端根据分配给数据包的优先级对其进行分类,依据下表(按照 WMM 规范):1,2 - background;0,3 - best effort;4,5 - video;6,7 - voice。
要能够使用多个 WMM 接入类别,而不仅仅是所有默认优先级为 0 的数据包所进入的 best effort,必须为这些数据包设置优先级。默认情况下,路由器内部的所有数据包(入站和本地生成的)优先级均为 0。
数据包的“更好”接入类别并不一定意味着它会比其他具有“更差”接入类别的数据包更早通过空口发送。WMM 的工作方式是对介质访问执行 DCF 方法,并为每个接入类别使用不同的设置(EDCF),这意味着“更好”的接入类别有更高的概率获得介质访问权 - 一个启用 WMM 的站可被视为 4 个站,每个接入类别一个,当所有站竞争介质时,具有“更好”接入类别的站使用使其更有可能获得发送机会的设置(通过使用更短的退避超时)。详细信息可在 802.11e 和 WMM 规范中研究。
信息
可以使用
wmm-support设置启用 WMM 支持。它仅适用于 B 和 G 频段。其他频段无论此设置如何都将启用它。
VLAN priority 的工作原理
VLAN priority 是 VLAN 标记报头内一个称为优先级码点(PCP)的 3 位字段,取值介于 0 和 7 之间。它用于在网桥和交换机上实现 QoS。MikroTik 设备默认以优先级 0 发送 VLAN 数据包(本地生成或封装的)。RouterOS 网桥原样转发带 VLAN 标记的数据包,这意味着收到的具有特定 VLAN priority 的带 VLAN 标记数据包将以相同的 VLAN priority 离开网桥。唯一的例外是网桥去除数据包标记时;在这种情况下,由于缺少 VLAN 报头,VLAN priority 不会保留。
更多细节可在 IEEE 802.1p 规范中研究。
如何设置优先级
数据包的优先级可以使用 IP firewall mangle 规则或 bridge filter/nat 规则中的 action=set-priority 来设置。优先级可以设置为特定值,或使用 from-ingress 设置从入站优先级获取。入站优先级是在传入数据包上检测到的优先级值(如果可用)。目前,入站优先级有 2 个来源 - VLAN 报头中的优先级和通过无线接口收到的 WMM 数据包中的优先级。对于所有其他数据包,入站优先级为 0。
请注意,入站优先级值不会自动复制到 IP mangle 的 priority 值。需要设置正确的规则才能做到这一点。
有 2 种控制优先级的方法 - 使用带有特定匹配器(协议、地址等)的规则分配优先级,或从入站优先级设置它。这两种方式都需要设置正确的规则。
这实质上意味着,如果不可能或不希望通过规则对数据包进行分类,则网络配置必须使得路由器能够从传入帧中提取入站优先级。请记住目前有 2 个来源 - 数据包中的 VLAN 标记和收到的 WMM 数据包。
信息
不要将队列的优先级与分配给数据包的优先级相混淆。队列的优先级单独工作,指定队列的“重要性”,并且仅在特定队列设置内才有意义。可将数据包优先级视为由规则附加到数据包上的某种标记。另外,请考虑到此标记目前仅用于通过启用 WMM 的链路时的出站数据包,以及在发送带 VLAN 标记的数据包时(无论该数据包是在本地标记还是桥接的)。
基于特定匹配器设置 VLAN 或 WMM 优先级
可以基于 IP mangle 或 bridge filter/nat 规则中的特定匹配器更改 VLAN 和 WMM 优先级。在此示例中,所有出站 ICMP 数据包将使用 IP mangle 规则以 VLAN 或 WMM 优先级发送:
/ip/firewall/mangle
add action=set-priority chain=output new-priority=2 protocol=icmp
自定义优先级映射
有时某些 VLAN 或 WMM 优先级需要更改或清除为默认值。我们可以使用 IP mangle 或 bridge firewall/nat 规则中的 ingress-priority 匹配器仅过滤所需的优先级,并使用 new-priority 动作设置将其更改为不同的值。例如,通过网桥转发的优先级为 5 的带 VLAN 标记数据包需要更改为 0。
/interface/bridge/filter
add action=set-priority chain=forward ingress-priority=5 new-priority=0
在网桥内将 WMM 优先级转换为 VLAN 优先级
当收到已设置 WMM 优先级的无线数据包时,RouterOS 网桥不会自动将其转换为 VLAN 报头。这意味着收到的具有 WMM 优先级并被网桥打上 VLAN 标记的无线数据包将以 VLAN priority 0 转发。但是,我们可以使用带 from-ingress 设置的 bridge filter 规则在 VLAN 数据包中保留该优先级。例如,我们希望将无线数据包通过 ether2 以 VLAN 10 报头转发,并保留已设置的 WMM 优先级(由无线客户端设置)。
/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=wlan2 pvid=10
/interface/bridge/vlan
add bridge=bridge1 tagged=ether2 vlan-ids=10
# translates WMM priority to VLAN priority
/interface/bridge/filter
add action=set-priority chain=forward new-priority=from-ingress out-interface=ether2
当无线数据包由无线接口使用 vlan-mode=use-tag 和 vlan-id 设置打上 VLAN 标记时,也适用相同的情况。您仍然需要使用相同的 bridge filter 规则将 WMM 优先级转换为 VLAN 优先级:
/interface/wireless
set [ find default-name=wlan2 ] vlan-mode=use-tag vlan-id=10
/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=wlan2
# translates WMM priority to VLAN priority
/interface/bridge/filter
add action=set-priority chain=forward new-priority=from-ingress out-interface=ether2
信息
相同的原则也反向适用。RouterOS 不会自动将 VLAN priority 转换为 WMM 优先级;您可以使用
new-priority=from-ingress规则来执行此转换。RouterOS 网桥原样转发带 VLAN 标记的数据包,意味着它们以进入网桥时相同的优先级离开网桥。唯一的例外发生在网桥去除数据包标记时,因为移除 VLAN 报头时优先级信息会丢失。
从 DSCP 获取优先级
设置 VLAN 或 WMM 优先级的另一种方法是使用 IP 报头中的 DSCP 字段。这只能通过使用 new-priority=``from-dscp 或 new-priority=from-dscp-high-3-bits 设置以及 set-priority 动作属性的 IP firewall mangle 规则来完成。请注意,IP 报头中的 DSCP 取值可为 0-63,但优先级仅为 0-7。使用 new-priority=``from-dscp 设置时,优先级将是 DSCP 值的低 3 位;而使用 new-priority=from-dscp-high-3-bits 时,优先级将是 DSCP 值的高 3 位。
请记住,DSCP 只能在 IP 数据包上访问,并且 IP 报头中的 DSCP 值应在某处设置(由客户端设备或 IP mangle 规则设置)。
最好在某个边界路由器(例如用于连接 Internet 的主路由器)上根据流量类型设置数据包 IP 报头中的 DSCP 值,例如将来自 Internet 的属于 SIP 连接的数据包的 DSCP 值设置为 7,其余设置为 0。这样,数据包只需在一个地方标记。然后网络上的所有 AP 只需一条规则即可从 DSCP 值设置数据包优先级。
从 DSCP 设置 VLAN 或 WMM 优先级
在此示例中,当数据包通过无线接口路由时,AP 设备将从 DSCP 设置 WMM 优先级。
/ip/firewall/mangle
add action=set-priority chain=forward new-priority=from-dscp out-interface=wlan2
信息
当数据包通过网桥转发时,可以通过网桥设置下的
use-ip-firewall=yes使数据包经过 IP mangle 规则。
从优先级获取 DSCP
类似地,如果收到的数据包包含 VLAN 或 WMM 优先级,则可以设置 DSCP 值。这可以通过使用 new-dscp=from-priority 或 new-dscp=from-priority-to-high-3-bits 设置以及 change-dscp 动作属性的 IP mangle 规则来实现。请注意,VLAN 或 WMM 数据包中的优先级取值可为 0-7,但 IP 报头中的 DSCP 为 0-63。使用 new-dscp=from-priority 设置时,优先级的值将设置 DSCP 的低 3 位;而使用 new-dscp=from-priority-to-high-3-bits 时,优先级的值将设置 DSCP 的高 3 位。
但是,此设置不能直接使用收到的 VLAN 或 WMM 数据包的入站优先级。您首先需要使用 IP mangle 或 bridge filter/nat 规则设置优先级(这种情况下可以使用入站优先级),然后才能应用 DSCP 规则。
从 VLAN 或 WMM 优先级设置 DSCP
在此示例中,当数据包被路由时,AP 设备需要从 WMM 优先级设置 DSCP。首先,添加一条规则来设置优先级。DSCP 规则需要它才能正确更改 DSCP 值。此规则可以从入站获取优先级。然后添加 DSCP 规则以更改其值。
/ip/firewall/mangle
add action=set-priority chain=prerouting in-interface=wlan2 new-priority=from-ingress
add action=change-dscp chain=prerouting in-interface=wlan2 new-dscp=from-priority
信息
当数据包通过网桥转发时,可以通过网桥设置下的
use-ip-firewall=yes使数据包经过 IP mangle 规则。
结合优先级设置与处理方案
基于上述“构建模块”,可以通过结合不同的优先级信息承载方法来处理复杂的网络和不同的情况,以确保 QoS 并优化资源使用。以下是一些建议:
- 整个网络中的过滤规则越少越好(越快)。尽量仅在必要时对数据包进行分类,优先在快速路由器上执行,因为很可能需要连接跟踪。
- 使用 DSCP 在您网络中转发的 IP 数据包中承载优先级信息。这样您可以在需要时使用它。
- 在必要的地方使用 VLAN,因为它们也承载优先级信息。确保途中的以太网网桥和交换机不会清除 VLAN 标记中的优先级信息。
- 请记住,QoS 不会提高链路的吞吐量;它只是区别对待不同的数据包,并且通过无线链路的 WMM 流量会在空口上优先于普通流量。