STP
STP基本概念
名称 | 概念 |
---|---|
桥ID(Bridge Identification) | 每一台运行STP的交换机都拥有一个唯一的桥ID。8Byte,包含16bit的桥优先级(Bridge Priority)和48bit的桥MAC地址,其中桥优先级占据桥ID的高16bit,而MAC地址占据其余的48bit |
根桥(Root Bridge) | 网络中拥有最小桥ID的交换机将成为根桥。首先比较桥优先级,桥优先级小的值将胜出成为根桥,如果优先级相等,再比较MAC地址最小的交换机为根桥 |
开销(Cost) | 丈量交换机某个接口到根桥的“成本” |
接口ID(Port Identification) | 长度为16bit,高4bit是接口优先级,低12bit是接口编号,缺省时接口优先级为128,取值范围0-240,并且必须是16的倍数 |
STP的基本操作过程
- 在交换网络中选举一个根桥(Root Bridge,RB),桥ID最小的交换机将成为根桥,根桥具有可抢占性
- 在每个非根桥上选举一个根接口(Root Port,RP),根接口就是非根桥上所有接口中收到最优BPDU报文,可以简单理解成交换机在STP树上“朝向”根桥的接口。非根桥可能会有一个或多个接口接入同一个交换网络,STP将在这些接口之中选举出一个(而且只会选一个)根接口。在STP收敛完成之后,根桥依然会周期性地向网络中发生BPDU,而非根桥则会周期性地在自己的根接口上收到BPDU,并沿着STP树向下游转发
- 选举指定接口(Designated Port,DP),STP将在每个网段中选举一个指定接口,这个接口是该网段内所有接口中到达根桥的最优接口。此外,指定接口还负责向该网段发送BPDU。对于非根桥而言,其所有接口中收到最优BPDU的接口将成为该设备的根接口,随后该非根桥使用自己接收的最优BPDU,为本设备上的其他接口各计算一个BPDU,然后使用计算出的BPDU与接口上所维护的BPDU(接口自身也会从网络中收到BPDU,并将BPDU保存起来)进行比较,如果前者更优,那么该指定将成为指定接口,并且其所保存的BPDU也被前者替代,交换机将替代后的BPDU从该指定接口转发给下游交换机;如果后者更优,那么该接口将成为非指定接口(非指定接口指的是既不是接口,又不是指定接口的接口)。
- 阻塞非指定接口,打破二层环路,经过STP计算后,交换机的某个(或者某些)接口既不是根接口又不是指定接口,那么该接口将会被STP阻塞。
对于非根桥而言,根接口的选举过程是非根桥将自己所收到的所有BPDU进行比较,而指定接口的选举则是非根桥用自己计算出的BPDU跟别的设备发过来的BPDU进行比较
STP报文
配置BPDU(Configuration BPDU)
每台交换机都从自己激活了STP的接口向外发送配置BPDU。当STP收敛完成后,只有根桥才会周期性地发送配置BPDU(缺省时,以2s为周期发送配置BPDU,可以在设备的系统视图下使用stp timer hello命令修改发送周期),而非更桥则会在自己的根接口上收到上游发送过来的配置BPDU,并立即被触发而产生自己的配置BPDU,然后从自己的指定接口发送出去。这一过程看起来就像是根桥发出的配置BPDU逐跳地“经过”了其他的交换机
字节数 | 字段 | 描述 |
---|---|---|
2 | 协议ID(Protocol Identifier) | 对于STP而言,该字段的值总为0 |
1 | 协议版本ID(Protocol Version Identifier) | 对于STP而言,该字段的值总为0 |
1 | BPDU类型(BPDU Type) | 指示本BPDU的类型,若值为0x00,则表示本报文为配置BPDU;若值为0x80,则本报文为TCN BPDU |
1 | 标志(Flag) | 对于STP而言,该字段(共8bit)用于网络拓扑变化标志。STP只使用了该字段的最高及最低两个比特位,最低位是TC(Topology Change,拓扑变更)标志,最高位是TCA(Topology Change Acknowledgment,拓扑变更确认)标志 |
8 | 根桥ID(Root Identifier) | 根桥的桥ID |
4 | 根路径开销(Root Path Cost) | 到达根桥的STP路径开销 |
8 | 网桥ID(Bridge Identifier) | 发送本BPDU的交换机的桥ID |
2 | 接口ID(Port Identifier) | 发送本BPDU的接口的接口ID |
2 | 消息寿命(Message age) | 本BPDU的寿命。在根桥所发送的BPDU中,该字段值为0,此后BPDU每经过一个交换设备,该字段值增加1,因此实际上这个字段指示的是BPDU所经过的交换设备的个数 |
2 | 最大寿命(Max age) | BPDU的最大存活时间,也称老化时间,缺省为20s |
2 | Hello时间(Hello time) | BPDU的发送时间间隔,缺省为2s |
2 | 转发延迟(Forward Delay) | 接口在侦听和学习状态所停留的时间,缺省为15s |
TCN BPDU(详见该书456页的图10-12)
只有上表的“协议ID”、“协议版本ID”以及“BPDU类型”三个字段。当拓扑发生变更时,远离变更点的交换机无法直接感知到变化的发生,此时它们的MAC地址表项还是老旧的,如果依然通过这些MAC地址表项来知道数据转发,便可能出现问题。因此STP需要一种机制,用于在网络中发生拓扑变更时促使全网的交换机尽快老化自己的MAC地址表项,以便适应新的网络拓扑。当拓扑稳定时,网络中只会出现配置BPDU,而当拓扑发生变更时,STP会使用TCN BPDU,以及两种特殊的配置BPDU:
- “标志”字段中TCA比特位被设置为1的配置BPDU。STP要求TCN BPDU从发现拓扑变更的交换机传递到根桥的过程是可靠的,因此当一台交换机收到下游发送上来的TCN BPDU后,需使用“标志”字段中TCA比特位被设置为1的配置BPDU回应对方并向自己的上游发送TCN BPDU。这个过程将一直持续,直到根桥收到该TCN BPDU
- “标志”字段中TC比特位被设置为1的配置BPDU。根桥收到TCN BPDU后,也就意识到了拓扑变化变化的发生,接下来它要将该变化通知到全网,它将向网络中泛洪“标志”字段中TC比特位被设置为1的配置BPDU,网络中的交换机收到该配置BPDU后,会立即将其MAC地址表的老化时间从原有的值调整为一个较小的值(该值等于转发延迟时间),使MAC地址表能够尽快刷新,以便适应新的网络拓扑
STP的时间参数
- Hello Time(Hello时间):运行了STP的交换机发送配置BPDU的时间间隔,缺省为2s。如需修改STP发送配置BPDU的时间间隔,那么必须在根桥上修改,修改完成后,所有的非根桥都与根桥对齐该时间值
- Forward Delay(转发延迟):运行了STP的接口从侦听状态进入学习状态,或者从学习状态进入转发状态的延迟时间,缺省为15s。为了避免在生成树收敛过程中网络中可能出现的临时环路,或者短暂的数据帧泛洪现象,STP定义了侦听及学习这两种接口状态,并要求接口从阻塞状态进入转发状态前必须先经历这两个状态,而且分别在这两个状态各停留一个转发延迟时间。
- Max Age(最大生存时间):也称为老化时间,缺省为20s。以非根桥的根接口为例,该设备将在这个接口上保存来自上游的最优BPDU,这个BPDU关联着一个最大生存时间,如果在该BPDU到达最大生存时间之前,接口再一次收到了BPDU,那么其最大生存时间将会被重置,而如果接口一直没有再收到BPDU从而导致该接口上保存的BPDU到达最大生存时间,那么该BPDU将被老化,此时设备将会重新在接口上选择最优BPDU,也就是重新进行根接口的选举
STP接口状态
状态名称 | 状态描述 |
---|---|
禁用(Disable) | 该接口不能收发BPDU,也不能收发业务数据帧,例如接口为down |
阻塞(Blocking) | 该接口被STP阻塞,处于阻塞状态的接口不能发送BPDU,但是会持续侦听BPDU,而且不能收发业务数据帧,也不会进行MAC地址学习 |
侦听(Listening) | 当接口处于该状态时,表明STP初步认定该接口为根接口或者指定接口,但接口依然处于STP计算的过程中,此时接口可以收发BPDU,但是不能收发业务数据帧,也不会进行MAC地址学习 |
学习(Learning) | 当接口处于该状态时,会侦听业务数据帧(但是不能转发业务数据帧),并且在收到业务数据帧后进行MAC地址学习 |
转发(Forwarding) | 处于该状态的接口可以正常收发业务数据帧,也会进行BPDU处理,接口的角色需是根接口或指定接口才能进行转发状态 |
当交换机的一个接口被激活后,该接口将从禁用状态自动进入阻塞状态。处于阻塞状态的接口如果被交换机选举为根接口或者指定接口,那么它将从阻塞状态进入侦听状态,并且在侦听状态停留15s(转发延迟时间)。在侦听状态停留15s后,如果该接口依然是根接口或者指定接口,那么它将进入学习状态,并且在该状态下也停留15s(转发延迟时间)。由于此时交换机在接口上并未学习到任何MAC地址,因此如果接口从侦听状态立即进入转发状态的话,就有可能在短时间内导致网络中出现不必要的数据帧泛洪现象。所以,STP规定接口从侦听状态进入学习状态后,也需停留15s,在这段时间内交换机在该接口持续侦听业务数据帧并学习MAC地址,为进入转发状态做好准备
stp mode stp //修改为stp模式
stp enable //激活生成树
display stp //查看stp的状态
stp cost 50000 //修改stp接口cost值位50000
stp priority 0 //修改stp优先级为0
RSTP
名称 | 概念 |
---|---|
替代接口 | 可以简单理解为根接口的备份,由于收到了其他设备所发送的BPDU从而被阻塞的接口 |
备份接口 | 设备上由于收到了自己所发送的BPDU从而被阻塞的接口。如果一台交换机拥有多个接口接入同一个网段,并且在这些接口中有一个被选举为该网段的指定接口,那么这些接口中的其他接口将被选举为备份接口,备份接口将作为该网段到达根桥的冗余接口 |
一台设备如果是非根桥,那么它有且只能有一个根接口,但是该设备可以没有替代接口,也可以有,当存在替代接口时,可以存在一个或多个。当设备的根接口发生故障时,最优的替代接口将成为新的根接口
STP的接口状态 | RSTP的接口状态 |
---|---|
禁用(Disabled) | |
阻塞(Blocking) | 丢弃(Discarding) |
侦听(Listening) | |
学习(Learning) | 学习(Learning) |
转发(Forwarding) | 转发(Forwarding) |
RSTP的配置BPDU被称为RST BPDU(Rapid Spanning Tree BPDU),协议ID字段值为0x02,BPDU类型字段的值为0x02,标示字段8bit如下,
名称 | bit |
---|---|
TCA | 1bit |
Aggreement | 1bit |
Forwarding | 1bit |
Learning | 1bit |
Port Role | 2bit |
Proposal | 1bit |
TC | 1bit |
- Aggreement(同意)及Proposal(提议)比特位用于RSTP的P/A机制;
- Port Role(接口角色)比特位的长度为2bit,用于标识该RST BPDU发送接口的接口角色,01表示根接口,10表示替代接口,11表示指定接口,而00则被保留使用;
- Forwarding(转发)及Learning(学习)比特位用于表示该RST BPDU发送接口的接口状态
RSTP与STP不同,在网络稳定后,无论是根桥还是非根桥,都将周期性地发送配置BPDU,也就是说对于非根桥而言,它们不用在根接口上收到BPDU之后,才被触发而产生自己的配置BPDU,而是自发地、周期性发送BPDU
RSTP在BPDU的处理上的另一点改进是对于次优(Inferior)BPDU的处理。运行STP的交换机在每个接口上保存一份BPDU,对于根接口及非指定接口而言,交换机保存的是发送自上游交换机的BPDU,而对于指定接口而言,交换机保存的是自己根据根接口的BPDU所计算出的BPDU。如果接口收到一份BPDU,而且该接口当前所保存的BPDU比接收的BPDU更优,那么后者对于前者而言,就是次优BPDU,在STP中,当指定接口收到次优BPDU时,它将立即发送自己的BPDU,而对于非指定接口,当其收到次优BPDU时,它将等待接口所保存的BPDU老化之后,再重新计算新的BPDU,并将新的BPDU发送出去,这将导致非指定接口需要最长约20s的时间才能启动状态迁移。在RSTP中,无论接口的角色如何,只要接口收到次优BPDU,便立即发送自己的BPDU,这个变化使得RSTP的收敛更快
边缘接口
缺省不参与生成树计算,当边缘接口被激活之后,可以立即切换到转发状态并开始收发业务流量,而不用经历转发延迟时间,并且边缘接口的关闭或激活并不会触发RSTP拓扑变更;如果边缘接口误接交换机并且收到了BPDU,则该接口立即变成一个普通的生成树接口,在这个过程中,可能引发网络中的RSTP重计算,从而对网络造成影响
//开启边缘接口
stp edged-port enable
//激活该接口的BPDU过滤功能 激活后该接口不再发送BPDU,收到BPDU时也会直接忽略
stp bpdu-filter enable
P/A机制
- LSW1和LSW2立即在各自的接口上发送BPDU,初始时双方都认为自己是根桥
- 经过BPDU交互后,LSW2将认为LSW1才是当前的根桥,此时SW1的E0/0/2口是指定接口,而LSW2的E0/0/1口为根接口,两个接口将立即停止发送BPDU。这两个接口当前都处于丢弃状态
- 接下来P/A过程,LSW1的E0/0/2接口为指定接口且处于丢弃状态,因此LSW1从E0/0/2接口发送Proposal置位的BPDU
- LSW2收到Proposal置位的BPDU后,立即启动同步过程,此时RSTP的机制是确保指定接口(LSW1的E0/0/2)能够快速地进入转发状态,为了达到这个目的,必须确保该接口进入转发状态后网络中不存在环路,因此LSW2的思路是:先将本地的所有非边缘接口全部阻塞,然后答复LSW1这里不存在环路,后者可以放心大胆地将接口切换到转发状态;已经处于丢弃状态的接口缺省即已完成同步,而边缘接口则不参加该过程,除此之外,交换机处于转发状态的指定接口需切换到丢弃状态以便完成同步。如图,假设LSW2的E0/0/2为边缘接口、E0/0/3为非边缘指定接口,那么E0/0/2不参与该过程、E0/0/3接口则被立即切换到丢弃状态
- 现在LSW2的所有接口都完成了同步,LSW2知道本地的接口不存在环路,它立即将根接口E0/0/1切换到转发状态,并从E0/0/1口向LSW1发送Agreement置位的BPDU
- LSW1在E0/0/2接口上收到Agreement置位的BPDU后,立即将该接口切换到转发状态,此时PC1和PC2就能通信了
- 由于LSW2的E0/0/3此时依然处于丢弃状态,因此该接口也将向下游交换机发起一个P/A过程
保护功能
//配置该命令后,边缘接口接收到BPDU就会shutdown
stp bpdu-protection
//自动恢复bpdu-protection的接口30秒
error-down auto-recovery cause bpdu-protection interval 30
//根保护,如果接收到更优的BPDU,则会忽略这些BPDU,并将接口切换到丢弃状态(只在指定接口上激活才有效)
//如果接口不再接收到更优的BPDU,则一段时间后(通常为两倍的转发延迟时间),它将会自动恢复到转发状态
stp root-protection
//配置环路保护功能
stp loop-protection
//配置禁用生成树
stp disable
如图,网络收敛完成后,此时如果在LSW2的E0/0/1(根接口)上配置环路保护功能,这时如果LSW1到达LSW2的单向链路出现故障的话,该接口长时间没有接收到BPDU,此时会将其切换为指定接口,并将其切换到丢弃状态,直到该接口再次接收到BPDU;如果将LSW2的E0/0/2(替代接口)配置环路保护功能,该接口长时间没有接收到BPDU,交换机会将该接口调整为指定接口,但是会保持其丢弃状态避免环路
RSTP错误地阻塞接口导致网络故障
如图,当LSW1的E0/0/2口阻塞后,LSW1与LSW3之间就无法建立OSPF邻接关系;此时只需要将E0/0/2口禁用生成树能解决
MSTP
能够兼容STP及RSTP,在该协议中生成树是基于instance(实例)运行的,所谓instance(实例),就是一个或者多个vlan的集合。可以将一个或者多个vlan映射到一个instance(实例),然后MSTP基于该instance计算生成树,基于instance的生成树被称为MSTI(Multiple Spanning Tree Instance,多生成树实例),MSTP为每个instance维护独立的MSTI。映射到同一个instance的vlan将共享同一棵生成树。instance使用instance-ID进行标识,在华为交换机上,instance-ID的取值范围是0-4094,其中instance0是缺省便已经存在的,而且缺省时,交换机上所有的vlan都映射到了instance0。MSTP引入了域(Region)的概念,可以将一个大型的交换网络划分成多个MST域(Multiple Spanning Tree Region,多生成树域),一个MST域内可以包含一个或多台交换机,同属一个MST域的交换机必须配置相同的域名(Region Name)、相同的修订级别(Revision Level)、相同的vlan与instance的映射关系
stp mode mstp //切换stp模式为mstp
stp enable //开启stp
如图,让vlan1-10走LSW1和LSW3这条链路,vlan11-20走LSW2和LSW3这条链路
//LSW1的配置
#
vlan batch 2 to 20
#
stp instance 0 root primary
stp instance 1 root primary
stp instance 2 root secondary
#
stp region-configuration
region-name HCNP
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
interface Ethernet0/0/2
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
//LSW2的配置
#
vlan batch 2 to 20
#
stp instance 0 root secondary
stp instance 1 root secondary
stp instance 2 root primary
#
stp region-configuration
region-name HCNP
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
interface Ethernet0/0/2
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
//LSW3的配置
#
vlan batch 2 to 20
#
stp region-configuration
region-name HCNP
instance 1 vlan 2 to 10
instance 2 vlan 11 to 20
active region-configuration
#
interface Ethernet0/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
interface Ethernet0/0/2
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
interface Ethernet0/0/4
port link-type access
port default vlan 2
#
interface Ethernet0/0/5
port link-type access
port default vlan 11
#