HWMPplus mesh
本页记录 MikroTik RouterOS 中的 HWMP+ mesh 协议,这是一种使用 Hybrid Wireless Mesh Protocol 的无线 mesh 网络二层路由解决方案。它涵盖接口属性、端口配置、FDB 状态,并包含动态 WDS 链路集成的示例。
HWMPplus mesh
Sub-menu: /interface/mesh
HWMP+ 是 MikroTik 专有的、用于无线 mesh 网络的二层路由协议。它基于 IEEE 802.11s 草案标准中的 Hybrid Wireless Mesh Protocol (HWMP)。在 mesh 设置中,它可以用来替代 (Rapid) Spanning Tree 协议,以确保无环的最优路由。
然而,HWMP+ 协议与 IEEE 802.11s 草案标准中的 HWMP 不兼容。
请注意,您用于网络的 distribution system 不必是 Wireless Distribution System (WDS)。HWMP+ mesh 路由不仅支持 WDS 接口,还支持 mesh 内的 Ethernet 接口。因此您可以使用简单的基于 Ethernet 的 distribution system,或者同时结合 WDS 和 Ethernet 链路!
警告
Properties
Mesh
| Property | Description |
|---|---|
| admin-mac (MAC address; Default: 00:00:00:00:00:00) | 管理性分配的 MAC 地址,在 auto-mac 设置被禁用时使用 |
| arp (disabled | enabled | proxy-arp | reply-only; Default: enabled) | Address Resolution Protocol 设置 |
| auto-mac (boolean; Default: no) | 如果禁用,则使用 admin-mac 中的值作为 mesh 接口的 MAC 地址;否则如果存在端口,将使用某个端口的地址 |
| hwmp-default-hoplimit (integer: 1..255; Default: ) | 生成的路由协议数据包的最大跳数;HWMP+ 数据包被转发 "hoplimit" 次后被丢弃 |
| hwmp-prep-lifetime (time; Default: 5m) | 从接收到的 PREP 或 PREQ 消息创建的路由的生命周期 |
| hwmp-preq-destination-only (boolean; Default: yes) | 是否只有目的地可以响应 HWMP+ PREQ 消息 |
| hwmp-preq-reply-and-forward (boolean; Default: yes) | 中间节点在响应 HWMP+ PREQ 消息后是否应转发它。仅在 hwmp-preq-destination-only 被禁用时有用 |
| hwmp-preq-retries (integer; Default: 2) | 在认为地址不可达之前,对特定 MAC 地址重试路由发现的次数 |
| hwmp-preq-waiting-time (time; Default: 4s) | 等待对第一个 PREQ 消息响应的时间。请注意,对于后续的 PREQ,等待时间会以指数方式增加 |
| hwmp-rann-interval (time; Default: 10s) | 发送 HWMP+ RANN 消息的频率 |
| hwmp-rann-lifetime (time; Default: 1s) | 从接收到的 RANN 消息创建的路由的生命周期 |
| hwmp-rann-propagation-delay (time; Default: 0.5s) | 传播 RANN 消息前等待的时间。以秒为单位的值 |
| mesh-portal (boolean; Default: no) | 此接口是否为 mesh 网络中的 portal |
| mtu (number; Default: 1500) | 最大传输单元大小 |
| name (string; Default: ) | 接口名称 |
| reoptimize-paths (boolean; Default: no) | 是否发送定期的 PREQ 消息以询问已知的 MAC 地址。如果网络拓扑经常变化,开启此设置很有用。请注意,如果对重新优化 PREQ 未收到回复,现有路径仍会保留(直到超时) |
Port
| Property | Description |
|---|---|
| active-port-type (read-only: wireless | WDS | ethernet-mesh | ethernet-bridge | ethernet-mixed; Default: ) | 实际使用的端口类型和状态 |
| hello-interval (time; Default: 10s) | 发送 HWMP+ Hello 消息之间的最大间隔。仅用于 Ethernet 类型端口 |
| interface (interface name; Default: ) | 要包含在 mesh 中的接口名称 |
| mesh (interface name; Default: ) | 此端口所属的 mesh 接口 |
| path-cost (integer: 0..65535; Default: 10) | 到接口的路径开销,由路由协议用于确定 'best' 路径 |
| port-type (WDS | auto | ethernet | wireless; Default: ) | 要使用的端口类型auto - 端口类型根据底层接口的类型自动确定WDS - 一个 Wireless Distribution System 接口。远程 MAC 地址从无线连接数据中学习ethernet - 远程 MAC 地址从 HWMP+ Hello 消息或从接收或转发流量中的源 MAC 地址中学习wireless - 远程 MAC 地址从无线连接数据中学习 |
FDB Status
| Property | Description |
|---|---|
| mac-address (MAC address) | 与此 FDB 条目对应的 MAC 地址 |
| seq-number (integer) | 路由协议中用于避免环路的序列号 |
| type (local | outsider | direct | mesh | neighbor | larval | unknown) | 此 FDB 条目的类型local -- MAC 地址属于本地路由器本身outsider -- MAC 地址属于 mesh 网络外部的设备direct -- MAC 地址属于 mesh 网络中某接口上的无线客户端mesh -- MAC 地址属于可通过 mesh 网络到达的设备;它既可以是 mesh 网络内部也可以是外部的neighbor -- MAC 地址属于作为此路由器直接邻居的 mesh 路由器larval -- MAC 地址属于可通过 mesh 网络到达的未知设备unknown -- MAC 地址属于未知设备 |
| mesh (interface name) | 此 FDB 条目所属的 mesh 接口 |
| on-interface (interface name) | 用于流量转发的 mesh 端口,一种 next-hop 值 |
| lifetime (time) | 如果此条目不用于流量转发,剩余的有效时间 |
| age (time) | 此 FDB 条目的年龄 |
| metric (integer) | 路由协议用于确定 'best' 路径的度量值 |
Example

本示例使用静态 WDS 链路,当它们变为活动状态时会动态添加为 mesh 端口。使用两个不同的频率:一个用于 AP 互连,一个用于客户端到 AP 的连接,因此 AP 必须至少有两个无线接口。当然,所有连接也可以使用相同的频率,但由于潜在的干扰问题,这可能效果不佳。
在所有 AP 上重复此配置:
/interface/mesh/add disabled=no
/interface/mesh/port/add interface=wlan1 mesh=mesh1
/interface/mesh/port/add interface=wlan2 mesh=mesh1
# interface used for AP interconnections
/interface/wireless/set wlan1 disabled=no ssid=mesh frequency=2437 band=2ghz-b/g/n mode=ap-bridge \
wds-mode=static-mesh wds-default-bridge=mesh1
# interface used for client connections
/interface/wireless/set wlan2 disabled=no ssid=mesh-clients frequency=5180 band=5ghz-a/n/ac mode=ap-bridge
# a static WDS interface for each AP you want to connect to
/interface/wireless/wds/add disabled=no master-interface=wlan1 name=<descriptive name of remote end> \
wds-address=<MAC address of remote end>
这里手动添加了一个 WDS 接口,因为使用的是静态 WDS 模式。如果您使用的是 wds-mode=dynamic-mesh,所有 WDS 接口将自动创建。此处指定 frequency 和 band 参数仅为了产生一个有效的示例配置;mesh 协议操作绝不限于或优化为这些特定值。
警告
您可能希望增大 disconnect-timeout 无线接口选项,以使协议更稳定。 在实际设置中,您还应使用
/interface/wireless/security-profile来保护无线连接。为简单起见,此处未显示该配置。
路由器 A 上的结果(有一个客户端连接到 wlan2):
[admin@A] > /interface/mesh/print
Flags: X - disabled, R - running
0 R name="mesh1" mtu=1500 arp=enabled mac-address=00:0C:42:0C:B5:A4 auto-mac=yes
admin-mac=00:00:00:00:00:00 mesh-portal=no hwmp-default-hoplimit=32
hwmp-preq-waiting-time=4s hwmp-preq-retries=2 hwmp-preq-destination-only=yes
hwmp-preq-reply-and-forward=yes hwmp-prep-lifetime=5m hwmp-rann-interval=10s
hwmp-rann-propagation-delay=1s hwmp-rann-lifetime=22s
[admin@A] > /interface/mesh/port/print detail
Flags: X - disabled, I - inactive, D - dynamic
0 interface=wlan1 mesh=mesh1 path-cost=10 hello-interval=10s port-type=auto port-type-used=wireless
1 interface=wlan2 mesh=mesh1 path-cost=10 hello-interval=10s port-type=auto port-type-used=wireless
2 D interface=router_B mesh=mesh1 path-cost=105 hello-interval=10s port-type=auto port-type-used=WDS
3 D interface=router_D mesh=mesh1 path-cost=76 hello-interval=10s port-type=auto port-type-used=WDS
FDB(Forwarding Database)目前仅包含有关本地 MAC 地址、可通过本地接口到达的非 mesh 节点以及直接 mesh 邻居的信息:
[admin@A] /interface/mesh/fdb/print
Flags: A - active, R - root
MESH TYPE MAC-ADDRESS ON-INTERFACE LIFETIME AGE
A mesh1 local 00:0C:42:00:00:AA 3m17s
A mesh1 neighbor 00:0C:42:00:00:BB router_B 1m2s
A mesh1 neighbor 00:0C:42:00:00:DD router_D 3m16s
A mesh1 direct 00:0C:42:0C:7A:2B wlan2 2m56s
A mesh1 local 00:0C:42:0C:B5:A4 2m56s
[admin@A] /interface/mesh/fdb/print detail
Flags: A - active, R - root
A mac-address=00:0C:42:00:00:AA type=local age=3m21s mesh=mesh1 metric=0 seqnum=4294967196
A mac-address=00:0C:42:00:00:BB type=neighbor on-interface=router_B age=1m6s mesh=mesh1 metric=132 seqnum=4294967196
A mac-address=00:0C:42:00:00:DD type=neighbor on-interface=router_D age=3m20s mesh=mesh1 metric=79 seqnum=4294967196
A mac-address=00:0C:42:0C:7A:2B type=direct on-interface=wlan2 age=3m mesh=mesh1 metric=10 seqnum=0
A mac-address=00:0C:42:0C:B5:A4 type=local age=3m mesh=mesh1 metric=0 seqnum=0
测试 ping 是否工作:
[admin@A] > /ping 00:0C:42:00:00:CC
00:0C:42:00:00:CC 64 byte ping time=108 ms
00:0C:42:00:00:CC 64 byte ping time=51 ms
00:0C:42:00:00:CC 64 byte ping time=39 ms
00:0C:42:00:00:CC 64 byte ping time=43 ms
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 39/60.2/108 ms
路由器 A 必须首先发现到路由器 C 的路径,因此第一次 ping 的时间略长。现在 FDB 还包含一个 00:0C:42:00:00:CC 的条目,类型为 "mesh"。
此外,测试 ARP 解析是否工作,以及 IP 层 ping 是否工作:
[admin@A] > /ping 10.4.0.3
10.4.0.3 64 byte ping: ttl=64 time=163 ms
10.4.0.3 64 byte ping: ttl=64 time=46 ms
10.4.0.3 64 byte ping: ttl=64 time=48 ms
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 46/85.6/163 ms
Mesh traceroute
还有一个 mesh traceroute 命令,可以帮助您确定用于路由的路径。
例如,对于此网络:
[admin@1] /interface/mesh/fdb/print
Flags: A - active, R - root
MESH TYPE MAC-ADDRESS ON-INTERFACE LIFETIME AGE
A mesh1 local 00:0C:42:00:00:01 7m1s
A mesh1 mesh 00:0C:42:00:00:02 wds4 17s 4s
A mesh1 mesh 00:0C:42:00:00:12 wds4 4m58s 1s
A mesh1 mesh 00:0C:42:00:00:13 wds4 19s 2s
A mesh1 neighbor 00:0C:42:00:00:16 wds4 7m1s
A mesh1 mesh 00:0C:42:00:00:24 wds4 18s 3s
到 00:0C:42:00:00:12 的 Traceroute 显示:
[admin@1] /interface/mesh/traceroute mesh1 00:0C:42:00:00:12
ADDRESS TIME STATUS
00:0C:42:00:00:16 1ms ttl-exceeded
00:0C:42:00:00:02 2ms ttl-exceeded
00:0C:42:00:00:24 4ms ttl-exceeded
00:0C:42:00:00:13 6ms ttl-exceeded
00:0C:42:00:00:12 6ms success
Protocol description
Reactive mode
路由器 A 想要发现到 C 的路径:

路由器 C 向 A 发送单播响应:

在 reactive 模式下,HWMP+ 非常类似于 AODV(Ad-hoc On-demand Distance Vector)。所有路径都是按需发现的,方法是在网络中泛洪 Path Request (PREQ) 消息。目的节点或某个具有到目的地的路径的路由器将回复 Path Response (PREP)。请注意,如果目的地址属于某个客户端,此客户端所连接的 AP 将作为它的代理(即代表它回复 PREQ)。
此模式最适合移动网络,和/或大多数通信发生在 mesh 内部节点之间的情况。
Proactive mode
root 通过泛洪 RANN 来宣告自身:

内部节点以 PREG 响应:

在 proactive 模式下,有一些路由器被配置为 portal。通常,作为 portal 意味着该路由器具有到某些其他网络的接口,即它是进入/离开 mesh 网络的入口/出口点。
portal 将通过在网络中泛洪 Root Announcement (RANN) 消息来宣告其存在。内部节点将以 Path Registration (PREG) 消息回复。此过程的结果将是以 portal 为根的路由树。
到 portal 的路由将充当一种默认路由。如果内部路由器不知道到特定目的地的路径,它将把所有数据转发到其最近的 portal。然后 portal 将在需要时代表该路由器发现路径。之后数据将流经 portal。这可能导致次优路由,除非数据是发往 portal 本身或 portal 具有接口的某些外部网络。
当大多数流量在内部 mesh 节点和少数 portal 节点之间传输时,proactive 模式最适合。
Topology change detection
数据流路径:

链路消失后,错误向上游传播:

HWMP+ 使用 Path Error (PERR) 消息来通知链路已消失。该消息传播到所有上游节点,直到数据源。源在接收到 PERR 后重新启动路径发现过程。
FAQ
Q. 这比 RSTP 好在哪里?
A. 它为您提供最优路由。RSTP 仅用于防止环路。
Q. 路由选择是如何完成的?
A. 在发现过程之后,始终选择度量最佳的路由。还有一个配置选项可以定期重新优化已知路由。
路由度量计算为各个链路度量的总和。
链路度量的计算方式与 (R)STP 协议相同:
- 对于 Ethernet 链路,度量是静态配置的(例如与 OSPF 相同)。
- 对于 WDS 链路,度量会根据实际链路带宽动态更新,而链路带宽又受无线信号强度和所选数据传输速率的影响。
目前,该协议不考虑链路上正在使用的带宽量,但将来也可能使用。
Q. 这比 OSPF/RIP/三层路由总体上好在哪里?
A. WDS 网络通常是桥接的,而不是路由的。自配置能力对 mesh 网络很重要,而路由通常比桥接需要更多的配置。当然,您始终可以在桥接网络上运行任何 L3 路由协议,但对于 mesh 网络来说,这通常意义不大。
警告
由于 mesh 协议不包含优化的二层多播转发,最好避免通过 mesh 网络转发任何多播流量(包括 OSPF)。如果您需要 OSPF,那么您必须配置使用单播模式的 OSPF NBMA 邻居。 Q. 性能/CPU 需求如何?
A. 协议本身在正确配置时,所占用的资源将远少于(例如)OSPF。单个路由器上的数据转发性能应接近桥接。
Q. 它如何与使用 RSTP 的现有 mesh 设置一起工作?
A. RSTP 网络的内部结构对 mesh 协议是透明的(因为 mesh hello 数据包会在 RSTP 网络内部转发)。mesh 会将 RSTP 网络中两个入口点之间的路径视为单个段。另一方面,mesh 网络对 RSTP 不是透明的,因为 RSTP hello 数据包不会在 mesh 网络内部转发。
警告
如果 mesh 网络在两个或多个点连接到 RSTP 网络,则可能出现路由环路! 请注意,如果您在两个接入点之间有 WDS 链路,那么两端必须具有相同的配置(两端都作为 mesh 中的端口,或两端都作为 bridge 接口中的端口)。
您还可以将 bridge 接口作为 mesh 端口(例如,为了能够使用 bridge firewall)。
Q. 我可以有多个进入/离开网络的点吗?
A. 如果入口/出口点被配置为 portal(即使用 proactive 模式),mesh 网络内的每个路由器将选择其最近的 portal 并将所有数据转发给它。然后 portal 将在需要时代表该路由器发现路径。
Q. 如何控制或过滤 mesh 流量?
A. 目前唯一的方法是使用 bridge firewall。创建一个 bridge 接口,将 WDS 接口和/或 Ethernet 放入该 bridge,然后将该 bridge 放入 mesh 接口。然后配置 bridge firewall 规则。
要匹配用于 mesh 流量封装的 MAC 协议,请使用 MAC 协议号 0x9AAA;要匹配 mesh 路由流量,请使用 MAC 协议号 0x9AAB。例如:
/interface/bridge/settings/set use-ip-firewall=yes
/interface/bridge/filter/add chain=input action=log mac-protocol=0x9aaa
/interface/bridge/filter/add chain=input action=log mac-protocol=0x9aab
警告
完全有可能创建无法工作的混合 mesh/bridge 设置(例如,用 bridge 代替 switch 的 Problematic example 1)。推荐的、始终有效的故障安全方法是为每个物理接口创建一个单独的 bridge 接口;然后将所有这些 bridge 接口添加为 mesh 端口。
Advanced topics
我们都知道,很容易创建有问题的二层桥接或路由设置,而且调试它们可能很困难。(与三层路由设置相比。)因此这里有一些可能给您带来问题的糟糕配置示例。请避免它们!
Problematic example 1: Ethernet switch inside a mesh
路由器 A 在 mesh 外部;其余所有路由器都在内部。对于路由器 B、C、D,所有接口都作为 mesh 端口添加:

路由器 A 将无法可靠地与路由器 C 通信。当 D 是 Ethernet 的指定路由器时,问题就会显现;如果 B 承担此角色,一切正常。问题的主要原因是 Ethernet 交换机上的 MAC 地址学习。
考虑当路由器 A 想向 C 发送某些内容时会发生什么。我们假设路由器 A 要么知道,要么将数据泛洪到所有接口。无论哪种方式,数据到达交换机。交换机对目的地的 MAC 地址一无所知,将数据转发给 B 和 D。
现在发生什么:
- B 在 mesh 接口上接收数据包。由于 MAC 地址不是 B 本地的,并且 B 知道他不是 Ethernet 网络的指定路由器,他直接忽略该数据包。
- D 在 mesh 接口上接收数据包。由于 MAC 地址不是 D 本地的,并且 D 是 Ethernet 网络的指定路由器,他发起对 C 的路径发现过程。
路径发现完成后,D 获得信息:C 可通过 B 到达。现在 D 封装该数据包并将其转发回 Ethernet 网络。封装的数据包由交换机转发,由 B 接收并转发,并由 C 接收。到目前为止一切正常。
现在 C 很可能会响应该数据包。由于 B 已经知道 A 在哪里,他将解封装并转发回复数据包。但现在交换机会学习到 C 的 MAC 地址可通过 B 到达!这意味着,下次当来自 A 的、发往 C 的内容到达时,交换机将把数据仅转发给 B(而 B 当然会静默忽略该数据包)!
相比之下,如果 B 承担了指定路由器的角色,一切都会正常,因为流量不必两次经过 Ethernet 交换机。
Troubleshooting:要么避免此类设置,要么在交换机上禁用 MAC 地址学习。请注意,在许多交换机上这是不可能的。
另请注意,如果满足以下任一条件,就不会有问题:
- 路由器 A 支持并配置为使用 HWMP+。
- 或者 Ethernet 交换机被替换为支持 HWMP+ 并将 Ethernet 接口作为 mesh 端口添加的路由器。
Problematic example 2: wireless modes
考虑这个(无效的)设置示例...路由器 A 和 B 在 mesh 内部,路由器 C 在外部。对于路由器 A 和 B,所有接口都作为 mesh 端口添加:

现在无法在路由器 B 上桥接 wlan1 和 wlan2。如果您理解 WDS 的工作原理,原因就非常明显。WDS 通信使用四地址帧。这是因为对于无线多跳转发,您需要知道中间跳的地址,以及原始发送方和最终接收方的地址。相比之下,非 WDS 802.11 通信在一帧中仅包含三个 MAC 地址。这就是为什么在 station 模式下无法进行多跳转发。
Troubleshooting 取决于您想要实现的目标:
- 如果您希望路由器 C 作为无线或 Ethernet 流量的中继器,请在路由器 B 和路由器 C 之间配置 WDS 链路,并在所有节点上运行 mesh 路由协议。
- 在其他情况下,将路由器 B 上的 wlan2 配置为 AP 模式,并将路由器 C 上的 WLAN 配置为 station 模式。