【IT168 专稿】要保证企业的网络中的关键应用可持续性,就需要对交换网络进行冗余设计,然而这将产生广播风暴、“网络环路”等问题,严重时,将导致整个网络瘫痪?于是,STP生成树解决办法出现了……
观察生成树收敛过程
下面通过观察各个交换机生成树的状态来分析无环路树的形成。
图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个步骤
每台非根桥选择一个根端口,对于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命令。
表8-19 修改STP VLAN老化时间
步 骤 | 命 令 | 解 释 |
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 | 保存当前配置 |
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的时间。
需要注意图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中支持,所以本书中没有提供针对这两个特性的配置补助,如果需要这两种特性,请用多生成树协议规划网络。 |