目录

前言
RSTP 现存问题
  消耗硬体资源
  缺乏区域管理
  非开放标準
区域 Region
  Configuration Name
  Revision Number
  VLAN 及 Instance 对应表
Common and Internal Spanning Tree (CIST)
  CIST Root
  Regional Root
与 RSTP 或 STP 并存
用 VTP Version 3 设定 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,听起来相当複杂,在之後的部份将会深入说明。

非开放标準

由於 RSTP 是 Cisco 专有的,如网络里有其他牌子的 Switch,则要使用 Open Standard 的 MSTP (802.1s) 来享受快速的收敛时间。

区域 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 vlan 。留意 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 之中。