作者: 卓维乾   转自:IT168

【IT168 专稿】要保证企业的网络中的关键应用可持续性,就需要对交换网络进行冗余设计,然而这将产生广播风暴、“网络环路”等问题,严重时,将导致整个网络瘫痪?于是,STP生成树解决办法出现了……

  网络冗余设计与广播风暴的矛盾
  广播风暴的克星:设计STP网络生成树
  技术剖析:STP生成树初始化与收敛
  案例分析:观察生成树收敛过程
  实战剖析:STP生成树如何配置?
  技术进化:RSTP快速生成树配置

观察生成树收敛过程
 
经过上面的分析,引入一棵无环路树,拓扑结构如图8-13所示。交换机3台,全部为默认配置,将3台交换机连接环路。
1 .Show spanning-tree 的结果
下面通过观察各个交换机生成树的状态来分析无环路树的形成。

图8-13 网络拓扑图

 
 
SW-1#show spanning-tree
 VLAN1 is executing the ieee compatible Spanning Tree protocol
 Bridge Identifier has priority 32768, address cc01.0458.0000
 Configured hello time 2, max age 20, forward delay 15    //三个定时器参数为默认值
 We are the root of the spanning tree                               //我们是根桥
 Topology change flag not set, detected flag not set
 Number of topology changes 3 last change occurred 00:02:02 ago
          from FastEthernet0/1
 Times: hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15
 Timers: hello 0, topology change 0, notification 0, aging 300
 Port 1 (FastEthernet0/0) of VLAN1 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.1.
   Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc01.0458.0000
   Designated port id is 128.1, designated path cost 0       //说明自己是指定端口
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 677, received 1
 Port 2 (FastEthernet0/1) of VLAN1 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.2.
   Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc01.0458.0000
   Designated port id is 128.2, designated path cost 0              //说明自己是指定端口
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 679, received 10
 
SW-2#show spanning-tree
 VLAN1 is executing the ieee compatible Spanning Tree protocol
 Bridge Identifier has priority 32768, address cc02.0628.0000
 Configured hello time 2, max age 20, forward delay 15
 Current root has priority 32768, address cc01.0458.0000         //当前桥为SW-1
 Root port is 1 (FastEthernet0/0), cost of root path is 19          //根端口是F0/0
 Topology change flag not set, detected flag not set
 Number of topology changes 1 last change occurred 00:02:22 ago
          from FastEthernet0/0
 Times: hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15
 Timers: hello 0, topology change 0, notification 0, aging 300
 Port 1 (FastEthernet0/0) of VLAN1 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.1.
  Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc01.0458.0000
   Designated port id is 128.1, designated path cost 0         //指定端口SW-1的F0/0
   Timers: message age 1, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 1, received 72
 Port 2 (FastEthernet0/1) of VLAN1 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.2.
  Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc02.0628.0000   //指定桥就是自己
   Designated port id is 128.2, designated path cost 19              //指定端口就是自己
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 70, received 3
 
SW-3#show spanning-tree
 VLAN1 is executing the ieee compatible Spanning Tree protocol
 Bridge Identifier has priority 32768, address cc03.07f4.0000
 Configured hello time 2, max age 20, forward delay 15
 Current root has priority 32768, address cc01.0458.0000        //当前根桥为SW-1
 Root port is 1 (FastEthernet0/0), cost of root path is 19                 //根端口是F0/0
 Topology change flag not set, detected flag not set
 Number of topology changes 2 last change occurred 00:01:16 ago
          from FastEthernet0/1
 Times: hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15
 Timers: hello 0, topology change 0, notification 0, aging 300
 Port 1 (FastEthernet0/0) of VLAN1 is forwarding            //根端口,每台设备一个
   Port path cost 19, Port priority 128, Port Identifier 128.1.
   Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc01.0458.0000   //指定网桥为SW-1
   Designated port id is 128.2, designated path cost 0                //指定端口是SW-1 端口ID是128.2
   Timers: message age 1, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 10, received 236
 
 Port 2 (FastEthernet0/1) of VLAN1 is blocking                       //属于阻断状态
   Port path cost 19, Port priority 128, Port Identifier 128.2.
   Designated root has priority 32768, address cc01.0458.0000
   Designated bridge has priority 32768, address cc02.0628.0000  //指定桥是SW-2
   Designated port id is 128.2, designated path cost 19 //指定端口是SW-2 端口ID是128.2
   Timers: message age 2, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   BPDU: sent 197, received 36
 
2 .按照“STP 四步初始化原则”的计算结果
 
按 照“STP 四步初始化原则”,上述3台交换机形成一个无环路生成树,经过4个阶段的比较。根据最低的根BID比较选举SW-1 为根桥,如表8-8所示;根据最低的路径开销到根桥的比较,各交换机端口的开销如表8-9所示;根据最低的发送方BID比较,可以看出SW- 1<SW-2<SW-3 ,说明SW-2的F0/1为指定端口;从Show信息中可以看到,端口ID F0/0 为128.1 ,端口ID F0/1为128.2,依此类推。
 
表8-8 BID的比较
交换机BID
BID值
SW-1 BID
32768-cc01.0458.0000
SW-2 BID
32768-cc02.0628.0000
SW-3 BID
32768-cc03.07f4.0000
表8-9 根路径开销比较
交 换 机
端     口
到根桥的开销
根端口结果
指定端口结果
SW-1
FastEthernet 0/0
0
 
指定端口
FastEthernet 0/1
0
 
指定端口
SW-2
FastEthernet 0/0
19+0
根端口
 
FastEthernet 0/1
19+19
 
指定端口
SW-3
FastEthernet 0/0
19+0
根端口
 
FastEthernet 0/1
19+19
 
阻断端口
 
3 .按照生成树收敛的3 个步骤
 
如图8-14所示,首选选择SW-1为根桥(Root Bridge),然后选择根端口(Root Ports),最后确定指定端口(Designated ports)。
 
每台非根桥选择一个根端口,对于SW-2,端口F0/0的根路径为19+0,端口F0/1为19+19,所以根端口为F0/0;对于SW-3,端口F0/0也是19+0,端口F0/1为19+19,所以F0/0为根端口。



图8-14  一个简单的无环路生成树


每个以太网段均有一个指定端口,SW-1和SW-2的网段很明显,SW-1的F0/0端口为指定端口,同理SW-1的F0/1为SW-1和 SW-2之间网段的指定端口,对于SW-2和SW-3的网段;SW-2的F0/1的根路径为38,SW-3的F0/1端口的根路径也为38,必须再次比较 Sender ID,也就是交换机的BID,SW-2的BID小于SW-3的BID,所以SW-2的F0/1端口为指定端口。
 
4 .拓扑改变后的收敛
关 闭SW-3的F0/0口,该端口原为根端口,转发数据,关闭后可以利用debug spanning-tree events命令分析STP拓扑改变时的变化。请注意在调试完成之后需要停止debug信息,通过no debug all或undebug all命令来停止调试。
 
SW-3#debug spanning-tree events //调试命令,记录STP事件
SW-3# configure terminal
SW-3(config)#int f0/0
SW-3(config-if)# shutdown //关闭F0/0
SW-3(config-if)#
*Mar 1 00:10:21.395: STP: VLAN1 Fa0/0 -> blocking      //F0/0进入阻断状态
*Mar 1 00:10:21.399: STP: VLAN1 new root port Fa0/1, cost 38     //F0/1为新的根端口
*Mar 1 00:10:21.551: STP: VLAN1 Fa0/1 -> listening       //F0/1进入监听状态)
*Mar 1 00:10:23.251: STP: VLAN1 sent Topology Change Notice on Fa0/1    //因为F0/1为新的根端口,所以可以发送TCN
*Mar 1 00:10:36.559: STP: VLAN1 Fa0/1 -> learning       //10:36-10:21=15秒延时
*Mar 1 00:10:51.603: STP: VLAN1 Fa0/1 -> forwarding //10:51-10:36=15秒延时
SW-2 收到TCN,同时向根传播TCN。
SW-2# debug spanning-tree events      //调试STP事件
*Mar 1 00:12:18.655: STP: VLAN1 Topology Change rcvd on Fa0/1
*Mar 1 00:12:18.659: STP: VLAN1 sent Topology Change Notice on Fa0/0    //TCN从根端口发出
最后,SW-1收到从F0/0收到TC。
SW-1# debug spanning-tree events        //调试STP事件
*Mar 1 00:20:31.127: STP: VLAN1 Topology Change rcvd on Fa0/0
STP的配置
 
很多品牌的交换机出厂时是将生成树协 议关闭的,其主要的原因在于生成树在开启的时候需要花费交换机一定的CPU和内存的开销。对于有些不需要冗余的小型网络中,不用开启STP,这样能节省设 备的额外开销,Cisco的交换机默认全部是打开的。表8-10列出了Cisco交换机出厂时的默认配置。
 
表8-10 Cisco交换机的STP默认配置
特     性
默 认 值
STP开启状态
所有VLAN均开启,最大可开启128个生成树实例
STP模式
PVST(PSTST和MSTP关闭)
优先级
32768
STP端口优先级
128
STP端口开销
1Gbps:=4,100Mbps=19,10Mbps=100
生成树VLAN端口优先级
124
生成树VLAN端口开销
1Gbps:=4,100Mbps=19,10Mbps=100
Hello time
2秒
Forward-delay
15秒
Maximum-aging
20秒
 
Cisco 的交换机默认是开启PVST的,也就是开启每VLAN的生成树协议,每VLAN快速生成树协议(PVRST),多VLAN生成树协议(MSTP)则需要另 外打开。Cisco 交换机的STP 最多支持128个实例,如果超过128个实例(也就是超过128VLAN),需要使用RSTP和MSTP协议。
 
 
关闭STP
 
在 默认状态下,所有VLAN中的生成树都被启用。因此,无须为VLAN启用STP,只需根据拓扑结构,确定根交换机,并调整端口费用和优先级值,从而设置最 佳路径。如果确认在VLAN内没有拓扑环,可以禁用Spanning-Tree,以减少端口接入时等待的时间。对于的确不需要STP 的网络,可以关闭STP,表8-11 列出了关闭生成树配置步骤。
 
表8-11 关闭生成树配置
步     骤
命     令
解     释
1
Switch# configure terminal
进入全局配置模式
2
Switch(config)# no spanning-tree vlan vlan-id
关闭某一或某些VLAN的STP(Cisco的交换机默认是基于每VLAN的
vlan-id 指定关闭的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4094
3
Switch(config)# end
返回特权配置模式
4
Switch#show spanning-tree valn-id
验证
5
Switch# copy running-config startup-config
保存当前配置
 
将交换机配置为根桥
 
当VLAN中存在有环路时,应当通过根交换机、端口优先级和路径费用等设置,确定网络拓扑结构,从而使Spanning-Tree的生成时间最短。必须为每个VLAN配置一个根桥,交换机出厂时默认的32768,配置 spanning-tree vlan vlan-id root后,将使32768值减少,保证比其他交换机低,使之成为该VLAN的根桥。
 
网络直径是指两台计算机之间通过交换机的数量,修改网络直径,交换机将自动修改网桥的优先级、aging time 等值,使之最快收敛,举例如下:
Switch (config)#spanning-tree vlan 1 root primary diameter 2
VLAN 1 bridge priority set to 8192        //从32768 降到8192
VLAN 1 bridge max aging time set to 10
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay set to 7
表8-12是根桥参数修改的步骤,若将交换机恢复为默认配置,可以在全局配置模式下使用no spanning-tree vlan vlan-id root命令。
 
表8-12 根桥参数修改
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id root primary [diameter net-diameter [hello-time seconds]]
配置一台交换机成为特定VLAN的根vlan-id 指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4094
(可选)网络直径,定义两台工作站之间交换机的数量,范围为2~7(可选)Hello-time,配置有根桥产生的BPDU消息通知的间隔,范围2~10秒,默认为2秒
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree detail
验证
5
Switch#copy running-config startup-config
保存当前配置
3 .配用备用根桥
可以配置某台交换机作为根桥的备份根桥,表8-13说明了配置备用根桥的步骤。这样的结果可以在某台根桥故障时,接替根桥工作。
表8-13 配置备用根桥
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id root secondary [diameter net-diameter [hello-time seconds]]
配 置一台交换机成为特定VLAN的根vlan-id指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4094(可选)网络直径,定义两台工作站之间交换机的数量,范围为2~7(可选)Hello-time,配置有根桥产生的BPDU消息通知 的间隔,范围2~10秒,默认为2秒
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree detail
验证
5
Switch#copy running-config startup-config
保存当前配置
 
4 .配置端口优先级
如 果VLAN内有环路拓扑,Spanning-Tree将使用端口优先值确定将哪个接口置于转发状态。因此,可以将需要首先选择的端口赋予较高优先级值(较 小的数值)。如果所有端口都有相同的优先级值,那么具有最小端口号的端口将被设置为转发状态,其他接口则处于阻塞状态。表8-14说明了配置较高端口优先 级的步骤。
表8-14 配置端口优先级
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
interface interface-id
进入端口配置模式
3
Switch(config)#spanning-tree port-priority priority
配置一个端口的优先级
Priority 范围为0~240,步长为16(非16的步长值,不接受),默认为128,数据越大优先级越大
4
Switch(config)#spanning-tree vlan vlan-id port-priority priority
配置一个VLAN端口的优先级vlan-id指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4094
Priority 范围为0~240,步长为16(非16的步长值,不接受),默认为128,数据越大优先级越大
5
Switch(config)#end
返回特权配置模式
6
Switch#show spanning-tree interface interface-id
Switch#show spanning-tree vlan vlan-id
验证
7
Switch#copy running-config startup-config
保存当前配置
 
使用no spanning-tree [vlan vlan-id] port-priority接口配置命令,可以将端口优先级恢复为默认值。
 
5 .配置端口开销
 
Spanning- Tree路径(端口)开销的默认值取决于端口的类型与速率。当VLAN中有拓扑环时,Spanning-Tree使用路径开销选择将哪个端口置于转发状 态。具有最低端口开销的端口将被选择用于向所有的VLAN转发帧。因此,可以将需要选择的端口赋予较低的开销值,以确定网络拓扑。
 
通 常情况下,应当为快速链路(如1000 Mbps端口)赋予一个最小值,而为一个慢速链路(如100Mbps端口)赋予一个最大值。如果所有端口的开销值都相同情况出现,就需要将具有最小端口号 的端口将被设置为转发状态,其他端口则处于阻塞状态。表8-15 说明了在上述特殊情况下配置STP端口开销的补助。
 
表8-15 配置STP端口开销
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#interface interface-id
进入端口配置模式
3
Switch(config-if)# spanning-tree cost cost
Cost的范围为1~200 000 000,默认值参看表8-1,越小越优先
4
Switch(config-if)# spanning-tree vlan vlan-id cost cost
配置VLAN端口的的开销vlan-id指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4094,Cost的范围为1~200 000 000,默认值参看表8-1,越小越优先
5
Switch(config)#end
返回特权配置模式
6
Switch# show spanning-tree interface {interface-id} |{port-channel port_channel_number}
Switch# show spanning-tree vlan vlan_ID
验证
7
copy running-config startup-config
保存当前配置
使用no spanning-tree [vlan vlan-id] cost接口配置命令,可以将接口开销恢复为默认值。
 
6 .配置VLAN 优先级
采用表8-16的指令可以设置某个VLAN的优先级,Cisco建议采用spanning-tree vlan vlan-id root primary 来修改VLAN的根桥。
 
表8-16 配置STP VLAN端口优先级
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id priority priority
vlan-id 指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4 094。
Priority 范围为0~61 440,步长为4096(非4 096的步长值,不接受),默认为32 768,数据越小将被选为根桥
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree vlan vlan-id
验证
5
Switch#copy running-config startup-config
保存当前配置
 
7 .配置Hello Time
默认情况下, VLAN 之间的 Hello 包时间为 2 秒,表 8-17 是修改生成树 Hello Time 的步骤。
表8-17 修改生成树Hello Time
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id hello-time seconds
vlan-id 指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4 094
Seconds,范围为1~10,默认为2
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree vlan vlan-id
验证
5
Switch#copy running-config startup-config
保存当前配置
 
8 .Fordwarding-Delay
修改VLAN的转发延迟,配置补助如表8-18所示。
表8-18 修改STP 转发延迟
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id
forward-time
seconds
vlan-id 指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4 094
Seconds,范围为4~30,默认为15
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree vlan vlan-id
验证
5
Switch#copy running-config startup-config
保存当前配置
 
9 .修改VLAN 的老化时间(Maximum-Aging )
 
最大老化时间(MAX-AGE TIMER)规定了从一个具有指定端口的邻接交换机上所收到的BPDU报文的生存时间。如果非指定端口在最大老化时间内没有收到BPDU报文,该端口将进入Listening状态,并接收交换机产生配置BPDU报文。
 
表8-19修改STP VLAN老化时间的命令步骤,如果要恢复默认配置可以使用no spanning-tree vlan vlan-id max-age命令。
 
步     骤
命     令
解     释
1
Switch#configure terminal
进入全局配置模式
2
Switch(config)#spanning-tree vlan vlan-id max-age seconds
vlan-id 指定的VLAN ID,可以用连接号或逗号隔开多个,VLAN ID范围1~4 094
Seconds,范围为6~40,默认为20
3
Switch(config)#end
返回特权配置模式
4
Switch#show spanning-tree vlan vlan-id
验证
5
Switch#copy running-config startup-config
保存当前配置
 
表8-19 修改STP VLAN老化时间

Cisco私有端口特性
STP是用于打破二层环路的协议,但这个协议有个最明显的缺点,就是当二层网络重新收敛的 时候,至少要等待50秒的时间(转发延迟+老化时间)。50秒的时间对于一个大型的2层网络来说,是一个漫长的过程(何况这只是个理论时间,实际情况还会 更长)。虽然CISCO对STP的这些缺点开发出了些弥补性的特性,比如Port Fast、Uplink Fast和Backbone Fast,用于加快二层网络的收敛时间。套用王朔的话“看上去很美”,虽然这些“新”特性能够改善STP的一些不足,但是这些特性是CISCO私有的,而 非行业标准。
 
(1)Port Fast(快速端口)
只能用于access端口(即接入端口,比如接入PC电脑,保证无环路)处于这种状态的端口可以很快从阻断状态转变成转发状态,加速生成树收敛时间。
(2)Uplink Fast(快速上行链路)
用于接入层交换机,处于这种状态的非根交换机,当根端口发生故障时它的非根端口能很快变成forward状态,而不需经过Listening和Learning状态。
 
(3)Backbone Fast(快速骨干)
运用在所有的交换机里面的,能够加速网络的收敛,使端口从阻塞状态转换到转发状态只需 30 秒时间。工作原理:当交换机从邻居交换机收到一个优先级低的 BPDU (宣称自己是根交换机的 BPDU ),意味着原有链路发生了故障。则此交换机通过其他可用链路向根交换机发送根链路查询 BPDU ,此时如果根交换机还可达,根交换机就会向网络中的交换机宣告自己的 存在。则首先接收到劣等 BPDU 的端口,很快转变到 Forward 状态,之间省略了 max age 的时间。
 
 
 
Spanning-Tree Port Fast将使端口绕过监听和学习阶段,立即进入Spanning-Tree转发状态。当打开交换机的电源或设备连接至端口时,端口正常进入 Spanning-Tree监听状态。转发延迟时间届满后,端口进入学习状态,然后转变为转发状态或阻塞状态。在监听和学习状态中,不能进行信息的转发。 然而,当在那些直接连接至终端(客户端、服务器、网络打印机等)的交换机端口上使用Port Fast时,将使该端口立即并且永久地转换至Spanning-Tree转发状态,并将使这些设备立即连接至网络,避免了端口由监听和学习状态向转发状态 过渡而必须的等待。
 
需要注意图8-15的示例。Port Fast只适用于终端与交换机端口之间的连接。如果在连接到其他网络设备(如交换机)的连接上启用Port Fast,将可能在冗余链路上形成网络环,从而导致网络瘫痪。
 

图8-15 Port Fast端口的应用位置

 
可以在直接连接至计算机的端口上启用Port Fast。指定trunk关键字,可以在Trunk端口启用Port Fast。默认状态下,所有端口都被禁用Port Fast。在接口模式下可以使用spanning-tree portfast [trunk]命 令,而使用spanning-tree portfast default全局配置命令,可以在所有非Trunk端口上都启用Port Fast功能。使用spanning-tree portfast disable接口配置命令,可以禁用Port Fast功能。另外,也可以在指定的VLAN内禁用spanning-tree,从而使所有端口立即进入转发状态。
 
提 示:以上3种特性在多协议生成树中,只有Port Fast支持,Uplink Fast和Backbone Fast被多生成树基本功能替代,而Backbone Fast只有在CatOS中支持,所以本书中没有提供针对这两个特性的配置补助,如果需要这两种特性,请用多生成树协议规划网络。