1. 为什么需要STP
在复杂网络拓扑结构中,为了增加网络的可靠性,需要对链路做一定的冗余,以便当其中一条链路或某台交换机出现故障时,整个网络还能保持通畅。
但是,冗余链路会形成环路,造成网络风暴。
这种情况下,生成树协议(Spanning Tree Protocol, STP)应运而生。
2. 什么是STP
生成树协议是一种二层管理协议,它通过有选择地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路备份功能。
3. STP 发展历史
生成树协议和其他协议一样,是随着网络的不断发展而不断更新换代的。最初被广泛应用的是 IEEE 802.1D-1998 STP(Spanning Tree Protocol,生成树协议),随后以它为基础产生了 IEEE 802.1w RSTP(Rapid Spanning Tree,快速生成树协议)和 IEEE 802.1s MSTP(Multiple Spanning Tree Protocol,多生成树协议)。
4. 相关概念
(1)Bridge Group Address
STP协议使用的所有BPDU都是组播报文,目的MAC是01-80-c2-00-00-00
(2)Root Bridge
根桥(Root Bridge),就是“网桥ID”最优的桥,当STP的拓扑结构稳定之后由根桥负责每2秒(Hello Time)向树中所有的网桥发送配置BPDU报文(只有根桥会发),其他网桥接收并转发。
根桥有且只有一个,它是整个网络的逻辑中心,不一定是物理中心。根据网络拓扑的变化,根桥可能改变。
(3)Port Pole
①Root Port,根端口,即去往根桥路径最近的端口,这个最近的衡量是靠 Root Path Cost 来判定的。Path Cost 的计算,是每当一个端口收到一个 BPDU 后,会在该 BPDU 所指示的 Path Cost 上加上该端口的 Port Path Cost(这是可以人为配置的)。比较累计 Root Path Cost 最小的端口就是根端口,如果两条路径开销相同,那么就选择 BID 较小的。
②Designated Port,指定端口,即在一个 LAN 里面负责转发 BPDU 的端口,根桥和非根桥上都有它,但根端口只在非根桥上有,同样 block 端口也只存在于非根桥上。
③Alternate Port,替换端口,由于学习到其他设备发送的BPDU报文而阻塞的端口,作为根端口的备份端口,提供了到根桥的另一条可切换的路径。
④Backup Port,备份端口
5. STP 工作原理
(1)生成树算法
生成树协议运行生成树算法(STA)。其过程可以归纳为以下三个步骤:
1)选择根网桥(Root Bridge)
2)选择根端口(Root Ports)
3)选择指定端口(Designated Ports)
(2)工作过程
①选择根网桥
刚上电时,所有的交换机都认为自己是“根桥”,向外发送配置BPDU
根据网桥ID,网桥ID最小的被选为 Root Bridge
struct bridge_id
{
unsigned char prio[2]; // 默认 32768
unsigned char addr[ETH_ALEN];
};
LSW1:CIST Bridge :32768.4c1f-cce5-1c02
LSW2:CIST Bridge :32768.4c1f-cc9f-5fde // 最小,被选为 Root Bridge
LSW3:CIST Bridge :32768.4c1f-ccf2-23fd
②选择根端口
选出了根网桥后,STP开始选择根端口。根端口存在每个非网桥上,需要在每个非根网桥上选择一个根端口。
选择根端口按照如下顺序:
a)到根网桥最低的根路径开销的端口
b)直连的网桥 的ID 最小的端口
c)端口 ID 最小
到达根路径的cost值计算方式为收到的cost值 + root端口的cost值
根路径开销,是指当前口收到的从Root Bridge发出的BPDU的路径开销,而不是从这个口发出去的。
现在要在LSW1、LSW3上选择Root Port。先看LSW1,GE 0/0/1 口的根路径开销为20000,GE 0/0/2 口的根路径开销为40000(经过LSW3),所以会选择 GE 0/0/1 为 Root Port。同理可得 LSW3 会选择 GE 0/0/2 为 Root Port
③选择指定端口
选择完根网桥和非根网桥的根端口后,一个树形结构已初步形成,但是,所有链路仍然连接在一起,并可以到处处于活动状态,最后导致形成环路。
为此,STP进行最后的计算,在每一个网段(网线)上选择一个指定端口,选择指定端口的依据有三个:
a)根路径成本较低
b)所在的交换机的网桥ID较小
根网桥上的接口都是指定端口(原因?:因为根网桥上端口的根路径成本为0)
LSW1的GE 0/0/1 和 LSW3的 GE0/0/2 已经被选为Root Port了,现在只能在 LSW1的GE0/0/2 和 LSW3的GE 0/0/1中选择一个作为指定端口了,两个端口的路径开销相同(都为40000),那么只能比较网桥的ID了,LSW1的网桥ID较小,所以LSW1上的端口选作指定端口。
STP 计算过程结束,这时,只有在LSW3上连接到LSW1的端口既不是根端口,也不是指定端口,那么这个端口被阻塞(Block)。被阻塞的端口不能进行数据传输。
由于端口阻塞,所以拓扑结构等价于图STP_2
LSW1和LSW3之间的链路成为备份链路。
6. 帧格式
BPDU 报文帧格式
7. 技术细节
(1)端口状态
#define BR_STATE_DISABLED 0 // 什么功能都没有,只有一个逻辑设备。
#define BR_STATE_LISTENING 1 // 可以接收和发送网络传输的BPDU,但不能进行数据帧的转发、不能学习。
#define BR_STATE_LEARNING 2 // 可以接收和发送BPDU,可以学习,但是不能进行数据帧的转发。
#define BR_STATE_FORWARDING 3 // 可以接收和发送BPDU、可以学习、可以进行数据帧的转发。
#define BR_STATE_BLOCKING 4 // 只能接收BPDU,不能发送BPDU,不能学习,不能转发数据帧。
Disabled:或down状态,认为物理上断掉
Listening:收发BPDU、不能学习、不能转发流量。这是一种过渡状态,上述三步选择(根桥、根端口、指定端口)就是在该状态内完成的。(可以理解为此状态在构建网络拓扑结构)
Learning:收发BPDU、地址表学习、不能转发流量。这是一种过渡状态,主要为了构建MAC地址表,所以叫做学习状态。
Forwarding:收发BPDU、地址表学习、转发流量,只有根端口和指定端口才有这种状态
Blocking:接收BPDU、不能发送BPDU、不能学习、不能转发流量。STP之所以能够阻断环路,就是依赖于将某些端口置为Blocking状态。交换机开启,端口由Disabled状态进入Blocking状态,若任何端口都收不到BPDU,持续Max Age时间后,端口进入Listening状态。或者本身被选举为根端口,也会马上进入Listening状态。
(2)端口状态转移
(3)3个计时器
对于STP,有3个计时器影响着端口状态以及网络收敛
Hello Timer:交换机发送BPDU的时间间隔,当网络拓扑稳定后,该定时器的修改只有在根桥修改才有效。
Forwarding Timer:一个端口处于Listening和Learning的时间,默认为15秒。即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口不能转发流量。在端口被选为根端口或者指定端口后,还需要等待两个Forwarding Delay才能进行转发,这是因为拓扑结构生成需要时间,当拓扑结构发生变化后,BPDU逐跳传递,如果先感知的交换机采用新的拓扑结构,后感知的交换机还在使用老的拓扑结构,有可能形成环路,所以这两个Forwarding Delay是为了避免产生临时环路。
Max Age:端口的BPDU老化时间,如果超过这个时间还收不到BPDU,则认为该端口上的BPDU老化。这个时间默认为20秒。
8. 版本差异
RSTP
(1)端口角色增补
增加Alternate Port、Backup Port
(2)端口状态缩减
Blocking、Listening 统一为 Discarding 状态
Discarding:不学习地址表、不转发流量
Learning:学习地址表、不转发流量
Forwarding:学习地址表、转发流量
(3)BPDU报文格式
a)Type字段,由0改为2
b) Version字段,由0改为2
c) Flag字段,把原来保留的中间6位使用起来
(4)收敛速度更快
STP协议中BPDU的超时时间为老化时间(Max Age),默认20秒。RSTP中超时时间为3个Hello Time时间。
(5)边缘端口
如果某指定端口位于整个域的边缘,即不再与其他交换机连接,这种端口就叫做边缘端口(需要手动设置)。边缘端口不参与RSTP运算,可以由Disabled直接转到Forwarding,不经历时延。很像在端口上把STP禁用了,但端口一旦收到BPDU,就丧失了边缘端口属性,成为普通STP端口。
(6)RSTP向下兼容STP
RSTP交换机在某端口上收到STP交换机的BPDU后,会在2个Hello Time时间后,把自己的端口转换到STP工作模式,发送配置BPDU。并且有选项可以设置,在STP交换机撤走之后,RSTP交换机是否可以迁移回RSTP模式。
(7)纯STP交换机收到RSTP的BPDU会直接丢弃
MSTP
(8)Vlan的出现
STP是Vlan无关的协议(在设计STP协议的时候,Vlan(IEEE 802.1Q)还没有出现),有了Vlan之后,使用STP时,会出现一颗生成树包含两个及以上Vlan的情况(这就是所谓的CST Common Spanning Tree,公共生成树)。STP对Vlan无感,进行自己的阻塞算法,可能导致某些链路不通。
针对这种情况,Cisco提出了PVST(per-Vlan Spanning Tree),每个Vlan对应一颗生成树。
(9)MSTP的出现
RSTP无法实现负载分担
RSTP下有些Vlan可能会不通
PVST中每个Vlan一个STP拓扑结构,交换机间要分别处理每棵树上的BPDU,开销很大。
Multiple Spanning Tree Protocol,多生成树协议,IEEE 802.1s,提出了Vlan和生成树之间的“映射”思想。
1个或若干个Vlan可以映射到同一棵生成树,但是每个Vlan只能在一棵生成树里。
一个交换机可以跑多个生成树,为了区分,每一个生成树叫做一个MSTI(多生成树实例)。
(10) 角色
在MSTP中,一个端口可以在不同的生成树实例中充当不同的角色。
(11) BPDU报文格式
前35字节和RSTP相同(Version 改为3),从第36字节开始时MSTP专有段,为MSTI配置信息,由若干MSTI配置信息组组成。
(12) 拓扑结构
9. 小结
(1)rx:Root Port、Alternate Port、Backup Port
(2)tx:Designated Port
(3)对于非根网桥来说,Root Port有且只有一个
(4)由于根桥只会向外发包,所以其所有端口都是Designated Port。
(5)一根网线两端,有且只有一个Designated Port。
(6)网络拓扑稳定后,只有根桥会向外发BPDU。
(7)网络拓扑稳定后,只有根端口和指定端口转发流量。其它端口都处于Blocking状态。
(8)在一个网段上拥有指定端口的交换机,被称作该网段的指定网桥。