STP(Spanning Tree Protocol) (IEEE 802.1D) 生成树协议
是一种逻辑阻塞。
・在一个交换网络中有可能会出现单点失效的故障,所谓单点失效,指的是由于网络中某一台设备的故障,而影响整个网络的通信。为了避免单点失效,提高网络的可靠性,可以通过构建一个冗余拓扑来解决。但是,一个冗余的拓扑,又会给我们的网络造成环路,而产生其它的影响。为了解决二层环路问题,而设计了SPT协议。
・当2个Segment之间,只有一个物理设备连接时,就有可能“单点失效”。
・Segment:(段的概念)
1.STP:一段网络介质(网线/光纤)。
2.数据封装:携带4层报头的用户数据。
3.路由:一个逻辑子网。
・避免单点失效的方法就是构造冗余网络。
・但冗余网络会导致新的问题:
1.多帧复制
2.MAC地址表的翻动
3.广播风暴
・STP是为克服冗余网络中透明桥接的环路问题而创建的。
STP通过判断网络中存在环路的地方,并阻断冗余链路来实现无环网络。
・STP采用STA(Spanning Tree Arithmetic)算法。
STA会在冗余链路中选择一个参考点(生成树的根),将选择到达要的单条路径,同时阻断其他冗余路径。一旦已选路径失效,将启用其他路径。
BPDU(Bridge Protocol Data Unit)
・STP的各种选举是通过交换BPDU报文来实现的,BPDU是直接封装在以太网帧中的。
・对于参与STP的所有SW,它们都通过数据消息的交换来获取网络中其他SW的信息,这种消息就被称为BPDU。
・BPDU是直接封装在二层的协议,其MAC地址最后封装数为:00。(01:80:c2:00:00:00)
・BPDU的功能:
1.选举根桥
2.确定冗余路径的位置
3.通过阻塞特定端口来避免环路
4.通告网络的拓扑变更
5.监控生成树的状态
・BPDU每2S由根桥发送一次。
最初的网络,每个SW都认为自己是根桥,都会发送BPDU,比较Lowest BID,选举出一个根桥,当根桥选出来以后。此时就只有根桥发送BPDU。非根桥只进行转发。
BPDU分两种类型:
1、配置BPDU--通常由根网桥以周期性间隔发出,包括了STP参数,用于进行各种选举。
2、TCN(topology change notification 拓扑变更通告)BPDU--这种BPDU是当交换机检测到拓扑发生变更时所产生。
・配置BPDU包含以下的字段(configuration BPDU)
1、Protocol ID : 固定为0,2bit
2、Version : 802.1D (0),1bit
3、Message Type : (Config BPDU=0x00 / TCN BPDU=0x80),1bit
4、Flags:1bit(第1位为0是not topology change acknowladgment,最后位为0是not topology change)
5、Root ID:8bit
6、Cost of Path:4bit
7、Bridge ID:8bit(2bit priority+6bit MAC)
8、Port ID:2bit
9、Message age:2bit
10、Max age:2bit:20S
11、Hellotime:2bit:3S
12、Forward delay:2bit:15S
・TCN(Topology Change Notification) BPDU
这种BPDU是交换机检测到拓扑变更时产生的。只包含下列三个字段
1、Protocol ID
2、Version
3、Message Type : (Config BPDU=0x00 / TCN BPDU=0x80)
<STP的4大工作流程>(STP里选举参数都是越小越优)
One root bridge per network
One root port per nonroot bridge
One designated port per segment
Nondesignated ports are blocked
One root bridge per network(每个网络只有一个根桥)
・根桥的选举:Lowest BID (最小的BID)
・STP为每台SW分配唯一的一个标识符,称为BID(Bridge ID)。
BID的组成:2(Bridge Priority优先级)+6(MAC)=8 Bytes
默认Priority:32768(0x8000)可以从0到65535
2950以上的交换机会在这个值上再加上VLAN号,因为CISCO默认启用PVST(一个VLAN是一个生成树)
每个交换机都有一个基准的MAC地址,用下面的命令可以看到
Sw2#show version
Base ethernet MAC Address: 00:0D:28:61:35:00
交换机的每一个端口都有一个MAC地址,就是以Base(基准) MAC地址加上端口号得到的。
Show interface f0/1 这一命令可以看到交换机端口的MAC地址
查看STP信息--
SW1# sh spanning-tree bri
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 32768
Address cc00.0838.0000
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32768
Address cc00.0838.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 0
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet1/1 128.42 128 19 FWD 0 32768 cc00.0838.0000 128.42
FastEthernet1/2 128.43 128 19 FWD 0 32768 cc00.0838.0000 128.43
FastEthernet1/3 128.44 128 19 FWD 0 32768 cc00.0838.0000 128.44
FastEthernet1/4 128.45 128 19 FWD 0 32768 cc00.0838.0000 128.45
FastEthernet1/5 128.46 128 19 FWD 0 32768 cc00.0838.0000 128.46
・PVST(Per Vlan Stp)
Cisco SW 默认为每个VLAN生成一个STP,互不影响。
由于是为不同的VLAN生成不同的生成树。所以每一台交换机需要为不同的VLAN生成一个不同的桥优先级,所以在CISCO交换机上,交换机在每一个VLAN中的优先级是默认的32768再加上VLAN的号码。
可通过以下命令指定一台交换要为根桥:
Sw1(config)#
spanning-tree vlan 1-10 root primary (24576=0x6000) (建立优先级,成为根桥,只是一次变化, 不是动态的,敲一次起一次作用)
SW2(config)#spanning-tree vlan 1 root primary
VLAN 1 bridge priority set to 8192
VLAN 1 bridge max aging time unchanged at 20
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay unchanged at 15
SW1#sh spanning-tree bri
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 8192
Address cc01.0838.0000
Cost 19
Port 44 (FastEthernet1/3)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32768
Address cc00.0838.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 0
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet1/1 128.42 128 19 FWD 19 32768 cc00.0838.0000 128.42
FastEthernet1/2 128.43 128 19 FWD 19 32768 cc00.0838.0000 128.43
FastEthernet1/3 128.44 128 19 FWD 0 8192 cc01.0838.0000 128.44
FastEthernet1/4 128.45 128 19 BLK 0 8192 cc01.0838.0000 128.45
FastEthernet1/5 128.46 128 19 FWD 19 32768 cc00.0838.0000 128.46
Sw3(config)#
spanning-tree vlan 1-10 root secondary (28672=0x7000) (备份根桥,防止优先级根桥showdown了)
Sw1(config)#spanning-tree vlan 1-10 priority 4096
(设置必须是4096的倍数)
SW1#sh spanning-tree bri
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 4096
Address cc00.0838.0000
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 4096
Address cc00.0838.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 0
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet1/1 128.42 128 19 FWD 0 4096 cc00.0838.0000 128.42
FastEthernet1/2 128.43 128 19 FWD 0 4096 cc00.0838.0000 128.43
FastEthernet1/3 128.44 128 19 FWD 0 4096 cc00.0838.0000 128.44
FastEthernet1/4 128.45 128 19 FWD 0 4096 cc00.0838.0000 128.45
FastEthernet1/5 128.46 128 19 FWD 0 4096 cc00.0838.0000 128.46
One root port per nonroot bridge(每个非根桥都要选出一个根端口)
・根端口(RP):每个非根桥有且只有一个根端口
选举RP/DP的方法:
1.Lowest RID(最小的RID) 是SW1(根桥)的BID
2.Lowest path cost to root bridge(到达根的最小路径开销)
3.lowest sender BID (最小的发送BID)
4.Lowest sender port ID 当两台交换机之间有两条线路直连时会用到这一项来选
・Path Cost:根桥发出的COST值是0,在下一交换机的入口处才加上COST值,出口处COST值不变。
SW2#sh int st
Interface FastEthernet1/0 is disabled
FastEthernet1/3
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 210 14162 117 10480
Route cache 0 0 0 0
Total 210 14162 117 10480
FastEthernet1/4
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 211 14519 15 4094
Route cache 0 0 87 5220
Total 211 14519 102 9314
FastEthernet1/5
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 54 6293 178 13874
Route cache 0 0 88 5280
Total 54 6293 266 19154
Vlan1
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 3 231 2 154
Route cache 0 0 0 0
Total 3 231 2 154
Sw1#show spanning-tree
Sw1(config-if)#
spanning-tree (vlan 1) cost 22 每个VLAN都能生成一个自已的生成树,通过改动每个VLAN的COST值可以达到让每个VLAN选择不同的根端口,产生不同的生成树,充分利用了链路
Sw1(config-if)#
spanning-tree cost 22 修改所有Vlan的Cost值
SW2#sh int st
Interface FastEthernet1/0 is disabled
FastEthernet1/3
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 210 14162 117 10480
Route cache 0 0 0 0
Total 210 14162 117 10480
FastEthernet1/4
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 211 14519 15 4094
Route cache 0 0 87 5220
Total 211 14519 102 9314
FastEthernet1/5
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 54 6293 178 13874
Route cache 0 0 88 5280
Total 54 6293 266 19154
Vlan1
Switching path Pkts In Chars In Pkts Out Chars Out
Processor 3 231 2 154
Route cache 0 0 0 0
Total 3 231 2 154
Port ID是由优先级+端口号组成
修改端口优先级:默认情况下是128
Sw1(config-if)#
spanning-tree port-priority 16 注意:必须是16的倍数才行
One designated port per segment(每个Segment只有一个指定端口)
选举RP/DP的方法:
1.Lowest RID(最小的RID) 是SW1(根桥)的BID
2.Lowest path cost to root bridge(到达根的最小路径开销)
3.lowest sender BID (最小的发送BID)
4.Lowest sender port ID
・根桥的所有端口都是指定端口(DP),也是转发端口
Nondesignated ports are blocked(非指定端口将被堵塞)
・最后,既不是根端口,又不是指定端口的哪些接口被称为非指定端口,这些端口将被block掉。从而达到防环的目的。
<生成树的收敛>
当网络出现故障导致拓朴发生变化时,生成树要进行收敛,在收敛过程中,一个block接口变到forward状态时会经历以下四种状态变化。
生成树端口状态:
1、blocking--阻塞状态,不转发帧,监听流入的BPDU,不学习MAC地址
2、listening--监听状态,不转发帧,不学习MAC地址,能够决定端口角色,学习BPDU
3、learning--学习状态,不转发帧,能学习MAC地址(构建MAC地址表)
4、forwarding--转发状态,能够进行正常的帧转发
当拓扑发生变化时,端口从阻塞状态过渡到正常转发状态的时间是
30-50S
如果是直连接口down掉,端口状态过渡最大需要
30S
*Mar 1 00:25:
10.819: STP: VLAN1 Fa1/3 ->
blocking
*Mar 1 00:25:10.823: STP: VLAN1 new root port Fa1/4, cost 19
*Mar 1 00:25:10.823: STP: VLAN1 Fa1/4 ->
listening
*Mar 1 00:25:25.855: STP: VLAN1 Fa1/4 ->
learning
SW2#
*Mar 1 00:25:40.859: STP: VLAN1 sent Topology Change Notice on Fa1/4
*Mar 1 00:25:
40.859: STP: VLAN1 Fa1/4 ->
forwarding
如果是非直连故障,最大需要
50S
*Mar 1 00:29:
33.843: STP: VLAN1 new root port Fa1/4, cost 19
*Mar 1 00:29:33.875: STP: VLAN1 Fa1/4 ->
listening
SW2#
*Mar 1 00:29:48.907: STP: VLAN1 Fa1/4 ->
learning
SW2#
*Mar 1 00:30:03.943: STP: VLAN1 sent Topology Change Notice on Fa1/4
*Mar 1 00:30:
03.947: STP: VLAN1 Fa1/4 ->
forwarding
<二层MAC地址表的收敛>
注意:在网络拓朴发生改变后,不仅会有STP的收敛,还会导致二层MAC地址表的收敛。
・当发生如下事件时,SW会发送TCN:
1.链路故障(FWD -> BLK)
2.端口进入转发状态,并且SW已经拥有DP
3.非根桥从它的DP接收到TCN,并将其转发
MAC地址表的收敛过程如下:
1、拓扑发生改变的交换机向RP端口发出TCN的BPDU
2、上级交换机做两件事:先回应一个TCA置位的BPDU,再继续向自已的RP接口发出TCN的BPDU
3、TCN的BPDU就这样一跳跳的传到根交换机上
4、然后根交换机将自已MAC地址表的老化时间由默认的300S改为转发延迟时间(15S)。
5、根交换机再向网络中发出TC置位的BPDU
6、网络中的其他交换机收到TC置位的BPDU后,也将自已MAC地址表的老化时间由默认的300S改为15S。
这样,每台交换机就快速的老化了MAC地址表,清除掉了已经失效的MAC地址条目。
<BPDU Timer>
三个计时器:
・Message Age:最大存活时间(20S)
Hello Time:根桥连续发送BPDU的间隔(2S)
Forward Time:SW在监听和学习状态所停留的时间(15S)
spanning-tree vlan 1-10 hello-time 3 修改发送BPDU的时间间隔
spanning-tree vlan 1-10 forward-time 13 修改forward时间
spanning-tree vlan 1-10 max-age 33 修改最大存活时间
注意:必须在根桥上修改,否则不起作用。
1.老化时间(blocking)(loss of BPDU detected)max age=20s
(mac access ex stp
deny an an
int f0/23
mac access-group stp in)
2. 监听时间(listening)forward delay=15s
3.学习时间(learning)forward delay=15s
监听BPDU 学习MAC 帧转发
Blocking √ × ×
Listening √ × ×(选举Root/RP/DP)
Learning √ √ ×
Forwarding √ √ √
<STP和802.1Q>
・CISCO交换机上,在采用802.1Q的Trunk中,SW为Trunk中所允许的每个VLAN维护一个STP。
(PVST)
・对于不支持802.1Q的SW,所有VLAN维护一个STP。(SSTP)
・在交换网络中,STP是始终运行的,如果链路没有Trunking.STP只维护VLAN1的信息。
Per VLAN Spanning Tree
优点:1.基于Vlan的负载均衡;
缺点:1.BPDU是基于Vlan 的基础上运行的;
<STP的一些增强特性>
・802.1D STP设计初衷:网络中断后能够在1分钟之内(Max=50S)恢复。
伴随着LAN出现3层交换,很多的路由协议(OSPF/EIGRP)都能在几秒之内收敛。
・Cisco为加快收敛时间,提出了一些私有的优化特性来加速STP的收敛:
1、PortFast
2、UpLinkFast
3、BackboneFast
・PortFast: (接入层交换机接入口地方)
能够让2层的接入端口(接host)跳过LIS/LRN状态立即进入FWD。
30S->0S
基于接口,用于接非交换机接口,不要设置在接SW的端口。
Sw1#show spanning-tree
Type: Edge [Shr/P2p]
测试:把交换机的端口shut down,再no shut down,观察状态。启用前和启有后是不一样的。
SW1(config)#int f1/5
SW1(config-if)#sh
SW1(config-if)#
*Mar 1 00:34:47.163: STP:
VLAN1 Fa1/5 -> blocking
SW1(config-if)#no sh
*Mar 1 00:35:03.683: STP:
VLAN1 Fa1/5 ->jump to forwarding from blocking
Sw1(config)#spanning-tree portfast default (所有接口启用)全局下用
一般用在接入层的交换机上。
Sw1(config-if)#spanning-tree portfast 接口下单独启用
Sw1(config-if)#spanning-tree portfast disable (某个口禁用,通常是连接另一台交换机的口)
・UplinkFast:(接入层交换机链接汇聚层的地方)
在接入层SW上配置,用于检测直连到分布层SW的链路故障,并加速STP的收敛速度。
也可以在分布层交换机上配置,用于检测直连到核心层交换机的链路故障
30S->0S
Sw2(config)#spanning-tree uplinkfast
(Uplinkfast是一个全局命令,将影响SW上的所有VLAN)
Debug spanning-tree events
测试:将有效链路口shut,原来BLK口立即转发
*Mar 1 00:40:
12.027: STP: VLAN1 new root port Fa1/4, cost 19
*Mar 1 00:40:12.055: STP: VLAN1 Fa1/4 -> listening
SW2(config-if)#
*Mar 1 00:40:27.087: STP: VLAN1 Fa1/4 -> learning
SW2(config-if)#
*Mar 1 00:40:42.099: STP: VLAN1 sent Topology Change Notice on Fa1/4
*Mar 1 00:40:
42.099: STP: VLAN1 Fa1/4 -> forwarding
*Mar 1 00:44:48: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN1
FastEthernet1/4 moved to Forwarding (UplinkFast).
SW2(config-if)#do sh run
Building configuration...
spanning-tree uplinkfast
・Uplinkfast将网桥PRI增加到49152,将端口Cost增加3000
SW2#sh spanning-tree bri
VLAN1
Spanning tree enabled protocol ieee uplinkfast enabled
Root ID Priority 32768
Address cc00.0838.0000
Cost 3019
Port 44 (FastEthernet1/3)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 49152
Address cc01.0838.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 0
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet1/3 128.44 128
3019 FWD 0 32768 cc00.0838.0000 128.44
FastEthernet1/4 128.45 128
3019 BLK 0 32768 cc00.0838.0000 128.45
FastEthernet1/5 128.46 128
3019 BLK 19 32768 cc02.0838.0000 128.46
使SW不能成为Root。所以一般配置在接入层SW。
Sw2#show spanning-tree
........ Uplinkfast enabled
Sw2#show spanning-tree uplinkfast 可以看到哪些接口成为备份
Sw2(config)#spanning-tree uplinkfast max-update-rate 200
(每秒所发包的数目,默认值150)
・BackboneFast:(汇聚层交换机到核心层的地方)
BackboneFast是对UplinkFast的一种补充。用于检测主干SW间的链路故障。(50S -> 30S)
・要求BackboneFast应用在所有SW上。
当交换机检测到次级BPDU后,将使用替代路径发送RLQ BPDU(根链路查询BPDU),RLQ BPDU通过中间交换机向根交换机传播,并且根交换机将最终响应。
Sw1(config)#spanning-tree backbonefast
*Mar 1 00:51:56.631: STP: VLAN1 Fa1/2 -> listening
*Mar 1 00:51:56: %SYS-5-CONFIG_I: Configured from console by console
*Mar 1 00:51:58: %LINK-3-UPDOWN: Interface FastEthernet1/2, changed state to up
SW1#
*Mar 1 00:51:58.335: STP: VLAN1 Topology Change rcvd on Fa1/1
SW1#
*Mar 1 00:51:59: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/2, changed state to up
SW1#
*Mar 1 00:52:11.631: STP: VLAN1 Fa1/2 -> learning
SW1#
*Mar 1 00:52:26.639: STP: VLAN1 Fa1/2 -> forwarding
Sw1#show spanning-tree backbonefast 可以查看RLQ消息和次级BPDU
SW1#sh sp bac
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