Spanning Tree Protocol

本页介绍 MikroTik RouterOS 中的生成树协议(STP),详细说明它如何通过选择根桥并使用桥协议数据单元(BPDU)优化端口使用来防止网络环路。它强调对较大型网络进行手动配置,并提供监控命令以检查网桥和端口上的 STP 状态。

生成树协议


生成树协议的目的是在具有冗余链路的同时提供创建无环路第 2 层拓扑的能力。在连接多个网桥或只是交叉连接网桥端口时,可能会创建严重影响的网络稳定性的网络环路。生成树协议旨在通过引入根桥(root bridge)的概念来解决此问题。同一第 2 层域中的所有网桥将交换关于到根桥最短路径的信息。之后,每个网桥将协商使用哪些端口来到达根桥。此信息交换借助桥协议数据单元(BPDU)完成。STP 将为每个网桥禁用某些端口以避免环路,同时仍确保所有网桥可以相互通信。有关该协议的深入描述,请参阅 IEEE 802.1D。

作为最佳实践,始终建议手动设置每个网桥的优先级、端口优先级和端口路径开销,以始终确保正确的第 2 层功能。对于由 1 到 2 个运行 (R/M)STP 的网桥组成的网络,将 STP 相关值保留为默认值是可以接受的,但对于较大型网络,强烈建议手动设置这些值。由于 STP 通过检查网络上各网桥的 STP 相关值来选举根桥和根端口,将 STP 设置保留为自动可能会选举出非期望的根桥和根端口,并且在硬件故障的情况下可能导致网络无法访问。

信息

RouterOS 网桥不适用于 PVST 及其变体。PVST BPDU(MAC 目标地址为 01:00:0C:CC:CC:CD)被 RouterOS 网桥视为典型的组播数据包。简单来说,它们经过 RouterOS 网桥/交换机转发逻辑处理,可能会被打标签或去标签。

监控


您可以使用 /interface/bridge/monitor 命令检查网桥的 STP 状态,例如:

/interface/bridge/monitor bridge1
                    state: enabled                         
      current-mac-address: 74:4D:28:6F:31:10               
                bridge-id: 0x8000.74:4D:28:6F:31:10        
              root-bridge: no                              
           root-bridge-id: 0.74:4D:28:11:70:6B             
  regional-root-bridge-id: 0.74:4D:28:11:70:6B             
           root-path-cost: 0                               
                root-port: combo1                          
               port-count: 2                               
    designated-port-count: 0                               
        mst-config-digest: 4e22fbb9ede77faa45ec995c4ffa8085
             fast-forward: no                              
         multicast-router: yes                             
             igmp-querier: none                            
              mld-querier: none                            
        declared-vlan-ids: 1                               
      registered-vlan-ids: 1      

请注意,根桥没有任何根端口,只有指定端口。

您可以使用 /interface/bridge/port/monitor 命令检查网桥端口的 STP 状态,例如:

/interface/bridge/port/monitor [find interface=combo1]
                  interface: combo1             
                     status: in-bridge          
                    port-id: 0x80.1             
                       role: root-port          
                  edge-port: no                 
        edge-port-discovery: yes                
        point-to-point-port: yes                
               external-fdb: no                 
               sending-rstp: yes                
                   learning: yes                
                 forwarding: yes                
           actual-path-cost: 2000               
    internal-root-path-cost: 2000               
       designated-bridge-id: 0.74:4D:28:11:70:6B
   designated-internal-cost: 0                  
         designated-port-id: 0x80.1             
  designated-remaining-hops: 20                 
                 bpdu-tx-rx: 3/7791             
        discard-transitions: 0                  
        forward-transitions: 1                  
                   tc-tx-rx: 2/2                
           topology-changes: 1                  
       last-topology-change: 4h19m43s           
           multicast-router: no                 
           hw-offload-group: switch1            
          declared-vlan-ids: 1                  
                             100                
        registered-vlan-ids: 1                  
                             100                
                             200-203     

请注意,root-bridge-id 由网桥优先级和网桥的 MAC 地址组成;对于非根网桥,根桥将显示为 designated-bridge。

警告

当使用设置为以 802.1Q 作为 EtherType 的网桥时,它们将向 01:80:C2:00:00:00 发送 BPDU,这些地址被 MSTP、RSTP 和 STP 使用。当使用 802.1ad 作为网桥 VLAN 协议时,BPDU 与 802.1Q 网桥不兼容,它们被发送到 01:80:C2:00:00:08。如果第 2 层网络中存在不同的网桥 VLAN 协议,(R/M)STP 将无法正常工作。

STP 和 RSTP


STP 和快速 STP 广泛用于许多网络中,但由于 RSTP 的优势,几乎所有网络都已切换到仅使用 RSTP。STP 是一种非常古老的协议,其收敛时间(完全学习网络拓扑变化并继续正确转发流量所需的时间)长达 50 秒。RSTP 的收敛时间要小得多,只需几秒甚至几毫秒。建议使用 RSTP 而不是 STP,因为它快得多,并且与 STP 向后兼容。RSTP 更快的原因之一是可能的端口状态更少,以下是可能的 STP 端口状态列表:

  • 转发(Forwarding) - 端口参与流量转发并学习 MAC 地址,并且正在接收 BPDU。
  • 监听(Listening) - 端口不参与流量转发且不学习 MAC 地址,并且正在接收 BPDU。
  • 学习(Learning) - 端口不参与流量转发但正在学习 MAC 地址。
  • 阻塞(Blocking) - 端口由于造成环路而被阻塞,但正在接收 BPDU。
  • 禁用(Disabled) - 端口被禁用或不活动。

在 RSTP 中,禁用、监听和阻塞端口状态被替换为一个称为**丢弃(Discarding)**状态的单一状态:

  • 转发(Forwarding) - 端口参与流量转发并学习 MAC 地址且正在接收 BPDU(forwarding=yes)。
  • 学习(Learning) - 端口不参与流量转发但正在学习 MAC 地址(learning=yes)。
  • 丢弃(Discarding) - 端口不参与流量转发且不学习 MAC 地址,并且正在接收 BPDU(forwarding=no)。

在 STP 中,端口主要按状态分类(例如,转发、监听、学习、阻塞、禁用)。端口行为根据生成树算法动态确定,但不显式分配角色。转发或阻塞流量的逻辑源自根桥、根端口和指定端口的计算,但这些被视为生成树拓扑的一部分,而不是正式化的端口角色。RSTP 显式定义端口角色,并引入备份路径的概念,通过替代端口(Alternate Port)和备份端口(Backup Port)角色显式表示。这些角色在 STP 中不存在,因为 STP 泛化地处理被阻塞端口,不区分它们作为潜在备份的功能。

以下是 RSTP 协议端口角色的细分:

  • 根端口(Root Port) - 面向根桥并具有到根桥的最佳(最低开销)路径的端口。每个网桥只选举一个根端口(根桥本身除外)。
  • 指定端口(Designated Port) - 背向根桥并将流量从根桥转发到下游设备的端口。
  • 替代端口(Alternate Port) - 面向根桥但不转发流量的端口。如果当前根端口发生故障,该端口提供到根桥的备份路径。
  • 备份端口(Backup Port) - 背向根桥但不转发流量的端口。作为同一网段上指定端口的备份的端口。
  • 禁用端口(Disabled Port) - 被禁用或不活动的端口。

在 STP 中,网桥之间的连接性通过在邻居网桥之间发送和接收 BPDU 来确定。指定端口向根端口发送 BPDU。如果连续 3 次未收到 BPDU(HelloTime 的 3 倍),则认为连接不可用,并将开始网络拓扑收敛。在某些场景中,可以通过减少 forward-delay 计时器来缩短 STP 收敛时间,该计时器负责端口可以处于学习/监听状态的时间长度。

在 RouterOS 中,可以指定哪些网桥端口是边缘端口。边缘端口是不应接收任何 BPDU 的端口。这是有益的,因为它允许 STP 跳过学习和监听状态并直接进入转发状态。此功能有时称为 PortFast。您可以将此参数保留为默认值 auto,但也可以手动指定。您可以为不应在其后面再有网桥的端口手动设置边缘端口。通常,这些是接入端口。

此外,网桥端口 point-to-point 指定网桥端口是否使用点对点链路连接到网桥,以便在发生故障时更快收敛。通过将此属性设置为 yes,您强制该链路为点对点链路,这将跳过检查机制,该机制从这条单一链路检测并等待来自其他设备的 BPDU。通过将此属性设置为 no,您表示该链路可以从多个设备接收 BPDU。通过将该属性设置为 yes,您可以显著改善 (R/M)STP 收敛时间。通常,只有当链路之间可能连接另一台设备时,才应将此属性设置为 no。这主要与无线介质和以太网集线器相关。如果以太网链路是全双工,auto 会启用点对点功能。当 protocol-mode 设置为 none 时,此属性没有效果。

默认值

创建网桥或向网桥添加端口时,以下是 RouterOS 分配的默认值:

  • 默认网桥优先级:32768 / 0x8000
  • 默认网桥端口路径开销:基于接口速率
  • 默认网桥端口优先级:0x80
  • BPDU 消息年龄增量:1
  • HelloTime:2
  • 默认最大消息年龄:20

网桥接口设置 port-cost-mode 更改桥接端口的端口 path-cost 和 internal-path-cost 模式,使用基于接口速率的自动值。此设置不影响具有手动配置的 path-cost 或 internal-path-cost 属性的桥接端口。以下示例说明了与特定数据速率对应的路径开销(中间速率按比例计算):

Data rateLongShort
10 Mbps2,000,000100
100 Mbps200,00019
1 Gbps20,0004
10 Gbps2,0002
25 Gbps8001
40 Gbps5001
50 Gbps4001
100 Gbps2001

对于绑定接口,应用所有绑定成员端口中最高的一 path-cost,此值不受绑定总链路速率的影响。对于虚拟接口(如 VLAN、EoIP、VXLAN)以及 wifi、wireless 和 60GHz 接口,为 long 模式分配 path-cost 20,000,为 short 模式分配 10。对于动态桥接接口(例如 wifi、wireless、PPP、VPLS),path-cost 默认为 long 模式 20,000 和 short 模式 10。但是,这可以被动态向网桥添加接口的服务手动覆盖,例如,通过使用 CAPsMAN datapath.bridge-cost 设置。RouterOS 7.13 之前的版本不会根据链路速率更改端口路径开销,对于 10M、100M、1000M 和 10000M 链路速率,将端口添加到网桥时的默认路径开销值始终为 10。

BPDU 的年龄由 BPDU 经过的网桥数量乘以消息年龄决定,因为 RouterOS 使用 1 作为消息年龄增量,因此 BPDU 数据包可以经过 max-message-age 参数中指定数量的网桥。默认情况下此值设置为 20。这意味着经过第 20 个网桥后,BPDU 数据包将被丢弃,下一个网桥将成为根桥。请注意,如果设置了 max-message-age=20,则很难预测第 21 个网桥上哪些端口将是指定端口,并可能导致流量无法正确转发。

警告

如果使用网桥过滤规则,请确保允许 DST-MAC 地址为 01:80:C2:00:00:00 的数据包,因为这些数据包携带对 STP 正常工作至关重要的 BPDU。

选举过程

要在您的网络中正确配置 STP,您需要理解选举过程以及哪些参数以何种顺序参与。在 RouterOS 中,根桥将按此特定顺序基于最小优先级和最小 MAC 地址选举:

  1. 网桥优先级(最低)。
  2. 网桥 MAC 地址(最低)。

在 RouterOS 中,根端口按此特定顺序基于最低根端口路径开销、最低网桥标识符和最低网桥端口 ID 选举:

  1. 根端口路径开销(最低)
  2. 网桥标识符(最低)
  3. 网桥端口 ID(最低)

首先,当设备考虑在其端口中选择哪个作为根端口时,它会检查其端口看到的根路径开销。如果两个或更多端口的根路径开销相同,则检查上游设备的网桥标识符,连接到最低网桥标识符的端口将成为根端口。如果在两个或更多端口上看到相同的网桥标识符,则检查上游设备的网桥端口 ID。

属性说明

根路径开销:所有网桥都有根路径开销。根桥的根路径开销为 0。对于所有其他网桥,它是到根桥的最低开销路径上的端口路径开销之和。您可以在 /interface/bridge/port 下修改本地端口路径开销。 网桥标识符是"网桥优先级"和"网桥 MAC"的组合,可在 /interface/bridge 下配置。

网桥端口 ID 是"唯一 ID"和"网桥端口优先级"的组合。唯一 ID 在将网桥端口添加到网桥时自动分配。它无法编辑。它可以在 WinBox 的 "Bridge Port" "Port Number" 列中看到,或使用 /interface/bridge/port/monitor 以 port-number 查看。

:::tip Understanding STP Port Election 请确保将路径开销和优先级应用于正确的端口:

  • 路径开销(Path Cost) 影响面向根桥方向的端口。(在根桥端口上设置路径开销没有效果。)
  • 端口优先级(Port Priority) 影响背向根桥方向的端口。
  • 网桥标识符(Bridge Identifier) 不影响设备自身的根端口选举;它影响下游设备的根端口选举。 :::

:::warning Bridge Priority Compatibility RouterOS 允许设置 0 到 65535 之间的任何网桥优先级值。但是,IEEE 802.1W 标准严格要求网桥优先级以 4096 为步长。为避免与其他厂商设备不兼容,请仅使用以下优先级值: 0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152, 53248, 57344, 61440 :::

示例

根路径开销示例

Root Path

此示例说明了根路径开销如何工作。SW1 将成为根桥,因为它具有最低的优先级 0x1000。每个网桥将计算到根桥的路径开销。在计算根路径开销时,网桥会考虑其端口上配置的路径开销 + 邻居网桥通告的根路径开销。

SW1:由于它是根桥,它向邻居通告根路径开销 0,即使它配置的路径开销为 10。

**SW2:**ether1 的根路径开销为 0 + 25=25。在 ether2 路径上,开销将为 10+10+10+0=30

**SW3:**ether2 的根路径开销为 0 + 10=10。在 ether4 路径上,路径开销将为 10+5+25+0=40

**SW4:**ether1 的根路径开销为 0+25+5=30。在 ether4 上,路径开销将为 10+10+0=20。

具有最低路径开销的端口将被选举为根端口。STP 拓扑中的每个网桥都需要一条到根桥的路径。在找到最佳路径后,冗余路径将被阻塞,在此情况下是 SW2 和 SW4 之间的路径。

警告

您可以在根桥上配置路径开销,但只有当网桥失去其根状态时才会被考虑。

STP 示例

STP Example 1

在此示例中,我们希望确保 ServerA 到 ServerB 连接的第 2 层冗余。如果某个端口连接到不是网桥且未运行 (R)STP 的设备,则该端口被视为边缘端口。在此情况下,ServerA 和 ServerB 连接到边缘端口。在网络中使用 STP 可以实现这一点。以下是每个交换机的配置示例:

  • SW1 的配置:
/interface/bridge
add name=bridge priority=0x1000
/interface/bridge/port
add bridge=bridge interface=ether1 priority=0x60
add bridge=bridge interface=ether2 priority=0x50
add bridge=bridge interface=ether3 priority=0x40
add bridge=bridge interface=ether4 priority=0x30
add bridge=bridge interface=ether5
  • SW2 的配置:
/interface/bridge
add name=bridge priority=0x2000
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2
add bridge=bridge interface=ether3
  • SW3 的配置
/interface/bridge
add name=bridge priority=0x3000
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2
add bridge=bridge interface=ether3
  • SW4 的配置:
/interface/bridge
add name=bridge priority=0x4000
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2 path-cost=20
add bridge=bridge interface=ether3

在此示例中,SW1 是根桥,因为它具有最低的网桥优先级。SW2 和 SW3 的 ether1、ether2 连接到根桥,ether3 连接到 SW4。当所有交换机正常工作时,流量将从 ServerA 流经 SW1_ether2、经过 SW2、再经过 SW4 到达 ServerB。在 SW1 发生故障的情况下,SW2 由于次低优先级而成为根桥,如图中虚线所示。以下是每个交换机的端口及其角色列表:

  • root-port - SW2_ether2, SW3_ether2, SW4_ether1
  • alternate-port - SW2_ether1, SW3_ether1, SW4_ether2
  • designated-port - SW1_ether1, SW1_ether2, SW1_ether3, SW1_ether4, SW1_ether5, SW2_ether3, SW3_ether3, SW4_ether3

说明

注意: 根据 802.1Q 建议,您应以 4096 为步长使用网桥优先级。要设置推荐的优先级,使用十六进制表示法更方便,例如,0 是 0x0000,4096 是 0x1000,8192 是 0x2000,依此类推(0..F)。

多生成树协议


多生成树协议(MSTP)用于网桥接口,以确保跨多个 VLAN 的无环路拓扑。MSTP 还可以提供第 2 层冗余,并可用作 VLAN 的负载均衡技术,因为它能够在不同 VLAN 之间具有不同的路径。MSTP 的运行与 (R)STP 非常相似,许多 (R)STP 的概念可以应用于 MSTP,强烈建议在使用 MSTP 之前理解 (R)STP 背后的原理,但在设计启用 MSTP 的网络时必须考虑一些差异。

在使用 (R)STP 的情况下,BPDU 通过网络桥中的所有物理接口发送,以确定环路,并在端口可能导致环路时阻止其转发流量。如果某个 VLAN 内部存在环路,(R)STP 可能无法检测到它。某些 STP 变体通过在每个单独的 VLAN 上运行 STP 实例(PVST)来解决此问题,但这已被证明效率低下,还有一些 STP 变体通过在所有 VLAN 上运行单个 STP 实例(CST)来解决此问题,但它缺乏为每个 VLAN 或 VLAN 组进行负载均衡的可能性。MSTP 倾向于通过使用 MST 实例来解决这两个问题,MST 实例可以定义一组 VLAN(VLAN 映射),用于负载均衡和冗余,这意味着每个 VLAN 组可以具有不同的根桥和不同的路径。请注意,将多个 VLAN 分组到单个实例中是有益的,可以减少每次网络拓扑变化的 CPU 周期数。

危险

在启用 MSTP 的 RouterOS 中,网桥优先级是 CIST 的根桥优先级,如 IEEE 802.1Q 标准所述,网桥优先级必须以 4096 为步长,最低的 12 位被忽略。以下是有效的网桥优先级:0, 4096, 8192, 12288, 16384, 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152, 53248, 57344, 61440。设置无效的网桥优先级时,RouterOS 会向您发出警告并将该值截断为有效值,但会在配置中保存原始值,因为无效的网桥优先级值仍可在运行 RouterOS 的设备之间用于 (R)STP,不过建议改用有效的网桥优先级。

MSTP 区域

MSTP 以称为区域(region)的组工作。每个区域将有一个区域根桥,区域之间将选举一个根桥。MSTP 将使用内部生成树(IST)在区域内构建网络拓扑,并在区域外使用公共生成树(CST)在多个区域之间构建网络拓扑。MSTP 将这两个协议组合成公共和内部生成树(CIST),它保存区域内部和区域之间的拓扑信息。从 CST 的角度来看,一个区域看似一个单一的虚拟网桥,因此 MSTP 被认为对于大型网络非常可扩展。要使网桥处于同一区域,它们的配置必须匹配。BPDU 不会包含 VLAN 映射,因为它们可能很大,而是传输计算出的哈希。如果网桥通过某个端口收到 BPDU 且配置不匹配,则 MSTP 会将该端口视为边界端口,并且它可用于到达其他区域。以下是 MSTP 将 BPDU 视为来自同一区域所需匹配的参数列表:

  • 区域名称
  • 区域修订号
  • 到 MST 实例 ID 的 VLAN 映射(计算出的哈希)

可以创建一个没有区域的启用 MSTP 的网络,但要能够按 VLAN 组进行负载均衡,需要网桥从与其连接的网桥接收具有上述相同参数的 BPDU。在 RouterOS 中,默认区域名称为空,区域修订号为 0,这些是有效值,但您必须确保它们匹配以将多个网桥放入单个 MSTP 区域。如果区域的网桥分散在网络中,则该区域无法存在;这些网桥必须至少以一种方式连接,使它们可以在不离开区域的情况下发送和接收 BPDU,例如,如果具有不同区域相关参数的网桥位于两个具有相同区域相关参数的网桥之间,则将至少存在 3 个不同的 MSTP 区域。

MSTP Topology

将每个单独的网桥运行在单个 MSTP 区域中的缺点是过多的 CPU 周期。相比之下,PVST(+) 为网络上存在的每个 VLAN ID 创建一个生成树实例,由于网络中可能存在的路径非常有限,这种方法产生大量开销和不必要的 CPU 周期。这也意味着这种方法不能很好地扩展,并且可能使 CPU 能力不太强大的交换机过载。MSTP 通过将网络划分为 MSTP 区域来解决此问题,其中该区域内的每个网桥将交换并处理同一区域内存在的 VLAN 信息,但在后台运行单个生成树协议实例以维护区域之间的网络拓扑。这种方法已被证明更加有效和可扩展。这意味着对于较大型网络应使用区域以减少 CPU 周期。

在区域中,您可以定义 MST 实例,用于按 VLAN 组配置负载均衡并选举区域根桥。值得一提的是,每个区域中都存在一个预定义的 MST 实例,在大多数文档中称为 MSTI0。此 MST 实例被视为默认 MST 实例。有一些参数适用于此特殊 MST 实例。当流量通过启用 MSTP 的网桥时,MSTP 将查找具有匹配 VLAN 映射的 MST 实例,但如果某个 VLAN ID 不存在 VLAN 映射,则流量将归入 MSTI0。

警告

由于 MSTP 要求启用网桥接口上的 VLAN 过滤,因此请确保您已在 /interface/bridge/vlan 中允许所有必需的 VLAN ID,否则流量将无法转发,并且看起来可能像 MSTP 配置错误,尽管这实际上是 VLAN 过滤配置错误。

选举过程

MSTP 中的选举过程可分为两部分,区域内和区域间。要使 MSTP 正常工作,始终需要有一个区域根(即区域内的根桥)和一个 CIST 根(即区域之间的根桥)。区域根是区域内的根桥,需要区域根桥来正确设置区域内 VLAN 组的负载均衡。CIST 根将用于配置哪些端口将是替代/备份端口(不活动)以及哪些端口将是根端口(活动)。

警告

在区域之间,没有按 VLAN 组的负载均衡,没有根端口选举过程,MSTP 区域之间的端口阻塞方式与 (R)STP 相同。如果 CIST 阻塞了 MSTP 区域内的某个端口以防止 MSTP 区域之间的流量环路,则该端口对于 IST 在 MSTP 区域内按 VLAN 组进行负载均衡仍然可以是活动的。

  • 以下参数参与选举 MSTP 区域内的区域根桥或根端口:
PropertyDescription
priority (integer: 0..65535 decimal format or 0x0000-0xffff hex format; Default: 32768 / 0x8000)/interface/bridge/msti,MST 实例优先级,用于在 MSTP 区域内选举区域根。必须以 4096(0x1000)为步长设置;最低的 12 位被忽略。有效值:0x0000、0x1000、0x2000、...、0xf000(或十进制等价物:0、4096、8192、...、61440)。
internal-path-cost (integer: 1..200000000; Default: )/interface/bridge/port,未知 VLAN ID(MSTI0)到区域根的路径开销,用于 MSTP 区域内的根端口上。
priority (0x00 | 0x10 | 0x20 | 0x30 | 0x40 | 0x50 | 0x60 | 0x70 | 0x80 | 0x90 | 0xa0 | 0xb0 | 0xc0 | 0xd0 | 0xe0 | 0xf0; Default: 0x80)/interface/bridge/port/mst-override,已定义 MST 实例的 MST 端口优先级,用于区域根桥上的网桥端口。必须以 16(0x10)为步长设置。
internal-path-cost (integer: 1..200000000; Default: )/interface/bridge/port/mst-override,已定义 MST 实例的 MST 端口路径开销,用于 MSTP 区域内的非根网桥端口。
  • 以下参数参与选举 CIST 根桥或 CIST 根端口:
PropertyDescription
priority (integer: 0..65535 decimal format or 0x0000-0xffff hex format; Default: 32768 / 0x8000)/interface/bridge,CIST 网桥优先级,用于选举 CIST 根桥。必须以 4096(0x1000)为步长设置;最低的 12 位被忽略。
priority (0x00 | 0x10 | 0x20 | 0x30 | 0x40 | 0x50 | 0x60 | 0x70 | 0x80 | 0x90 | 0xa0 | 0xb0 | 0xc0 | 0xd0 | 0xe0 | 0xf0; Default: 0x80)/interface/bridge/port,CIST 端口优先级,用于 CIST 根桥上选举 CIST 根端口。必须以 16(0x10)为步长设置。
path-cost (integer: 1..200000000; Default: )/interface/bridge/port,CIST 端口路径开销,用于 CIST 非根网桥端口以选举 CIST 根端口。

警告

MSTP 选举根桥/端口时检查参数的顺序与 (R)STP 相同,您可以在 (R)STP 选举过程一节中了解更多信息。

MST 实例

子菜单: /interface/bridge/msti

本节用于将多个 VLAN ID 分组到单个实例中,以便在 MSTP 区域内为每个 VLAN 组创建不同的根桥。

PropertyDescription
bridge (text; Default: )分配 MST 实例的网桥。
identifier (integer: 1..31; Default: )MST 实例标识符。
priority (integer: 0..65535 decimal format or 0x0000-0xffff hex format; Default: 32768 / 0x8000)MST 实例优先级用于确定 MSTP 区域内一组 VLAN 的根桥。
vlan-mapping (integer: 1..4094; Default: )要分配给 MST 实例的 VLAN ID 列表。此设置接受 VLAN ID 范围以及逗号分隔的值。例如 vlan-mapping=100-115,120,122,128-130

MST Override

子菜单: /interface/bridge/port/mst-override

本节用于在 MSTP 区域内为每个 VLAN 映射选择所需的路径。

PropertyDescription
disabled (yes | no; Default: no)条目是否被禁用。
internal-path-cost (integer: 1..200000000; Default: )MST 实例 VLAN 映射的路径开销,用于面向根桥的 VLAN 以操纵路径选择;较低路径开销优先。
identifier (integer: 1..31; Default: )MST 实例标识符。
priority (integer: 0..240; Default: 128)MST 实例 VLAN 的优先级,用于背向根桥的 VLAN 以操纵路径选择;较低优先级优先。
interface (name; Default: )使用已配置 MST 实例 VLAN 映射以及已定义路径开销和优先级的端口名称。

监控

与 (R)STP 类似,也可以监控 MSTP 状态。通过监控网桥接口本身,可以查看当前 CIST 根桥和 MSTI0 的当前区域根桥。还可以查看 MST 实例标识符和 VLAN 映射的计算哈希。在确保某些网桥处于同一 MSTP 区域时,这很有用。下面您可以找到监控 MSTP 网桥的示例:

/interface/bridge/monitor bridge
                    state: enabled
      current-mac-address: 6C:3B:6B:7B:F0:AA
                bridge-id: 0x8000.6C:3B:6B:7B:F0:AA 
              root-bridge: no
           root-bridge-id: 0x1000.64:D1:54:24:23:72
  regional-root-bridge-id: 0x4000.6C:3B:6B:7B:F0:AA
           root-path-cost: 10
                root-port: ether4
               port-count: 5
    designated-port-count: 3
        mst-config-digest: 74edbeefdbf82cf63a70cf60e43a56f3
             fast-forward: no                              
         multicast-router: yes                             
             igmp-querier: none                            
              mld-querier: none                            
        declared-vlan-ids: 1                               
      registered-vlan-ids: 1

在 MSTP 中可以监控 MST 实例。这对于确定某个 MST 实例和 VLAN 组的当前区域根桥很有用。下面您可以找到监控 MST 实例的示例:

/interface/bridge/msti/monitor 1
                    state: enabled
               identifier: 2
      current-mac-address: 6C:3B:6B:7B:F0:AA
                bridge-id: 0x8000.6C:3B:6B:7B:F0:AA
              root-bridge: no
           root-bridge-id: 0.00:00:00:00:00:00
  regional-root-bridge-id: 0x1002.6C:3B:6B:7B:F9:08
           root-path-cost: 0
                root-port: ether2
               port-count: 5
    designated-port-count: 1

也可以监控某个 MST Override 条目。这对于在 MSTP 区域中配置根端口和替代/备份端口时确定某个 MST 实例的端口角色很有用。下面您可以找到监控 MST Override 条目的示例:

/interface/bridge/port/mst-override/monitor 1
                      port: ether3
                    status: active
                identifier: 2
                   port-id: 0x80.1     
                      role: alternate-port
                  learning: no
                forwarding: no
   internal-root-path-cost: 15
         designated-bridge: 0x1002.6C:3B:6B:7B:F9:08
  designated-internal-cost: 0
        designated-port-id: 0x80.1  
 designated-remaining-hops: 20                      
                tx-rx-bpdu: 3/7991                  
       discard-transitions: 0                       
       forward-transitions: 1                       
                  tx-rx-tc: 2/2                     
          topology-changes: 1                       

MSTP 示例

假设我们需要设计一个拓扑并以一种方式配置 MSTP,使 VLAN 10、20 通过一条路径转发,而 VLAN 30、40 通过不同的路径转发,同时所有其他 VLAN ID 将通过其中一条路径转发。通过设置 MST 实例并分配端口路径开销可以轻松实现这一点。下面您可以找到一个需要对 3 个独立区域按 VLAN 组进行负载均衡的网络拓扑作为示例:

MSTP Example

启用 MSTP 的网络拓扑,按 VLAN 组进行负载均衡

首先将每个接口添加到网桥。最初,您应创建一个未启用 VLAN 过滤的 (R)STP 网桥。这是为了防止失去对 CPU 的访问。此示例中的每个设备以其所在区域(Rx)和设备编号(_x)命名。对于较大型网络,配置 MSTP 可能由于链路和设备数量而令人困惑。我们建议使用 The Dude 来监控和设计网络拓扑。

  • 在 R1_1、R1_3、R2_1、R2_3、R3_1、R3_3 上使用以下命令:
/interface/bridge
add name=bridge protocol-mode=rstp vlan-filtering=no
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2
add bridge=bridge interface=ether3
add bridge=bridge interface=ether4
  • 在 R1_2、R2_2、R3_2 上使用以下命令。
/interface/bridge
add name=bridge protocol-mode=rstp vlan-filtering=no
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2
  • 请确保在这些设备上允许所需的 VLAN ID。这里我们将假设每个设备将收到需要按 VLAN 组进行负载均衡的已标记流量。在 R1_1、R1_3、R2_1、R2_3、R3_1、R3_3 上使用以下命令:
/interface/bridge/vlan
add bridge=bridge tagged=ether1,ether2,ether3,ether4 vlan-ids=10,20,30,40
  • 在 R1_2、R2_2、R3_2 上使用以下命令:
/interface/bridge/vlan
add bridge=bridge tagged=ether1,ether2 vlan-ids=10,20,30,40

警告

请确保将所有需要的 VLAN ID 和端口添加到网桥 VLAN 表,否则您的设备将无法转发所有必需的 VLAN,和/或您将失去对设备的访问。 我们需要为希望处于单个 MSTP 区域的每个网桥分配区域名称。您还可以指定区域修订号,但它是可选的,不过它们需要匹配。在此示例中,如果所有网桥具有相同的区域名称,那么它们都将处于单个 MSTP 网桥中。在此情况下,我们希望将一组 3 个网桥分隔到不同的 MSTP 区域,以按 VLAN 组进行负载均衡并创建多样性和可扩展性:

  • 为每个网桥设置适当的区域名称(和区域修订号),并在每个设备上使用以下命令(更改区域名称!):
/interface/bridge
set bridge region-name=Rx region-revision=1

在我们创建了 3 个不同的 MSTP 区域后,我们需要决定哪个设备将成为每个 VLAN 组的区域根。为了一致性,我们将每个区域中的第一个设备(_1)设置为 VLAN 10、20 的区域根,将每个区域中的第三个设备(_3)设置为 VLAN 30、40 的区域根。这可以通过为每个 VLAN 组创建 MST 实例并为其分配网桥优先级来完成。MST 实例标识符仅在 MSTP 区域内相关,在 MSTP 区域之外,这些标识符可以不同并映射到不同的 VLAN 组。

  • 在 R1_1、R2_1、R3_1 上使用以下命令:
/interface/bridge/msti
add bridge=bridge identifier=1 priority=0x1000 vlan-mapping=10,20
add bridge=bridge identifier=2 priority=0x3000 vlan-mapping=30,40
  • 在 R1_3、R2_3、R3_3 上使用以下命令:
/interface/bridge/msti
add bridge=bridge identifier=1 priority=0x3000 vlan-mapping=10,20
add bridge=bridge identifier=2 priority=0x1000 vlan-mapping=30,40
  • 在 R1_2、R2_2、R3_2 上使用以下命令。
/interface/bridge/msti
add bridge=bridge identifier=1 priority=0x2000 vlan-mapping=10,20
add bridge=bridge identifier=2 priority=0x2000 vlan-mapping=30,40

现在我们需要为每个 MST 实例覆盖端口 path-cost 和/或端口优先级。这可以通过为每个端口和每个 MST 实例添加 MST-Override 条目来完成。为了使某个 MST 实例的流量流动路径不同,我们只需确保端口路径开销和/或优先级更大。我们可以增加面向区域根桥的端口的端口路径开销或降低它。增加或降低所有值都无关紧要;重要的是最终一个端口的路径开销大于另一个。

  • 在 R1_1、R2_1、R3_1 上使用以下命令:
/interface/bridge/port/mst-override
add identifier=2 interface=ether1 internal-path-cost=5
add identifier=2 interface=ether2 internal-path-cost=15
  • 在 R1_2、R2_2、R3_2 上使用以下命令:
/interface/bridge/port/mst-override
add identifier=1 interface=ether1 internal-path-cost=5
add identifier=2 interface=ether2 internal-path-cost=9
  • 在 R1_3、R2_3、R3_3 上使用以下命令:
/interface/bridge/port/mst-override
add identifier=1 interface=ether2 internal-path-cost=5
add identifier=1 interface=ether3 internal-path-cost=9

在此情况下,对于 VLAN 10、20 从第一个设备到达第三个设备,它将在 ether1 和 ether2 之间选择,一个端口将被阻塞并设置为替代端口,ether1 的路径开销为 5+9=14,ether2 的路径开销为 10,ether2 将被选举为第三个设备上 MSTI1 的根端口。对于 VLAN 30、40 从第三个设备到达第一个设备,ether1 的路径开销为 5+9=14,ether2 的路径开销为 15,ether1 将被选举为第三个设备上 MSTI2 的根端口。

现在我们可以为 MSTI0 配置根端口,它将归入所有未分配给特定 MST 实例的 VLAN,如我们示例中的 VLAN 10、20 和 VLAN 30、40。要配置此特殊 MST 实例,您需要为网桥端口指定 internal-path-cost。此值仅与 MSTP 区域相关,在 MSTP 区域之外没有任何效果。在此示例中,我们将选择所有未知 VLAN 将通过与会 VLAN 30、40 相同的路径转发,我们只需增加其中一个端口的路径开销。

  • 在 R1_3、R2_3、R3_3 上使用以下命令:
/interface/bridge/port
set [find where interface=ether3] internal-path-cost=25

此时,可以认为单区域 MSTP 已配置完成,总体而言 MSTP 已完全正常工作。强烈建议配置 CIST 部分,但出于测试目的,可以保留默认值。在进行任何测试之前,您需要在所有网桥上启用 MSTP。

  • 在所有设备上使用以下命令:
/interface/bridge
set bridge protocol-mode=mstp vlan-filtering=yes

当 MSTP 区域已配置后,您可以通过转发流量来检查它们是否正确配置,例如,从第一个设备向第三个设备发送已标记流量,并更改已标记流量的 VLAN ID 以观察基于 VLAN ID 的不同路径。当这按预期工作时,您可以继续配置 CIST 相关参数以选举 CIST 根桥和 CIST 根端口。为了一致性,我们将选择第一个区域中的第一个设备作为 CIST 根桥,并为了确保在故障情况下的一致性,我们可以为所有其他网桥设置更高的优先级。

  • 在 R1_1: 上使用以下命令:
/interface/bridge
set bridge priority=0x1000
  • 在 R1_2 上使用以下命令:
/interface/bridge
set bridge priority=0x2000
  • ...

  • 在 R3_3 上使用以下命令:

/interface/bridge
set bridge priority=0x9000

我们还需要在每个网桥上选举一个根端口;为简单起见,我们将选择最接近 R1_1 且跳数最少的端口作为根端口。此时,选举根端口的过程与 (R)STP 中的过程相同。

  • 在 R3_3: 上使用以下命令:
/interface/bridge/port
set [find where interface=ether2] path-cost=30
set [find where interface=ether3] path-cost=40
set [find where interface=ether4] path-cost=20
  • 在 R1_3 和 R2_3: 上使用以下命令:
/interface/bridge/port
set [find where interface=ether2] path-cost=20
set [find where interface=ether3] path-cost=30
  • 在 R1_2 上使用以下命令:
/interface/bridge/port
set [find where interface=ether1] path-cost=30