第二部分 STP特性
Portfast快速端口
  Portfast快速端口是一个Catalyst的一个特性,能使交换机或中继端口跳过侦听学习状态而进入STP转发状态,在基于IOS交换机上,PortFast 只能用于连接到终端工作站的接入端口上。
   当一个设备连接到一个端口上时,端口通常进入侦听状态。当转发延迟定时器超时后,进入学习状态,当转发延迟定时器第二次超时,端口进入到转发或者阻塞状态,当一个交换机或中继端口启用PortFast后,端口立即进入转发状态,但交换机检测到链路,端口就进入转发状态(插电缆后的2s) 。如果端口检测到一个环路同时又启用了PortFast 功能。它就进入阻塞状态。重要的是要注意到PortFast 值在端口初始化的时候才生效。如果端口由于某种原因又被迫进入阻塞状态,随后又需要回到转发状态,仍然要经过正常的侦听 。
 
启用PortFast的主要原因是防止启动周期小于30s的PC需要和交换机端口从未连接状态进入到转发状态,一些网卡直到 MAC 层软件驱动被实际加载之后才会启动链路。这种情况下就会导致一些故障,例如DHCP环境下,这可能会出现一些问题。
配置过程:
1) 进入全局配置模式  configure terminal
2) 选择端口  interface 端口
3) 设置该端口启用portfast功能
   spanning-tree portfast [trunk]
   如果你要在trunk端口上启用portfast,必须添加trunk关键字。
4) 验证配置
          show spanning-tree interface 端口 portfast
          -----------------------------------------------
          VLAN0001         enabled
         
          Show spanning-tree summary
          ------------------------------------
          Switch is in pvst mode
          Root bridge for: none
          EtherChannel misconfig guard is enabled
          Extended system ID           is enabled
          Portfast Default             is enabled
          PortFast BPDU Guard Default  is disabled
          Portfast BPDU Filter Default is disabled
          Loopguard Default            is disabled
          UplinkFast                   is disabled
          BackboneFast                 is disabled
          Pathcost method used         is short
案例:
    conf t
    spanning portfast default  (所有的接入端口)
    interface f0/24
    spanning portfast trunk
    end
    show spanning summary
    show runn inter f0/24
    Building configuration...
    Current configuration : 87 bytes
    !
    interface FastEthernet0/24
      switchport mode trunk
      spanning-tree portfast trunk
    end
案例:
CCIE-LAB(V142)
题目要求:
在sw1的F0/18口连接一台PC,使其不需要经过spanning-tree的学习过程,直接forwarding,不会自动协商成trunk。
配置:
SW1
       Interface f0/18
          Spanning-tree portfast
UplinkFast
在 STP 收敛过程中,一些终端站点可能会不可达,这是基于站点所连接交换机端口的 STP 状态而定。这打乱网络连接,于是关键是减少STP的收敛时间和网络受影响的时间。快速级联链路(UplinkFast)就是用来加快STP收敛的。UplinkFast是一项交换机的功能,用于在链路或者交换机失效时加速新的根端口的选择。
 
当链路或交换机故障,或 STP 重新配置后,UplinkFast可以加速选择一个新的根端口。根端口立即进入转发状态,Uplinkfast 通过减少最大更新速率来限制突发多博流量。定义了更新分组发送的最大速率,默认为150分组/分钟
Uplinkfast 对于网络边缘的布线间交换机非常有用。他不适用于骨干设备。UplinkFast 在直连链路故障后提供快速的收敛能力,并通过上行链路组在冗余。
如上图所示,A 和根交换机相连的端口为转发状态,另一个为阻塞状态。当到根交换机的上行链路断开后,如果配置了Uplinkfast到另一台上层交换机的链路将直接转入转发状态,而不需要经过减听和学习状态,如图,这个转换需要经过大约1-5秒。
一旦交换机将以个备用端口转为转发状态,交换机开始在该端口发送伪多播帧,本地桥接标中每个表项都对应一个伪多播帧,每个本地网桥表中的表项(除了与发生故障的根端口相关联的表项)都对应一个伪组播帧。缺省时,每100毫秒大约发送15个伪组播帧。它使用工作站地址做为源地址,目的地址01-00-0C-CD-CD-CD作为目的地址。 如果原来的交换机恢复连接,交换机在等待2倍转发延迟时间再加上5s后才将该端口转入转发状态。这是的邻接端口有时间经过侦听和学习状态才转入转发状态。
注意,
1) 启用了uplinkfast后,它会影响此交换机的所有的VLAN。不能在单个VLAN上配置UplinkFast。
2) 在已经配置了网桥优先级的VLAN上不能启动Uplinkfast。要在配置了网桥优先级的VLAN上启动uplinkfast,必须首先将vlan上的交换机优先级恢复到默认值(使用命令no spanning-tree vlan vlan号 priority)
3) 启动了UplinkFast时,所有VLAN的网桥优先级都被设为49152,并且如果不改变缺省的路径开销,所有接口和VLAN trunk的路径开销都会增加3000
配置过程:
1) 进入全局配置模式 configure terminal
2) 启用UplinkFast
     spanning-tree uplinkfast [max-update-rate 每秒传输包]
     取值为每秒0到32000个数据包,缺省值为150。通常这个值就足够了。
3) 验证配置
     show spanning-tree uplinkfast
     show spanning-tree summary
案例:
    #show spanning summary
    ----------------------------
    Switch is in pvst mode
    Root bridge for: none
    EtherChannel misconfig guard is enabled
    Extended system ID           is enabled
    Portfast Default             is enabled
    PortFast BPDU Guard Default  is enabled
    Portfast BPDU Filter Default is disabled
    Loopguard Default            is disabled
    UplinkFast                   is disabled
    BackboneFast                 is enabled
    Pathcost method used         is short
Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     1         0        0          2          3
VLAN0010                     1         0        0          1          2
VLAN0020                     1         0        0          1          2
VLAN0100                     1         0        0          1          2
VLAN0200                     1         0        0          1          2
VLAN0201                     1         0        0          1          2
---------------------- -------- --------- -------- ---------- ----------
6 vlans                      6         0        0          7         13
   
    #conf t
    (config)#spanning uplinkfast
    #show span  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             Fa0/23(fwd), Fa0/24
    VLAN0010             Fa0/23(fwd), Fa0/24
    VLAN0020             Fa0/23(fwd), Fa0/24
    VLAN0100             Fa0/23(fwd), Fa0/24
    VLAN0200             Fa0/23(fwd), Fa0/24
    VLAN0201             Fa0/23(fwd), Fa0/24
    #Show span summary
    Switch is in pvst mode
    Root bridge for: none
    EtherChannel misconfig guard is enabled
    Extended system ID           is enabled
    Portfast Default             is enabled
    PortFast BPDU Guard Default  is disabled
    Portfast BPDU Filter Default is disabled
    Loopguard Default            is disabled
    UplinkFast                   is enabled
    BackboneFast                 is disabled
    Pathcost method used         is short
    #debug spanning uplinkfast
    #conf t
    (config)#int f0/23
    (config-if)#switchport mode access
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0001 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 FastEthernet0/24 moved to Forwarding (UplinkFast).
00:26:40: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/18
VLAN0001 is: uplink enabled new root FastEthernet0/24 (not me)prev root exists(8017/FastEthernet0/23) cur state forwarding role uplink
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0001 port-id 8017
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0010 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0010 port-id 8017
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0020 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0020 port-id 8017
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0100 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0100 port-id 8017
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0200 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0200 port-id 8017
00:26:40: STP FAST: UPLINKFAST: make_forwarding on VLAN0201 FastEthernet0/24 root port id new: 128.24 prev: 128.23
00:26:40: STP: UFAST: removing prev root port Fa0/23 VLAN0201 port-id 8017
00:26:40: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/24
VLAN0001 is: uplink enabled new root FastEthernet0/24 (me)prev root exists(8017/<none>) cur state forwarding role uplink
00:26:40: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/18
VLAN0001 is: uplink enabled new root FastEthernet0/24 (not me)prev root exists(8017/<none>) cur state forwarding role uplink
00:26:40: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/23
VLAN0001 is: uplink enabled new root FastEthernet0/24 (not me)prev root exists(8017/<none>) cur state blocking role looped
00:26:40: %SPANTREE-7-RECV_1Q_NON_TRUNK: Received 802.1Q BPDU on non trunk FastEthernet0/23 VLAN1.
00:26:40: %SPANTREE-7-BLOCK_PORT_TYPE: Blocking FastEthernet0/23 on VLAN0001. Inconsistent port type.
00:26:55: %SPANTREE-2-UNBLOCK_CONSIST_PORT: Unblocking FastEthernet0/23 on VLAN0001. Port consistency restored.
00:26:55: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/23
VLAN0001 is: uplink enabled new root FastEthernet0/24 (not me)prev root exists(8017/<none>) cur state blocking role looped
00:26:56: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/24
VLAN0001 is: uplink enabled new root FastEthernet0/24 (me)prev root exists(8017/<none>) cur state forwarding role uplink
00:26:56: STP FAST: make_forwarding: via UPLINKFAST: NOT: port FastEthernet0/18
VLAN0001 is: uplink enabled new root FastEthernet0/24 (not me)prev root exists(8017/<none>) cur state forwarding role uplink
00:27:31: STP FAST: UPLINKFAST: make_forwarding on VLAN0001 FastEthernet0/23 root port id new: 128.23 prev: 128.24
00:27:31: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 FastEthernet0/23 moved to Forwarding (UplinkFast).
     
#show spanning uplinkfast
UplinkFast is enabled
Station update rate set to 150 packets/sec.
UplinkFast statistics
-----------------------
Number of transitions via uplinkFast (all VLANs)            : 7
Number of proxy multicast addresses transmitted (all VLANs) : 32
Name                 Interface List
-------------------- ------------------------------------
VLAN0001             Fa0/23(fwd), Fa0/24
VLAN0010             Fa0/24(fwd)
VLAN0020             Fa0/24(fwd)
VLAN0100             Fa0/24(fwd)
VLAN0200             Fa0/24(fwd)
VLAN0201             Fa0/24(fwd)

BackboneFast
BackboneFast快速骨干是Catalyst交换机在跟端口或阻塞端口从指定网桥收到一个劣质(inferor)的BPDU时会起动的一种特性。次级BPDU用来标识一个既是根桥又是指定网桥的交换机。当一个交换机收到一个劣质 BPDU,就以为这该交换机的一个非直接链路出现故障。也就是说,一个指定网桥已经丢失到根交换机的连接。按照 STP 规则,因为所有配置的最大生存时间(20秒), 交换机会忽略所有的劣质的BPDU。Backbonefast的作用就是欺骗这20秒的延迟。当交换机接收到了次级BPDU时,交换机会判断是否有到达根桥的其他路径。
有两种情况需要考虑:
1) 如果劣质BPDU 到达一个阻塞端口,则交换机上的根端口和其他阻塞端口成为到根交换机的备选路径
2) 如果劣质BPDU 到达根端口,所有的阻塞端口都会成为到根交换机的潜在备用。
 
 
   如果劣质BPDU 到达根端口,且没有阻塞端口,交换机将自己定义为根交换机。如果交换机存在备
用路径,它适用备用路径传送一种新的协议,通常情况下该模式会节约 20s的时间。
如上图:当L1 Down时,SWB 会发送一个劣等BPDU,告诉 SWC,我SWB 是Root,SWC 经过和SWA沟通(使用Root Link Query BPDU查询),SWA 告诉SWC,我SWA还活着呢。然后SWC告诉 SWB,SWA还活着,它还是Root。
BackboneFast应用在所有的VLAN中,不支持令牌环VLAN
配置过程:
1) 进入全局配置模式 configure terminal
2) 启用BackboneFast
    spanning-tree backbonefast
3) 验证配置
    show spanning-tree backbonefast
----------------------------------------------------
BackboneFast is enabled
BackboneFast statistics
-----------------------
Number of transition via backboneFast (all VLANs)           : 0
Number of inferior BPDUs received (all VLANs)               : 0
Number of RLQ request PDUs received (all VLANs)             : 0
Number of RLQ response PDUs received (all VLANs)            : 0
Number of RLQ request PDUs sent (all VLANs)                 : 0
Number of RLQ response PDUs sent (all VLANs)                : 0
show spanning-tree summary
BPDU保护
BPDU保护仅用在PortFast模式。它被网络设计者用来加强STP域边界。从而保持与其的活动拓扑。在启用STP PortFast端口之后的设备被禁止影响STP拓扑。对于配置了portfast特性的接口,它不应当接收到BPDU,如果配置了PortFast特性的接口接收了BPDU,那就表示了无效的配置,可能就会产生桥接环路,通过配置BPDU保护后,配置了PortFast的端口如果收到BPDU将会把端口状态调整到Err-Disable.如下是一个信息:
2000 May 12 15:13:32 %SPANTREE-2-RX_PORTFAST:Received BPDU on PortFast enable port. Disabling 2/1
2000 May 12 15:13:32 %PAGP-5-PORTFROMSTP:Port 2/1 left bridge port 2/1
如下图所示,A的优先级为8192,为该vlan的根桥,B的优先级为16384,为备份根桥,B和A之间的链路为Gbit/s链路,C是一个接入交换机,并在连接到设备D得端口上设置了PortFast.其他的STP参数都是默认值,网桥C上连接到网桥B得端口处于STP阻塞状态。设备D(PC)不参与STP。正确的BPDU流向,如下左图

   如果D为一台基于Linux的软件网桥,可以发送BPDU报文,并将自身BID的优先级设置为0,此时,D将成为根桥,故BPDU流向变为右图, A,B间的Gbit/s链路被阻塞,通过C走100Mbit/s链路。此时会超负载出现丢包的情况, BPDU保护的目的就是基于这种情况,防止接入设备对整个网络拓扑的影响。
   配置过程:
     方法一:全局配置模式
1) 全局配置模式 configure terminal
2) 配置BPDU保护
     (config)#spanning-tree portfast bdpuguard default
3) 进入接口模式  interface 接口
4) 接口使能portfast,BPDU保护才能启用
     (config-if)#spanning-tree portfast
方法二:接口模式
1) 接口模式下  interface 接口
2) 使能BPDU保护
    (config-if)#spanning-tree bpduguard enable
   验证过程:
    show running-configure
BPDU过滤(BPDU Filtering)
通过使用BPDU过滤功能,将能够防止交换机在启用了PortFast特性的接口上发送BPDU。对于配置了PortFast特性的端口,它通常连接到主机设备,因为主机不需要参与STP,所有它将丢弃所接收到的BPDU。通过使用BPDU过滤功能,将能够防止向主机设备发送不必要的BPDU。
   交换机支持以每个端口或者整个交换机配置BPDU过滤。
   如果全局配置了BPDU过滤功能,但当某个端口接收到了任何的BPDU,那么交换机将把接口更改回正常的STP操作,也就是它将禁用PortFast和BPDU过滤特性。
   如果在接口上明确配置了BPDU过滤功能,那么交换机将不发送任何的BPDU,并且将把接收到的所有BPDU都丢弃。
   注意,如果在链接到其他交换机的端口上配置了BPDU过滤,那么就有可能导致桥接环路,所以在部署BPDU过滤时要格外小心,一般我们不推荐使用BPDU过滤。
   如果在与启用了BPDU过滤的相同接口上配置了BPDU保护,因为BPDU过滤的优先级高于BPDU保护,所以BPDU保护将不起作用。
配置过程:
     方法一:全局配置模式
1) 全局配置模式 configure terminal
2) 配置BPDU保护
    (config)#spanning-tree portfast bdpufilter default
3) 进入接口模式  interface 接口
4) 接口使能portfast,BPDU保护才能启用
    (config-if)#spanning-tree portfast
方法二:接口模式
1) 接口模式下  interface 接口
2) 使能BPDU保护
    (config-if)#spanning-tree bpduguard enable
   验证过程:
    show running-configure
根保护
传统的802.1D STP没有给网络管理员提供确保交换式第2层网络拓扑安全。如下图,当新接入的
交换机优先级更低,将抢占原有的根网桥。
根保护的目的是确保启用了根保护的端口成为指定端口。通常一个根桥的所有端口均为指定端口。
除非连接到两个或多根网桥的端口。如果网桥在启用根保护的端口上收到一个较好的 STP  BPDU。这个
端口进入STP的根不一致状态,  不会有流量通过该端口。
   如下拓扑:
   A 和 B 为分布层 SW,C 为接入层 SW,根为 A。当在 C 下面再接一台 SW时,由于D的优先级或MAC地址可能比其它要低,可能会使D成为Root SW,从而使得从A 到达B的流量不能直接发送到B,而得使用C来转发,这样很不合理(A 和 B 之间为千兆)。为了避免这种情况,可以在C的下联端口上使用Root Guard,以防止该端口成为Root Port,从而防止D成为Root SW,确保A永远为 Root SW。使用Root Guard 后,SW D接入网络后,C的下联D的端口会收到一个更新的BPDU(前提是D的优先级最高)后,C将该端口转为Block状态,直到D不在发送新的BPDU或更改D的优先级。
 
当一个根保护端口阻塞一个端口时,控制台将会显示如下消息:
 %SPANTREE-2-ROOTGUARDBLOCK: Port 1/1 tried to become non-designated in VLAN 77. Moved to root-inconsistent state
   注意,在一个端口上起用了根保护,会作用于该端口所属的所有VLAN。不要再一个起用了UplinkFast特性的端口上启用根保护。游乐UplinkFast,在出现故障时备份端口(处于阻塞状态)会代替根端口。但是,如果也启用了根保护,所有使用UplinkFast特性的备份端口将被置于根不一致(阻塞)状态,使其无法进入转发状态。
    配置过程:
1) 进入接口模式  interface 接口
2) 启用根保护
    spanning-tree guard root
3) 验证过程
    show running-config interface 接口
    show spanning-tree inconsistentports
显示端口不一致(阻塞)状态的信息
环路保护
换路保护能够对第2层转发环路(STP环路)提供额外的保护。当冗余拓扑中的STP阻塞端口错误地过渡到转发状态的时候,就将发生桥接环路。
如下图:交换机A是根交换机。因为交换机B和C之间的链路发生单向链路失效,交换机不能从交换机B接收BPDU。如果没有启用环路保护特性,那么交换机C在最大寿命计时器到期之后,交换机C上的STP阻塞端口将转换到STP监听状态,并最终会在两倍的转发延迟时间之后转换到转发状态。当交换机C的源阻塞端口进入到转发状态的时候,交换机B的源指定端口还处于转发状态,这个拓扑中没有阻塞端口,而产生了环路。
 
如果启用了环路保护特性之后,当最大寿命计时器到器之后,交换机C上的阻塞端口将过渡到“不一致环路”状态,如下图,如果端口处于“不一致环路”状态,它就不能传递任何数据流量,因此,网络也就不能产生桥接环路。“不一致环路”状态等效于阻塞状态。
 
在非指定端口上使用 Loop  Guard。防止环路产生。避免上于处于 Block 端口的 SW 在Max_age 时间内接收不到对方(邻居)的 BPDU 而将端口状态转为 Listen->Learning->Forward 状态。使用Loop Guard 后,等接收不到对方的BPDU消息后,将端口Block状态转为Loop-inconsistent(环路不一致)状态,从而避免产生环路。
如果使用Loop Guard,那么Root Guard将会被关闭。两者不能同时启用
配置过程:
     方法一:全局配置模式
1) 全局配置模式 configure terminal
2) 配置环路保护
    (config)#spanning-tree portfast loopguard default
方法二:接口模式
1) 接口模式下  interface 接口
2) 使能环路保护
    (config-if)#spanning-tree guard loop
   验证过程:
show running-configure
show spanning-tree active
show spanning-tree interface 接口 detail
-------------------------------------------------------------------
Port 23 (FastEthernet0/23) of VLAN0001 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.23.
   Designated root has priority 32769, address 000b.5f2c.2080
   Designated bridge has priority 32769, address 000b.5f2c.2080
   Designated port id is 128.23, designated path cost 0
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   Link type is point-to-point by default
   Loop guard is enabled on the port
   BPDU: sent 2709, received 5