Multiple Spanning Tree Protocol (MSTP) 多重生成树协定

前言

Spanning Tree 的终极一课,就是 Multiple Spanning Tree Protocol (MSTP)。从传统 STP 至 RSTP,是速度的进化。而从 RSTP 至 MSTP 则是节省硬件资源和层级式管理的进化。MSTP (又名 802.1s) 继承了 RSTP 的 Synchronization Process 来达成高效率的收敛 (Convergence),而比 RSTP 优秀的是,MSTP 可把多个 Spanning Tree 分配给不同的 Instance 去减少整个 Spanning Tree 系统的 Topology 数量,本篇假设读者已深入了解 STP 与 RSTP 原理。

RSTP 现存问题

消耗硬体资源

Cisco 所支缓的 RSTP (或 STP) 都是 Per-VLAN Base 的,即是说 Spanning Tree Topology 数目等於 VLAN 数目。如果 Switch 有 100 个 VLAN 就要处理 100 个 Spanning Tree Topology,包括发送丶接收和运算 BPDU,VLAN 越多,对整个网络所有 Switch 的 CPU 和 RAM 资源都会造成压力。

MSTP 提出了 Instance 的想法,把多个 VLAN 分组成为不同的 Instance,同一组 Instance 的 VLAN 共用一组 Spanning Tree Topology。举例:VLAN101 至 VLAN200 共 100 组 VLAN,可把 VLAN101 至 VLAN150 编入 Instance 1,馀下的 VLAN151 至 VLAN200 编入 Instance 2。Spanning Tree Topology 数量由 100 个大大缩减至 2 个。

缺乏区域管理

RSTP 缺乏区域概念,难於管理。MSTP 可把整个网络分区 (Region) 管理,Region 与 Region 之间不会互相干扰 Topology。每个 Region 会构成一只巨大的虚拟 Switch (Virtual Switch),每个 Virtual Switch 之间会进行一个独立的 Spanning Tree 运算,而这个称为 Common and Internal Spanning Tree (CIST) 又不会影响 Region 里的 Topology,听起来相当复杂,在之後的部份将会深入说明。

区域 Region

同一 Region 里的 Switch 只会处理相同 Region 里的 BPDU 资讯,从而计算出 Topology。要判断是否身处在同一个 Region,Switch 会比较 spanning-tree mst configuration 中的 3 个参数。3 个参数均相同才算是同一个 Region。

Configuration Name

Configuration 的名称,用指令 name 去设定。

Revision Number

设定的版本编号,习惯上每次更改 mst 设定都应把 Revision number 加 1。设定指令为 revision

VLAN 及 Instance 对应表

设定 Instance 所包含的 VLAN,指令为 instance <num> vlan <num> 。留意 Cisco Switch 的 MSTP 预设 instance 0 用作 CIST,不可用作 Region 用途。

现在试为以下网络设定 MSTP。

mst

首先在每一只 Switch 都使用 spanning-tree mst configuration 进入 MST 设定,然後输入这 3 项必要的参数。

SW1(config)#spanning-tree mst
SW1(config)#spanning-tree mst configuration
SW1(config-mst)#name Region1
SW1(config-mst)#revision 1
SW1(config-mst)#instance 1 vlan 11-13
SW1(config-mst)#instance 2 vlan 21-23
SW2(config)#spanning-tree mst
SW2(config)#spanning-tree mst configuration
SW2(config-mst)#name Region1
SW2(config-mst)#revision 1
SW2(config-mst)#instance 1 vlan 11-13
SW2(config-mst)#instance 2 vlan 21-23
SW3(config)#spanning-tree mst
SW3(config)#spanning-tree mst configuration
SW3(config-mst)#name Region1
SW3(config-mst)#revision 1
SW3(config-mst)#instance 1 vlan 11-13
SW3(config-mst)#instance 2 vlan 21-23

然後可以用 show spanning-tree mst configuration 指令去检查一下。3 只 Switch 的结果应该是一模一样的。留意 MSTP 会把其馀的 VLAN 放进 Instance 0。

SW1#show spanning-tree mst configuration
Name      [Region1]
Revision  1     Instances configured 3

Instance  Vlans mapped
--------  ---------------------------------------------------------------------
0         1-10,14-20,24-4094
1         11-13
2         21-23
-------------------------------------------------------------------------------
SW2#show spanning-tree mst configuration
Name      [Region1]
Revision  1     Instances configured 3

Instance  Vlans mapped
--------  ---------------------------------------------------------------------
0         1-10,14-20,24-4094
1         11-13
2         21-23
-------------------------------------------------------------------------------
SW3#show spanning-tree mst configuration
Name      [Region1]
Revision  1     Instances configured 3

Instance  Vlans mapped
--------  ---------------------------------------------------------------------
0         1-10,14-20,24-4094
1         11-13
2         21-23
-------------------------------------------------------------------------------

确定无误後在每只 Switch 输入指令 spanning-tree mode mst,这样子 Region1 就建立起来了。

SW1(config)#spanning-tree mode mst
SW2(config)#spanning-tree mode mst
SW3(config)#spanning-tree mode mst

show spanning-tree 查看 MSTP 状态,发现一共有 3 个 Instance 正在执行中,除了刚刚我们建立的 Instance 1 (MST1) 和 2 (MST2) 外,还有 1 个 Instance 0 (MST0)。Instance 0 是预设的,用来作 CIST 之用,稍後详细说明。现只集中研究 MST1 和 MST2,并发现 SW1 是 MST1 与 MST2 的 Root Switch。

SW1#show spanning-tree

MST0
  Spanning tree enabled protocol mstp
  Root ID    Priority    32768
             Address     aabb.cc00.0400
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32768  (priority 32768 sys-id-ext 0)
             Address     aabb.cc00.0400
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1    Shr
Et0/1               Desg FWD 2000000   128.2    Shr


MST1
  Spanning tree enabled protocol mstp
  Root ID    Priority    32769
             Address     aabb.cc00.0400
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.0400
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1    Shr
Et0/1               Desg FWD 2000000   128.2    Shr


MST2
  Spanning tree enabled protocol mstp
  Root ID    Priority    32770
             Address     aabb.cc00.0400
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32770  (priority 32768 sys-id-ext 2)
             Address     aabb.cc00.0400
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1    Shr
Et0/1               Desg FWD 2000000   128.2    Shr

假设我们希望 MST2 由 SW2 来做 Root Switch,可用以下指令更改 Priority,与 RSTP/STP 不同的是,MSTP 要改的是 Instance,而不是 VLAN。

SW2(config)#spanning-tree mst 2 priority 28672
SW2(config)#exit
SW2#
SW2#show spanning-tree mst 1-2

##### MST1    vlans mapped:   11-13
Bridge        address aabb.cc00.0500  priority      32769 (32768 sysid 1)
Root          address aabb.cc00.0400  priority      32769 (32768 sysid 1)
            port    Et0/1           cost      2000000              rem hops 19

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Root FWD 2000000   128.2    Shr

##### MST2    vlans mapped:   21-23
Bridge        address aabb.cc00.0500  priority      28674 (28672 sysid 2)
Root          this switch for MST2

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Desg FWD 2000000   128.2    Shr

如在 SW3 查看 show spanning-tree 就发现 SW3 正在分别用 Et0/0 和 Et0/1 来传输 MST1 和 MST2,由此可见 MSTP 一样可以实现在 STP 或 RSTP 那种 Load Balancing。当然我们也可以透过修改 Port Cost 或 Port Priority 等去影响 Topology 结果,指令跟 STP 一样,只不过把 vlan 改成了 mst,本篇假设读者已了解 STP 设定,在此不再重覆解说了。

SW3#show spanning-tree mst 1-2

##### MST1    vlans mapped:   11-13
Bridge        address aabb.cc00.0700  priority      32769 (32768 sysid 1)
Root          address aabb.cc00.0400  priority      32769 (32768 sysid 1)
            port    Et0/0           cost      2000000              rem hops 19

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Root FWD 2000000   128.1    Shr
Et0/1            Altn BLK 2000000   128.2    Shr

##### MST2    vlans mapped:   21-23
Bridge        address aabb.cc00.0700  priority      32770 (32768 sysid 2)
Root          address aabb.cc00.0500  priority      28674 (28672 sysid 2)
            port    Et0/1           cost      2000000              rem hops 19

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Altn BLK 2000000   128.1    Shr
Et0/1            Root FWD 2000000   128.2    Shr

Common and Internal Spanning Tree (CIST)

现在我们把眼光放远一点,如果网络里出现另一个 Region,MSTP 又会如何处理呢?首先要重提,各 Region 的 Spanning Tree 互相并不影响 Topology。有趣的是,MSTP 会把这些 Region 当成一只只巨大的 Virtual Switch 去看代,请看下图。

mst

Instance 0 就是 Cisco 预设的 CIST,CIST 将会把整个 Region 变成 Virtual Switch,在此之前,CIST 需要先找出 CIST Root 和 Regional Root。

CIST Root

整个网络 (包含所有 Region) 会拣选一只 Bridge Prioriy 最低的 Switch 来当 CIST Root,这可以算是 MST 里的超级 Root 了。拥有这只超级 Root 的 Virtual Switch 将会成为 CIST 的 Virtual Root Switch。以上图为例,SW6 因为 Bridge Priority 最小而成为 CIST Root,由於 CIST Root 身处 Region2,因此,Region2 将会成为 Virtual Root Switch。

SW6#show spanning-tree mst 0

##### MST0    vlans mapped:   1-10,14-20,24-4094
Bridge        address aabb.cc00.0600  priority      24576 (24576 sysid 0)
Root          this switch for the CIST
Operational   hello time 2 , forward delay 15, max age 20, txholdcount 6
Configured    hello time 2 , forward delay 15, max age 20, max hops    20

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Desg FWD 2000000   128.2    Shr
Et0/2            Desg FWD 2000000   128.3    Shr

Regional Root

有连着其他 Region 的 Switch 称为 Boundary Switch,在 Region1 中,SW1 和 SW2 都是 Boundary Switch。而在 Boundary Switch 中,Bridge Prioriy 最低的 Switch 会再晋升成为 Regional Root。在上图中 SW1 Bridge Priority 比 SW2 低,因此 SW1 成为 Region1 的 Regional Root。

mst

於是 CIST 就会把两个 Region 看成两只 Virtual Switch,接下来,CIST 就会用和 RSTP/STP 一样的方法去防止 Loop 发生。

mst

已知 Region2 是 Virtual Root Switch,下一步就要决定 Root Port丶Designated Port丶Alternate Port 或 Backup Port。CIST 会用以下步骤去决定。

首先,各 Region (除了成为 Virtual Root Switch 的 Region) 的 Regional Root 拣选自己 Root Cost 最小的一个 Port 成为 Root Port,如遇 Root Cost 值相同,则再用其他因素决定,与传统 STP 方法相同,在此不重覆阐述。所以 SW1 的 e0/2 会成为 Region 1 的 Root Port。

SW1#show spanning-tree mst 0

##### MST0    vlans mapped:   1-10,14-20,24-4094
Bridge        address aabb.cc00.0400  priority      32768 (32768 sysid 0)
Root          address aabb.cc00.0600  priority      24576 (24576 sysid 0)
              port    Et0/2           path cost     2000000
Regional Root this switch
Operational   hello time 2 , forward delay 15, max age 20, txholdcount 6
Configured    hello time 2 , forward delay 15, max age 20, max hops    20

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Desg FWD 2000000   128.2    Shr
Et0/2            Root FWD 2000000   128.3    Shr

有了 Root Port 後,每一个网段都选 Root Cost 最小的 Port 成为 Designated Port,方法亦与 STP 相同。SW4 e0/0 和 SW5 e0/0 会成为 Designated Port。

SW4#show spanning-tree

MST0
  Spanning tree enabled protocol mstp
  Root ID    Priority    24576
             Address     aabb.cc00.0600
             Cost        0
             Port        3 (Ethernet0/2)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32768  (priority 32768 sys-id-ext 0)
             Address     aabb.cc00.0200
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1 Shr 
Et0/1               Desg FWD 2000000   128.2 Shr 
Et0/2               Root FWD 2000000   128.3 Shr
SW5#show spanning-tree mst 0

##### MST0    vlans mapped:   1-10,14-20,24-4094
Bridge        address aabb.cc00.0300  priority      32768 (32768 sysid 0)
Root          address aabb.cc00.0200  priority      32768 (32768 sysid 0)
              port    Et0/1           path cost     0
Regional Root address aabb.cc00.0200  priority      32768 (32768 sysid 0)
                                      internal cost 2000000   rem hops 19
Operational   hello time 2 , forward delay 15, max age 20, txholdcount 6
Configured    hello time 2 , forward delay 15, max age 20, max hops    20

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Root FWD 2000000   128.2    Shr
Et0/2            Desg FWD 2000000   128.3    Shr

最後,其馀的 Port 则会设定为 Alternate Port 或 Backup Port,并把 Port State 变成 Blocking 避免 Loop 发生。拣选方法与 RSTP 相同。

SW2#show spanning-tree mst 0

##### MST0    vlans mapped:   1-10,14-20,24-4094
Bridge        address aabb.cc00.0500  priority      32768 (32768 sysid 0)
Root          address aabb.cc00.0600  priority      24576 (24576 sysid 0)
              port    Et0/1           path cost     2000000
Regional Root address aabb.cc00.0400  priority      32768 (32768 sysid 0)
                                      internal cost 2000000   rem hops 19
Operational   hello time 2 , forward delay 15, max age 20, txholdcount 6
Configured    hello time 2 , forward delay 15, max age 20, max hops    20

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Et0/0            Desg FWD 2000000   128.1    Shr
Et0/1            Root FWD 2000000   128.2    Shr
Et0/2            Altn BLK 2000000   128.3    Shr

於是,网络就变成以下这个模样。

mst

与 RSTP 或 STP 并存

由於把使用 RSTP/STP 的网络改为使用 MSTP 是一项十分浩瀚的工程,难免要分阶段进行,以致网络里很大机会同时存在 MSTP 和 RSTP/STP 的 Switch。幸好 MSTP 是可以向下兼容 RSTP/STP 的,我们可以试试在上面的 MSTP 网络中加入一只 RSTP Switch,看看出现什麽状况。

mst

如果把 Region1 与 Region2 幻化为 Virtual Switch,便可看得简单一点,其实就是以下这个模样,同意吗?

mst

由於 Region2 是 Root Bridge,SW7 e0/1 顺理成章成为 Root Port,而 Region 1 与 SW7 之间的网段,就因为 SW7 那边 Root Cost 较小而胜出成为 DP,这些只是简单 STP 层面的运算,在此不再详述了。

比较想跟读者说明的是关於 BPDU 背後的操作,MSTP 是怎样相容 RSTP/STP 的呢?由於 MSTP 的 BPDU 是以 Instance 作为单位的,而不是 VLAN,理论上 RSTP/STP 是看不懂由 MSTP 传来的 BPDU。秘密在於 MSTP 能够侦测到对方是在运行 MSTP 还是 RSTP/STP,一但发现对方是 RSTP/STP,MSTP 就会把 BPDU 拆散成 Per VLAN 形式发送,如果存在 100 个 VLAN 就发 100 个 BPDU 过去 (事实上和传统 RSTP/STP 一样),这样 SW7 便能够用 RSTP/STP 来配合了。另外,SW7 当然也可以透过改变 Port 的 STP Cost 来达成 Load Balancing。

那麽,我们可以用新加入的 SW7 来成为 Root 吗?试试看。

SW7(config)#spanning-tree vlan 1-4094 root primary

出事了!SW2 和 SW5 都会出现 Inconsitent 的讯息,而且把 Port Block 掉。因为 Cisco MSTP 只支缓用 CIST 成为 Root,非常重要,设定时要注意了。

SW5#
*Mar  7 11:59:17.754: %SPANTREE-2-PVSTSIM_FAIL: Blocking root port Et0/3: Inconsitent inferior PVST BPDU received on VLAN 11, claiming root 20491:aabb.cc00.0100
SW5#show spanning-tree

MST0
  Spanning tree enabled protocol mstp
  Root ID    Priority    20481
             Address     aabb.cc00.0100
             Cost        2000000
             Port        4 (Ethernet0/3)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32768  (priority 32768 sys-id-ext 0)
             Address     aabb.cc00.0300
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1    Shr
Et0/1               Desg FWD 2000000   128.2    Shr
Et0/2               Desg FWD 2000000   128.3    Shr
Et0/3               Root BKN*2000000   128.4    Shr Bound(PVST) *PVST_Inc
SW2#
*Mar  7 11:59:17.438: %SPANTREE-2-PVSTSIM_FAIL: Blocking root port Et0/3: Inconsitent inferior PVST BPDU received on VLAN 11, claiming root 20491:aabb.cc00.0100
SW2#show spanning-tree

MST0
  Spanning tree enabled protocol mstp
  Root ID    Priority    20481
             Address     aabb.cc00.0100
             Cost        2000000
             Port        4 (Ethernet0/3)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32768  (priority 32768 sys-id-ext 0)
             Address     aabb.cc00.0500
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 2000000   128.1    Shr
Et0/1               Desg FWD 2000000   128.2    Shr
Et0/2               Altn BLK 2000000   128.3    Shr Bound(RSTP)
Et0/3               Root BKN*2000000   128.4    Shr Bound(PVST) *PVST_Inc

用 VTP Version 3 设定 MSTP

MSTP 有一个很麻烦的问题就是那个 VLAN 及 Instance 对应表的设定,由於各 Switch 间的设定必需相同才能让 Switch 处於同一个 Region。试想想,如果我这个 Region 有一百只 Switch,每次要动这个设定的时候,岂不是要到所有一百只 Switch 去更改?这显然不是理想的做法。解决方法是 VTP Version 3,如果网络有使用 VTP Version 3 来传递 VLAN 设定的话,现在就可以一并传递 MSTP 设定了。

关於 VTP Version 3 的理论可看这篇文章。现为以下网络设定 VTP,假设 SW3 为 VTP Server,SW1 和 SW2 同为 VTP Client。

mst

SW3(config)#vtp domain jannet
Changing VTP domain name from ccie to jannet
SW3(config)#vtp password ccie
Setting device VTP password to ccie
SW3(config)#vtp version 3
SW3(config)#vtp mode server vlan
Setting device to VTP Server mode for VLAN.
SW3(config)#vtp mode server mst
Setting device to VTP Server mode for MST.
SW1(config)#vtp domain jannet
Changing VTP domain name from ccie to jannet
SW1(config)#vtp password ccie
Password already set to ccie
SW1(config)#vtp version 3
SW1(config)#vtp mode client vlan
Setting device to VTP Client mode for VLANS.
SW1(config)#vtp mode client mst
Setting device to VTP Client mode for MST.
SW2(config)#vtp domain jannet
Changing VTP domain name from ccie to jannet
SW2(config)#vtp password ccie
Password already set to ccie
SW2(config)#vtp version 3
SW2(config)#vtp mode client vlan
Setting device to VTP Client mode for VLANS.
SW2(config)#vtp mode client mst
Setting device to VTP Client mode for MST.

以後,要更新 MSTP 设定就可以只在 VTP Server 更新,然後输入指令 vtp primary mst 升级成 VTP Primary Server,MSTP 设定就会散播到 VTP Client。

SW3#vtp primary mst
This system is becoming primary server for feature  mst
No conflicting VTP3 devices found.
Do you want to continue? [confirm]
SW3#
*Mar  7 12:33:28.789: %SW_VLAN-4-VTP_PRIMARY_SERVER_CHG: aabb.cc00.0700 has become the primary server for the MST VTP feature

更新完成後建议把其免去 Primary Server 的角色,避免发生意外更新。方法是把 VTP mode 改成 Transparent 再改回 Server。

SW3(config)#vtp mode transparent mst
Setting device to VTP Transparent mode for MST.
SW3(config)#vtp mode server mst
Setting device to VTP Server mode for MST.

然而,用 VTP Version 3 发放 MSTP 设定有一点需要注意的,由於每一个 MST Region 的设定是不相同的,因此每个 Region 都需要放於不同的 VTP Domain 之中。

相關主題

发表回复

2021-07-22

Posted In: Layer 2 网络技术, menu-tall-3-zh-hans

Leave a Comment