STP
{Back to Index}  

Table of Contents

以太网交换机使用生成树协议 STP ,可以在提高网络可靠性的同时,又避免环路带来的各种问题:

1 STP (802.1D)

1.1 生成树算法

1.1.1 选举1根桥

根桥的选举条件是:桥 ID 最小者当选。

根桥的角色是 可被抢占 的。

桥 ID 包含两部分:

  • 优先级

    SW2#show spanning-tree
    
    VLAN0001
      Spanning tree enabled protocol ieee
      Root ID    Priority    8193
                 Address     aabb.cc00.2000
                 This bridge is the root
                 Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
    
      Bridge ID  Priority    8193   (priority 8192 sys-id-ext 1)
                 Address     aabb.cc00.2000
                 Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
                 Aging Time  300 sec
    
    Interface           Role Sts Cost      Prio.Nbr Type
    ------------------- ---- --- --------- -------- --------------------------------
    Et0/0               Desg FWD 100       128.1    P2p
    Et0/2               Desg FWD 100       128.3    P2p
    Et0/3               Desg FWD 100       128.4    P2p
    

    通过 SW2(config)#spanning-tree vlan 1 priority <prio> 进行修改。

  • 基本 MAC 地址

    SW2#show interfaces | include bia
      Hardware is Ethernet, address is aabb.cc00.2000 (bia aabb.cc00.2000) # 第一行 MAC 地址既是基本 MAC ,也称为背板 MAC
      Hardware is Ethernet, address is aabb.cc00.2010 (bia aabb.cc00.2010)
      Hardware is Ethernet, address is aabb.cc00.2020 (bia aabb.cc00.2020)
      Hardware is Ethernet, address is aabb.cc00.2030 (bia aabb.cc00.2030)
    

1.1.2 在每个非根桥上选举根端口

根端口可以看成是朝向根桥的端口(离根桥最近)。

每个非根交换机上有且只有一个根端口(RP),用于接收根桥发来的 BPDU ,也用来转发流量。

选举规则:

  • 端口到根桥的路径成本最小
  • 对端桥 ID 最小
  • 对端端口 ID 最小

1.1.3 为每个 Segment 选举指定端口

每个 Segment 有且只有一个 指定端口(DP),用于转发根交换机发来的 BPDU 和数据流量。

DP 可以看做是 网段上离根桥最近的接口。

选举规则:

  • 根桥的所有端口都是 DP
  • 根端口的对端一定是 DP
  • 端口到根桥的路径成本最小
  • 本网桥 ID 最小

1.1.4 阻塞非指定端口

非指定端口即为 备用端口 (AP),将其阻塞。

1.2 端口状态

状态 收发数据 收 BPDU 发 BPDU 学习 MAC
Disable
Blocking
Listening
Learning
Forwarding

port_state.jpeg

Figure 1: STP 端口状态转换过程

1.3 收敛时间

  • 初次收敛

    30s = 15s(Listen) + 15(Learn)

  • 拓扑发生变化
    • 本地存在阻塞端口

      若其他端口断开,所有阻塞端口进入 Listen 状态(选举),结果若为启用,则再将进入 Learn 状态,前后总共需要 30s 。

    • 本地不存在阻塞端口 (参考 SW2 )

      若某个根端口断开,则会通过 DP 发送次优 BPDU ,由于对端交换机端口无视该 BPDU ,则 20s Max Age 超时后 对端端口 会进入 Listen 状态,接着进入 Learn 状态,因此总共需要 50s 网络才能收敛。

1.4 配置

1.4.1 设置桥优先级

Switch(config)# spanning-tree vlan VlanId priority Pri

1.4.2 设置主次根

Switch(config)# spanning-tree vlan VlanId root {primary | secondary} [diameter Diameter]

在全网使用默认优先级(32768)的情况下:

  • 如果是 primary ,则该交换机针对该VLAN生成树优先级调整为 24576
  • 如果是 secondary,则为 28672

实际上这条命令就是检测目前网络中的其他设备的网桥优先级,并且来调整自己的优先级。

Diameter 参数会影响 STP 计时器,不同的值将导致交换机自动调整 forward-delaymax-age 计时器,这条命令一般在根桥上配置,这样计时器的值会通过 BPDU 传递到其他交换机。

1.4.3 设置接口 Cost

Switch(config-if)# spanning-tree [vlan VlanId ] cost Cost

1.4.4 设置接口优先级

Switch(config-if)# spanning-tree [vlan VlanId ] port-priority Pri

2 RSTP (802.1w) 2

2.1 端口状态

xclassic-vs-rapid-spanning-tree-port-states.png

Figure 2: 与 STP 端口状态比较

当 AP 和 BP 有朝一日被唤醒时,会先进入 Learning 状态,然后进入 Forwarding 状态。

2.2 端口角色

rstp_port_role.png

Figure 3: 端口角色

2.2.1 Alternative 与 Backup 区别

  • AP 是 不同交换机端口之间 进行优先级比较的结果,即 AP 会从其他交换机的 DP 收到更佳 BPDU 。 AP 可以看作是 RP 的备份,因为它 为本交换机 提供 通往根桥的后备路径
  • Backup 是 同一交换机端口之间 比较的结果,即 BP 会从本交换机的 DP 收到更佳 BPDU 。 BP 为所在网段 提供通往根桥的后备路径,因此 BP 可以看作 DP 的备份,当 DP 挂掉,BP 成为新的 DP 。

2.3 Link Type

2.3.1 Edge

类似于 STP 中的 portfast ,允许该接口由 Discarding 直接进入 Forwaring ,同时该接口也不会产生 TCN 。

RSTP 中沿用命令 spanning-tree portfast 来对接口进行配置。

2.3.2 P2P

Full Duplex Port 判定为 Point to Point Port ,并使用 RSTP 相互通信。

2.3.3 Shared

Half Duplex Port 判定为 Shared Port ,并使用传统 STP 相互通信。

2.4 Synchronization Process (PA) 3

每当有新交换机加入,就会发起 Synchronization ,新加入者会假设自己是根桥并 通过 P2P Port 向相邻的交换机发出 Proposal 消息,希望对方 同意 自己成为根桥。

收到 Proposal 的交换机根据实际情况(新成员是否比当前根桥更理想)回复对方:

不接收新成员成为根桥

rstp_sync1.png

Figure 4: 新成员无法成为根桥的流程

同意新成员成为根桥

rstp_sync_2_1.png

rstp_sync_2_2.png

3 MSTP (802.1s)

使用 Instance 的概念来划分 VLAN 组。

3.1 配置

需指定:

  • Domain Name
  • Revision Number
  • VLAN Association Table
spanning-tree mode mst
spanning-tree mst configuration
 name cisco.com
 revision 1
 instance 1 vlan 10, 30, 50
 instance 2 vlan 20, 40, 60
spanning-tree mst 1 priority 24576 # 这条配置是由该命令生成:spanning-tree mst 1 root primary
spanning-tree mst 2 priority 28672 # 这条配置是由该命令生成:spanning-tree mst 2 root secondary

4 用于加快收敛的特性

4.1 portfast 4

该特性使得接口可以绕过 listeninglearning 状态直接进入 forwarding 状态。

与该特性接口相连的通常是 路由器或 PC ,如果连的是交换机,这个接口仍然要接受 STP 的计算,如果计算结果是 blocking ,那么这个接口仍然会被阻塞。 这就是为什么执行该条命令,交换机会提示可能会造成短暂的环路:

%Warning: portfast should only be enabled on ports connected to a single
 host. Connecting hubs, concentrators, switches, bridges, etc... to this
 interface  when portfast is enabled, can cause temporary bridging loops.
 Use with CAUTION

%Portfast will be configured in 2 interfaces due to the range command
 but will only have effect when the interfaces are in a non-trunking mode.

portfast.png

Figure 7: 实验环境

初始配置
---------- SW ---------------
en
debug spanning-tree events
conf t
hostname SW
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
exit
int range e0/0-1
  sh ! shutdown at first
exit
不启用时接口状态变化
SW(config)#int e0/0
SW(config-if)#no sh
SW(config-if)#
*Jul  6 12:54:45.464: set portid: VLAN0001 Et0/0: new port id 8001
*Jul  6 12:54:45.464: STP: VLAN0001 Et0/0 -> listening
SW(config-if)#
*Jul  6 12:54:47.464: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to up
*Jul  6 12:54:48.464: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to up
SW(config-if)#
*Jul  6 12:55:00.468: STP: VLAN0001 Et0/0 -> learning
SW(config-if)#
*Jul  6 12:55:15.469: STP[1]: Generating TC trap for port Ethernet0/0
*Jul  6 12:55:15.469: STP: VLAN0001 Et0/0 -> forwarding
启用 portfast
int range e0/0-1
  switchport mode access
  spanning-tree portfast
启用 portfast 后接口状态变化
SW(config)#int e0/0
SW(config-if)#no sh
SW(config-if)#
*Jul  6 13:00:27.708: set portid: VLAN0001 Et0/0: new port id 8001
*Jul  6 13:00:27.709: STP: VLAN0001 Et0/0 ->jump to forwarding from blocking
SW(config-if)#

4.2 uplinkfast 5

uplinkfast.png

Figure 8: 实验环境

本质上是为了实现 RP 的快速切换。

当关闭 SW3 的 e0/2 端口(模拟 SW1 与 SW3 之间的 uplink 发生故障),由于 SW3 知道 uplink 已经 down 了, 因此 e0/1 直接进入 forwarding 状态。6

初始配置
----------------- SW1 ----------------------
en
debug spanning-tree events
conf t
hostname SW1
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
exit
spanning-tree vlan 1 root primary
----------------- SW2 ----------------------
en
debug spanning-tree events
conf t
hostname SW2
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
exit
spanning-tree vlan 1 root secondary
----------------- SW3 ----------------------
en
debug spanning-tree events
conf t
hostname SW3
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
exit
关闭 SW3 e0/2 口后,e0/1 的状态变化
SW3(config)#int e0/2
SW3(config-if)#sh
SW3(config-if)#
*Jul  6 14:27:00.201: STP: VLAN0001 new root port Et0/1, cost 200
*Jul  6 14:27:00.201: STP: VLAN0001 Et0/1 -> listening
*Jul  6 14:27:00.201: STP[1]: Generating TC trap for port Ethernet0/2
SW3(config-if)#
*Jul  6 14:27:02.204: %LINK-5-CHANGED: Interface Ethernet0/2, changed state to administratively down
SW3(config-if)#
*Jul  6 14:27:02.204: STP: VLAN0001 sent Topology Change Notice on Et0/1
*Jul  6 14:27:03.208: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/2, changed state to down
SW3(config-if)#
*Jul  6 14:27:15.208: STP: VLAN0001 Et0/1 -> learning
SW3(config-if)#
*Jul  6 14:27:30.208: STP[1]: Generating TC trap for port Ethernet0/1
*Jul  6 14:27:30.208: STP: VLAN0001 sent Topology Change Notice on Et0/1
*Jul  6 14:27:30.209: STP: VLAN0001 Et0/1 -> forwarding
SW3(config-if)#
配置 uplinkfast
SW3(config)#spanning-tree uplinkfast
SW3(config)#
*Jul  6 14:41:39.392: setting bridge id (which=1) prio 49153 prio cfg 49152 sysid 1 (on) id C001.aabb.cc00.3000
*Jul  6 14:41:39.392: STP: VLAN0001 Et0/1 -> blocking (uplinkfast)
*Jul  6 14:41:39.392: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 Ethernet0/2 moved to Forwarding (UplinkFast).
SW3(config)#
*Jul  6 14:41:39.392: STP[1]: Generating TC trap for port Ethernet0/2
*Jul  6 14:41:39.392: STP: VLAN0001 sent Topology Change Notice on Et0/2
查看 SW3 状态
SW3(config)#do sh spanning-tree
! 降低优先级和增加 cost 的目的在于不让 SW3 变为新的根桥
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    24577
             Address     aabb.cc00.1000
             Cost        3100 ! cost 增加
             Port        3 (Ethernet0/2)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    49153  (priority 49152 sys-id-ext 1) ! 优先级降低
             Address     aabb.cc00.3000
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec
  Uplinkfast enabled

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg FWD 3100      128.1    P2p
Et0/1               Altn BLK 3100      128.2    P2p
Et0/2               Root FWD 3100      128.3    P2p
Et0/3               Desg FWD 3100      128.4    P2p
SW3#sh spanning-tree uplinkfast
UplinkFast is enabled

Station update rate set to 150 packets/sec.

UplinkFast statistics
-----------------------
Number of transitions via uplinkFast (all VLANs)            : 0
Number of proxy multicast addresses transmitted (all VLANs) : 0

Name                 Interface List
-------------------- ------------------------------------
VLAN0001             Et0/2(fwd), Et0/1 ! 表明如果 e0/2 down 了,e0/1 立即转为 fwd
再次关闭 e0/2 口,并观察现象
SW3(config)#int e0/2
SW3(config-if)#
SW3(config-if)#sh
SW3(config-if)#
*Jul  6 14:51:08.996: STP: VLAN0001 new root port Et0/1, cost 3200
*Jul  6 14:51:08.996: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 Ethernet0/1 moved to Forwarding (UplinkFast).
SW3(config-if)#
*Jul  6 14:51:08.996: STP[1]: Generating TC trap for port Ethernet0/1
*Jul  6 14:51:08.996: STP[1]: Generating TC trap for port Ethernet0/2
SW3(config-if)#
*Jul  6 14:51:10.995: %LINK-5-CHANGED: Interface Ethernet0/2, changed state to administratively down
SW3(config-if)#
*Jul  6 14:51:10.999: STP: VLAN0001 sent Topology Change Notice on Et0/1
SW3(config-if)#
*Jul  6 14:51:11.995: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/2, changed state to down

4.3 backbonefast 7

不启用特性时的逻辑:

  • 当 SW2 发现链路断开,会向 SW3 发送 BPDU (声明自己为 Root)
  • SW3 e0/1 接口收到 次优 BPDU (因为之前收到的 BPDU 声明的 Root 是 SW1)
  • SW3 e0/1 接口会忽略次优 BPDU 并持续等待原先较优的 BPDU ,最终会在 20s 后超时,然后历经 Listen 和 Learn 最后进入 Forward 状态 (耗时 50s)

启用特性后的逻辑:

  • SW3 e0/1 接口收到 次优 BPDU
  • SW3 通过 RP 接口发出 RLQ (Root Link Query) 消息用于检测原根桥是否仍然存在
  • SW1 收到 RLQ 后回复 RLQ Reply
  • SW3 收到 RLQ Reply 后,将 e0/1 接口直接从 BLK 状态转为 LISTEN 状态

backbonefast.png

Figure 9: 实验环境

初始配置
----------------- SW1 ----------------------
en
debug spanning-tree events
conf t
hostname SW1
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
spanning-tree vlan 1 root primary
----------------- SW2 ----------------------
en
debug spanning-tree events
conf t
hostname SW2
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
spanning-tree vlan 1 root secondary
----------------- SW3 ----------------------
en
debug spanning-tree events
conf t
hostname SW3
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
shutdown SW2/e0/0 观察 SW3
SW3#
*Jul  9 14:22:57.241: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1 ! SW2/e0/0 一下电,SW3 就开始收到次优 BPDU
SW3#
*Jul  9 14:22:58.424: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:00.429: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:02.432: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:04.437: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:06.445: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:08.450: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:10.454: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:12.462: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
SW3#
*Jul  9 14:23:14.466: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
*Jul  9 14:23:15.238: STP: VLAN0001 Et0/1 -> listening ! 经历了 20s
SW3#
*Jul  9 14:23:16.275: STP: VLAN0001 Topology Change rcvd on Et0/1
*Jul  9 14:23:16.275: STP: VLAN0001 sent Topology Change Notice on Et0/2
SW3#
*Jul  9 14:23:30.238: STP: VLAN0001 Et0/1 -> learning
SW3#
*Jul  9 14:23:45.238: STP[1]: Generating TC trap for port Ethernet0/1
*Jul  9 14:23:45.238: STP: VLAN0001 sent Topology Change Notice on Et0/2
*Jul  9 14:23:45.238: STP: VLAN0001 Et0/1 -> forwarding
为每个 SW 开启特性
----------------- SW1 ----------------------
en
debug spanning-tree events
conf t
hostname SW1
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
spanning-tree backbonefast
spanning-tree vlan 1 root primary
----------------- SW2 ----------------------
en
debug spanning-tree events
conf t
hostname SW2
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
spanning-tree backbonefast
spanning-tree vlan 1 root secondary
----------------- SW3 ----------------------
en
debug spanning-tree events
conf t
hostname SW3
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
spanning-tree backbonefast
shutdown SW2/e0/0 再次观察 SW3
SW3(config)#
*Jul  9 14:40:47.652: STP: VLAN0001 heard root 28673-aabb.cc00.2000 on Et0/1
*Jul  9 14:40:47.653: STP: VLAN0001 Et0/1 -> listening
*Jul  9 14:40:48.653: STP: VLAN0001 Topology Change rcvd on Et0/1
*Jul  9 14:40:48.653: STP: VLAN0001 sent Topology Change Notice on Et0/2
SW3#sh spanning-tree backbonefast
BackboneFast is enabled

BackboneFast statistics
-----------------------
Number of transition via backboneFast (all VLANs)           : 1
Number of inferior BPDUs received (all VLANs)               : 1
Number of RLQ request PDUs received (all VLANs)             : 0
Number of RLQ response PDUs received (all VLANs)            : 1
Number of RLQ request PDUs sent (all VLANs)                 : 1
Number of RLQ response PDUs sent (all VLANs)                : 0

5 用于保护 Topology 的特性

5.1 BPDUGuard

  • 该接口在收到 BPDU 报文后(即接口接到交换机上),会立即切换到 err-disable 状态
  • 常搭配 portfast 特性在接口上一起使用,用于连接主机,并预防误接交换机

bpduguard.png

Figure 10: 实验环境

初始配置(先配置 SW2)
----------------- SW1 ----------------------
en
debug spanning-tree events
conf t
hostname SW1
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
int e0/0
  spanning-tree portfast
  spanning-tree bpduguard enable
----------------- SW2 ----------------------
en
debug spanning-tree events
conf t
hostname SW2
no ip do lo
line con 0
  exec-timeout 0 0
  logging synchronous
  exit
int e0/0
  sh ! shutdown at first
开启 SW2 e0/0 端口并观察 SW1
SW1(config-if)#
*Jul 10 15:49:17.752: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/0 with BPDU Guard enabled. Disabling port.
*Jul 10 15:49:17.753: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state
SW1(config-if)#
*Jul 10 15:49:17.753: STP: VLAN0001 we are the spanning tree root
*Jul 10 15:49:18.756: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down
SW1(config-if)#
*Jul 10 15:49:19.756: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
SW1#show interfaces status err-disabled

Port      Name               Status       Reason               Err-disabled Vlans
Et0/0                        err-disabled bpduguard

5.2 BPDUFilter

5.2.1 全局配置

spanning-tree portfast edge bpdufilter default

  • 接口在上电后会发送 a few BPDU (出于防环和收敛目的),此后不再发送 BPDU
  • 接口在收到 BPDU 后立即丢失 portfast 及 bpdufilter 特性,成为一个普通的 spanning-tree 接口

5.2.2 接口配置

spanning-tree bpdufilter enable

  • 和 BPDUGuard 作用类似 ,但是不会使接口进入 err-disable 状态,仅仅是 忽略 收到的 BPDU
  • 接口也 不会发送 BPDU
  • 等效于在接口上关闭 STP 功能,可能导致环路
  • 接口上配置,不一定必须具备 portfast 特性,可独立设置

5.3 RootGuard

交换机会让使用该特性的端口强制成为 DP ,如该端口上收到了更优的 BPDU ,则会进入 root-inconsistent 状态,并标记为 broken ,也不会转发流量。
如果一段时间内没有再收到更优的 BPDU ,则会自动消除 inconsistent 状态。
该特性能有效巩固当前环境中根桥的地位。

rootguard.png

Figure 11: 实验环境

初始配置(先配置 SW4) ----------------- SW1 ---------------------- en debug spanning-tree events conf t hostname SW1 no ip do lo line con 0 exec-timeout 0 0 logging synchronous exit spanning-tree vlan 1 root primary ----------------- SW2 ---------------------- en debug spanning-tree events conf t hostname SW2 no ip do lo line con 0 exec-timeout 0 0 logging synchronous exit spanning-tree vlan 1 root secondary ----------------- SW3 ---------------------- en debug spanning-tree events conf t hostname SW3 no ip do lo line con 0 exec-timeout 0 0 logging synchronous exit int e0/0 spanning-tree guard root ----------------- SW4 ---------------------- en debug spanning-tree events conf t hostname SW4 no ip do lo line con 0 exec-timeout 0 0 logging synchronous exit spanning-tree vlan 1 priority 4096 int e0/0 shutdown ! shutdown at first
启用 SW4 e0/0 并观察SW3
SW3(config-if)#
*Jul 11 01:58:36.046: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port Ethernet0/0.
SW3(config-if)#
*Jul 11 01:59:24.800: STP: VLAN0001 heard root  4097-aabb.cc00.4000 on Et0/0
*Jul 11 01:59:24.800:     supersedes 24577-aabb.cc00.1000
*Jul 11 01:59:24.800: %SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port Ethernet0/0 on VLAN0001.
SW3(config-if)#
*Jul 11 01:59:24.800: STP: VLAN0001 sent Topology Change Notice on Et0/1
*Jul 11 01:59:24.800: STP[1]: Generating TC trap for port Ethernet0/0
*Jul 11 01:59:24.800: STP: VLAN0001 Et0/0 -> blocking
SW3(config-if)#
*Jul 11 01:59:25.883: STP: VLAN0001 heard root  4097-aabb.cc00.4000 on Et0/0
*Jul 11 01:59:25.883:     supersedes 24577-aabb.cc00.1000
SW3(config-if)#
*Jul 11 01:59:27.891: STP: VLAN0001 heard root  4097-aabb.cc00.4000 on Et0/0
*Jul 11 01:59:27.891:     supersedes 24577-aabb.cc00.1000
SW3(config-if)#
*Jul 11 01:59:29.895: STP: VLAN0001 heard root  4097-aabb.cc00.4000 on Et0/0
*Jul 11 01:59:29.895:     supersedes 24577-aabb.cc00.1000
SW3#sh spanning-tree interface e0/0

Vlan                Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
VLAN0001            Desg BKN*100       128.1    P2p *ROOT_Inc
SW3#sh spanning-tree inconsistentports

Name                 Interface                Inconsistency
-------------------- ------------------------ ------------------
VLAN0001             Ethernet0/0              Root Inconsistent

Number of inconsistent ports (segments) in the system : 1

再次下电 SW4 e0/0 并观察SW3
SW3(config-if)#
*Jul 11 01:59:55.912: %SPANTREE-2-ROOTGUARD_UNBLOCK: Root guard unblocking port Ethernet0/0 on VLAN0001.
SW3(config-if)#
*Jul 11 01:59:55.913: STP: VLAN0001 Et0/0 -> listening
SW3(config-if)#
*Jul 11 02:00:10.913: STP: VLAN0001 Et0/0 -> learning
SW3(config-if)#
*Jul 11 02:00:25.920: STP[1]: Generating TC trap for port Ethernet0/0
*Jul 11 02:00:25.920: STP: VLAN0001 sent Topology Change Notice on Et0/1
*Jul 11 02:00:25.920: STP: VLAN0001 Et0/0 -> forwarding

6 用于防环的技术 8 , 9

before_loopguard.png

Figure 12: 使用环路保护前

after_loopguard.png

Figure 13: 使用环路保护后

6.1 LoopGuard

config_loopguard.png

Figure 14: 配置 loop guard , 主要作用于 RP 和 AP

主要的思想在于,不会因为收不到 BPDU ,而将端口从 BLK 状态转到 FWD 状态。(如果贸贸然转为 FWD 状态,可能导致环路)

6.2 UDLD

主要用于 光纤口单向链路检测 。需要链路两端的设备都支持 UDLD 。

  • 全局模式配置

    SW3(config)#udld ?
      aggressive  Enable UDLD protocol in aggressive mode on fiber ports except
                  where locally configured ! 若检测出环路,直接 shutdown 接口
      enable      Enable UDLD protocol on fiber ports except where locally
                  configured ! 若检测出环路,会通过 syslog 提示
      message     Set UDLD message parameters
    
  • 接口模式配置

    SW3(config-if)#udld port ?
      aggressive  Enable UDLD protocol in aggressive mode on this interface
    

6.3 LoopGuard 与 UDLD 的区别

UDLD 主要针对硬件环境,LoopGuard 主要针对软件环境(如因为 CPU 负载过高导致收不到 BPDU)。

diff.png

Figure 15: 两种防环技术对比

Footnotes:

1

选举 是通过网络中各交换机相互发送生成树协议专用的数据帧 BPDU 来实现的

2

内建 UplinkFast 和 BackboneFast 特性

4

应用于接入层交换机接口,可以节约30s

5

应用于接入层交换机,可以节约30s

7

应用于所有交换机,可以节约20s

8

主要用于单向链路检测失败的场景

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2021-05-17 Mon 12:38

Updated: 2021-10-17 Sun 19:45

Emacs 27.1 (Org mode 9.3)