交换基础2-STP

STP,Spanning Tree Protocol,生成树协议。网络管理员经常会部署一些冗余链路防止单点中断,但是在一个交换网络中,冗余的链路可能引起重复帧甚至是广播风暴。为解决二层网络中交换节点之间的唯一路径问题,STP被设计出来解决二层环路。STP的目的是在二层冗余网络中在任意节点之间计算出一条最优无环路径。

STP主要有三个IEEE版本,802.1D/802.1w/802.1s。广义的STP泛指所有STP相关协议,如IEEE定义的上述三个标准,以及各厂商私有PVST/PVST, RAPID-PVST+,VBST等;狭义的STP专指IEEE802.1D STP。

IEEE 802.1D STP

IEEE802.1D是STP最早的版本。STP采用STA(Spanning Tree Arithmetic)算法,在冗余链路中选择一个参考点(根桥),将选择要到达的路径,并阻断其它路径。若路径失效,自动启用其它路径。

STP相关概念

根桥Root Bridge

STA算法选定的参考点,是整个二层网络的逻辑中心。根桥可能会伴随网络拓扑变化而发生改变,但通常在二层网络设计中,会令根桥固定为某台核心交换机。

桥ID Bridge ID

交换机为STP分配的唯一标识号,不同版本STP有不同的结构。IEEE802.1D标准定义BID由2字节优先级(0-65535)和6个字节基mac共8字节组成。其中思科设备交换机默认优先级32768,可以手动修改,PVST+/Rapid PVST+优先级配置如下:

1
spanning-tree vlan 3-5 priority

端口ID Port ID

端口ID是发送BPDU端口的标识符,由4bit端口优先级和12bit端口号共16bit组成。PID通常被用来选举指定端口

根路径开销RPC

根路径开销是非根桥到根桥的最短路径开销,根端口的根路径开销都位0。路径开销是STP协议用于选择链路的参考值。根桥发出的COST值是0,在下一交换机的入口处才加上COST值,出口处COST值不变。某段链路的路径开销具体参考取值如下:

数据速率 802.1D STP 32bit推荐值(RSTP/MSTP)
10Mbps 100 2000000
100Mbps 19 200000
1Gbps 4 20000
10Gbps 2 2000

STP端口角色

根端口RP

根端口是去往根桥开销最小的端口。根端口负责向根桥方向转发数据,并接收上游BPDU和数据流量。每个交换机只有一个根端口,根桥没有根端口。

指定端口DP

指定端口是一台交换机向下游交换机转发BPDU的端口。在二层网络每一段都会选举一个指定端口。

STP端口状态

Forwarding–转发

转发状态下的端口既转发用户流量,也处理BPDU。转发状态是端口正常转发的最终状态。

Learning–学习

学习状态下的端口根据用户流量学习建立CAM表,但不转发流量。学习状态是为了防止临时环路的过渡状态。此过程持续15s。

listening–监听

监听状态下的端口确定端口角色,选举根桥、RP和DP。此过程持续15s。

Blocking–阻塞

阻塞状态下的端口仅接受并处理BPDU,不转发用户数据。阻塞状态是STP收敛后阻塞端口的最终状态。

Disabled–禁用

端口down,或未开启STP

BPDU

BPDU,Bridge Protocol Data Unit,桥协议数据单元,是STP协议通信的报文。BPDU直接采用二层封装,有以下作用:

  • 选举根桥

  • 确定冗余路径未知

  • 阻塞端口

  • 通告拓扑变更

  • 监控STP状态

初始状态下,二层网络每台交换机都认为自己是根桥,每隔2s发送BPDU,直到根桥被选举后,只有根桥会发送BPDU。非根桥只能进行转发。

BPDU类型

配置BPDU

通常由根桥周期性发出包括STP参数用于各种角色选举。802.1D配置BPDU抓包如下:

SWITCH STP_CONFIG

配置BPDU包含以下字段

字段 说明
Protocol ID STP固定为0
Version 协议版本,STP为0,RSTP为2,MSTP为3
Message Type BPDU类型,标记不同协议的conf或tcn BPDU
Flags 标记TC或TCA
Root ID 根ID
Cost of Path 根路径开销
Bridge ID 发送者桥ID
Port ID 发送端口PID
Message age 该BPDU老化时间
Max age 最大老化时间
Hellotime 发送BPDU间隔时间
Forward delay 控制listening和learning状态的持续时间
TCN

拓扑变化通告,当交换机检测到拓扑变化时发出。TCN BPDU只包含Protocol ID,Version和Message Type三个字段。802.1DTCN BPDU抓包如下:

SWITCH STP_TCN

STP三个定时器

Hellotime

hellotime用于指定根桥连续发送BPDU的间隔,默认值2秒

Forward Delay

转发延迟用于指定在Listening和Learning状态下所停留的时间,默认值15秒

Max Age

最大存活时间,默认值20秒。此时间内没有收到BPDU,则不再承认老根桥。

PVST+/Rapid PVST+定时器配置

1
switch(config)#spanning-tree vlan 3-5 [forward-time/hello-time/max-age]

STP端口选举

初始状态下,每台交换机认为自己是根桥,每2s扩散配置BPDU。STP通过一系列的选举,决定根桥、根端口、指定端口和非指定端口。在STP的各种选举中,参数值越小越优

总结下来可用四句话概括:

One root bridge per network–选根桥
One root port per nonroot bridge-选根端口
One designated port per segment-每段链路选指定端口
Nondesignated ports are blocked-非指定端口被阻塞

选根桥

BID是STP为每台交换机分配的唯一标识符,STP使用IEEE802.1D定义的优先级+基mac组成的BID。每个网络中只有一个根桥,规定拥有最小桥ID的交换机被选举为根桥

(非根桥)选根端口

每个非根桥有且只有一个根端口。对于非根桥,使用以下方法选举根端口:

1、该端口到达根桥cost最小

2、该端口收到的BID最小

3、该端口对接的端口PID最小,若对方PID相同则比较自己PID

(每段链路)选指定端口

根桥所有端口都是指定端口。对于每段链路,使用以下方法选举指定端口:

1、到达根桥cost最小

2、BID最小的一端

3、(集线器共享链路,一个冲突域)对方端口PID最小,若对方PID相同则比较自己PID

阻塞非指定端口

最后,既不是根端口,又不是指定端口的哪些接口被称为非指定端口,这些端口将被block掉。从而达到防环的目的。

在所有端口选举完成后,STP完成收敛,此时任意两节点之间的二层通路只有唯一一条。

二层收敛

STP收敛

当二层网络出现变动或故障时,可能会导致STP重收敛。STP会将端口状态按照以下顺序转变:BLOCKING–LISTENING–LEARNING–FORWARDING

STP收敛时间

当拓扑发生变化时,端口从阻塞状态过渡到正常转发状态的时间是30-50S
如果是直连接口down掉,端口状态过渡最大需要30S,因为无需等老化
如果是非直连故障,最大需要50S

CAM表收敛

二层网络故障或变动还会导致CAM表收敛。以下事件会使得STP发送TCN BPDU

  • 链路故障(FWD-BLK)

  • 端口进入FWD状态,且交换机拥有DP

  • 非根桥从DP收到TCN会将其转发

CAM表收敛过程如下:

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地址条目。

PVST/PVST+

很容易发现STP的一个弊端:STP协议将整个二层网络生成一颗树,这样就会导致诸多问题。比如不同VLAN可能会产生次优路径,冗余链路带宽浪费等。如下图所示,STP收敛后,阻塞一条链路,则在这条链路上任何VLAN的用户流量都不能被转发。

SWITCH STP_LOOP

PVST

思科为解决上述问题,开发了PVST,Per Vlan STP。PVST为每个VLAN创建一颗生成树,解决了不同VLAN次优路径问题,另外可以通过设计将二层流量进行一定程度的负载分担。假设上图中描述了VLAN10的树,而VLAN20的树中被阻塞的是左边一条链路,那么在二层网络通信中,VLAN10和VLAN20的流量将分别走左右两条链路,利用了冗余链路的带宽。

PVST+

由于PVST只支持ISL封装,并且无法与IEEE802.1D STP兼容,思科很快又开发了增强的PVST+协议。PVST+支持dot1Q封装,并且在VLAN1内可以与IEEE802.1D STP对接。PVST可以通过PVST+与IEEE802.1D STP间接对接。思科设备默认运行PVST+生成树协议,PVST+在某个VLAN内运行时基本与STP类似,包括计时器、端口状态等。PVST+ BPDU有单独的目的mac地址0100-0ccc-cccd。

PVST+配置

1
switch(config)#spanning-tree mode pvst
PVST+的BID

PVST+在计算BID时与STP稍有不同。BID共8个字节,STP使用前2个字节做priority,后6个字节做mac地址,中间10bit,保留不用;PVST+后6个字节做mac地址,前2个字节前4bit用作priority,后12bit用于表示vlan号。比如,PVST+ BID前2个字节如下:

1
0011 0000 0000 000a

则表示VLAN 10 的 优先级为12288(2^12+2^13),由于只用高4bit表示优先级,这也是优先级只能表示为4096倍数的原因

PVST+配置BPDU抓包如下:

SWITCH PVST+_CONFIG

PVST+增强特性

802.1D STP设计目的是为了让二层网络可以在冗余链路中断后,1min内恢复。这对于当时也不是一个很短的时间。为了加快收敛,Cisco设备支持了一些私有特性,优化STP收敛速度。

PortFast

PortFast特性可以让2层的接入端口跳过LIST/LRN状态直接进入FWD,可以节省30s的收敛时间。PortFast通常配置在终端接入端口。Porfast配置如下:

1
2
3
4
5
#接口开启
switch(config-if)#spanning-tree portfast

#或全局开启
switch(config)#spanning-tree portfast edge default
UplinkFast

UplinkFast特性用于检测直连到汇聚层链路故障并加快收敛。当上联FWD链路中断时,UplinkFast将增加交换机STP的priority和cost,原有BLK链路立即转为FWD状态,可节省30s时间。UplinkFast是全局命令,影响所有VLAN。UplinkFast配置如下:

1
switch(config)#spanning-tree uplinkfast
Backbonefast

Backbonefast特性是用于检测主干SW间的链路故障。接受到次级BPDU后会主动发送RLQ BPDU探测链路,加速收敛,可以节省20s老化时间。BackboneFast需要在所有交换机配置,配置如下:

1
switch(config)#spanning-tree backbonefast

IEEE 802.1w Rapid STP

IEEE802.1w在IEEE802.1D基础上改进了STP,制定了RSTP,快速生成树协议,RSTP加快了收敛速度并增加边缘端口及STP防护功能。

RSTP链路类型

运行RSTP的端口加入了链路类型概念。

点对点链路一般用于点对点连接的全双工链路,只有在点对点链路下,RSTP才能实现快速收敛。

共享链路用于连接物理层HUB的链路。

Edge

边缘链路,用于接入终端设备。

RSTP链路类型配置

1
switch(config-if)#spanning-tree link-type [point-to-point/shared]

RSTP端口角色

RSTP保留了STP中的根端口RP指定端口DP的概念

替代端口AP

到根网桥的替换路径, 用以替换的根端口, 责任是为其他网桥的链路作备份

备份端口BP

是指定端口的备份端口, 是为本网桥的端口作备份。备份端口只有两种情况下会存在:

  • 同一交换机两个端口通过点到点链路相连成一个环路

  • 网桥与物理层HUB共享网络有多条连接

边缘端口EP

边缘端口, 指网桥上连接到终端设备的端口, 此类端口可以实现快速收敛。边缘端口和PVST+的portfast类似,在up/down后不会产生拓扑改变。但是当RSTP边缘端口收到BPDU后,该端口会变成一个正常的生成树端口。

RSTP端口状态

Forwarding–转发

转发状态下的端口既转发用户流量,也处理BPDU。转发状态是端口正常转发的最终状态。

Learning–学习

学习状态下的端口根据用户流量学习建立CAM表,但不转发流量。学习状态是为了防止临时环路的过渡状态。此过程持续15s。

Discarding–丢弃

丢弃状态下的端口仅接受并处理BPDU,不转发用户数据。阻塞状态是STP收敛后阻塞端口的最终状态。

RSTP端口状态与STP对比

802.1D STP 802.1w RSTP 学习mac 收发用户数据
Disabled Discarding
Blocking Discarding
Listening Discarding
Learning Learning
Forwarding Forwarding

RSTP BPDU报文结构

RSTP与STP采用相同的目的mac地址0180-c200-0000。有以下字段与STP不同

SWITCH RSTP_STP

其中

version字段,message字段有改变,改为RSTP对应的值。

flag字段全部被使用,用于协商加速收敛。

增加v1长度字段

RSTP抓包如下:

SWITCH RSTP_BPDU

除非有老设备,否则通常RSTP不需要TCN BPDUP,RSTP使用TC置位的config BPDU通知拓扑变化

RSTP端口选举

RSTP与STP不同,在任何时候都会每隔2s发送BPDU。初始状态下,各交换机通过BPDU选举各式端口角色。

RSTP的根桥、RP、DP选举与STP类似,RSTP增加了AP和BP端口的选举。规则如下:

  • BP是DP的备份,所以某段链路选举出DP后,该DP所在交换机为指定交换机,BP只能出现在指定交换机上。

  • AP是RP的备份,除了DP,RP,BP,剩下的端口就是AP

RSTP工作选举顺序可以总结为如下:

1、选根桥RB(与STP方法类似)

2、选根端口RP(与STP方法类似)

3、选指定端口DP(与STP方法类似)

4、选备份端口BP

5、剩余的是替代端口AP

6、AP和BP进入Discarding状态

RSTP端口选举举例

假设BID SW1<SW2<SW3,除了右边3号端口所在链路cost为3,其余每条链路的cost为1,图中数字代表端口号。最下面的HUB不运行STP。

SWITCH RSTP_TOPO

可以根据上述规则,按照以下步骤分析:

1、选根桥,SW1 BID最小,成为根桥;

2、选根端口,SW2/SW3上联口到根桥SW1的cost都是1,毫无疑问是RP。SW4上联cost是3,9/10端口是2<3,又因为9号端口号小,所以9号端口是RP。这里SW4到SW3虽有两条线路,但对于STP来说中间设备是透明的(不运行STP),视作一条链路;

3、选指定端口,首先根桥1,2,3端口都是DP;然后SW2/SW3/SW4通过HUB连接,相当于在一个段中,所以45678910中只会选举一个DP,由于SW2 BID最小,所以选择PID最小的4号端口作为DP;

4、选备份端口,由于DP在SW2上,所以同一段的5、6两个端口为BP;

5、其余的端口为AP

RSTP收敛

RSTP对BPDU的处理

  • 与STP不同,任何时候RSTP每隔2s就会发送BPDU。

  • STP中,老化必须等待20s;RSTP中当一台交换机3个hellotime没收到BPDU就会老化自己的BPDU配置信息;这种老化机制可以快速检测故障。

  • STP的DP收到次级BPDU会把更优的BPDU发出去,对非指定端口不会做同样处理;RSTP中无论是否为DP,收到次级BPDU都会马上发送本地更优的BPDU给对方,或覆盖现有BPDU信息。

RSTP拓扑变更

在RSTP中,只有非边缘端口进入FWD状态时,才能导致拓扑改变。

当某台交换机检测到拓扑改变后,进行以下操作:

  • 为所有非edge DP和RP启动计时器,为2倍hellotime

  • 清空这些端口的mac地址

  • 计时器有效期内,向这些端口发送TC置位的BPDU

其它交换机收到TC置位的BPDU后,进行以下操作:

  • 清除接受TC端口以外所有端口的mac地址

  • 所有端口启动2倍hellotime计时器,并在时间内发送TC置位BPDU。

RSTP P/A协商机制

P/A,Proposal/Agreement机制用于主动协商RP、DP,P/A机制仅在p2p链路上生效。当指定端口DP处于Learning或Discarding状态时,此时需要将proposal置位。P/A协商过程:

1、SW1发送P置位的BPDU

2、阻塞所有端口(除边缘端口)

3、SW2根据自身情况,回复A置位的BPDU

4、SW1收到A置位的BPDU后,该端口立即进入FWD

RSTP收敛时间优化总结

  • 直连故障,可以用过AP/BP立即进入FWD状态

  • P/A协商,可以使RP和DP互联口立即进入FWD

  • 次优BPDU,AP收到次级BPDU会变为DP,并发送最优BPDU

  • BPDU丢包,连续丢3个BPDU,端口角色就需要切换,最长等待6s

  • 任意位置交换机可以发送TC,加快收敛

常见STP/RSTP收敛时间如下:

IEEE 收敛 CISCO 收敛
802.1D STP 30-50 PVST/PVST+ 30-50/0-30
802.1W RAPID-STP 1秒内 RAPID-PVST 1秒内

RSTP安全防护功能

BPDU GUARD

BPDU GUARD用于防止意外接受BPDU。配置BPUD防护的edge端口收到BPDU后,会将接口置于errdisable,可以手动down/up恢复或配置自动恢复。

BPDU FILTER

BPDU FILTER用于过滤BPDU。同时配置GUARD和FILTER,则先进行FILTER功能。若全局启用BPDU FILTER,则edge端口收到BPDU后会转为生成树端口;若在接口下启用BPDU FILTER,则该接口不收发BPDU。

GUARD ROOT

GUARD ROOT功能可以将端口强制设置位DP,从而防止对端交换机成为根桥。当配置GUARD ROOT的端口收到更高优先级BPDU后,该端口将被置Discarding状态4s,若不再收到跟高级BPDU则恢复为FWD状态。

GUARD LOOP

GUARD LOOP用于防止环路。某些情况,STP中discarding端口错误过渡到FWD状态会出现环路。当RP或AP长时间收不到上游设备的BPDU时,AP会进入Discarding状态并切换为DP;AP会保持在discarding状态,从而不会形成环路。

RSTP安全防护相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#BPDU GUARD
switch(config)#spanning-tree portfast edge bpdugard default
switch(config-if)#spanning-tree bpduguard enable

#BPDU FILTER
switch(config)#spanning-tree portfast edge bpdufilter default
switch(config-if)#spanning-tree bpdufilter enable

#GUARD ROOT
switch(config-if)#spanning-tree guardloop

#GUARD LOOP
switch(config)#spanning-tree loopguard default
switch(config-if)#spanning-tree guardroot

RSTP兼容性

RSTP可以兼容STP,当RSTP端口收到三次连续的STP BPDU时,将端口协议切换到STP,但同时会失去RSTP的快速收敛特性。

Rapid-PVST+

Rapid-PVST+是Cisco针对RSTP开发的快速收敛版本的PVST+。在每个VLAN中,RPVST+各项特性与RSTP基本一致。

Rapid PVST+配置

1
switch(config)#spanning-tree mode rapid-pvst 

IEEE802.1s MST

IEEE802.1s在RSTP基础上进行了改进,指定了MST,Multiple Spanning Tree多生成树协议,由于STP,RSTP在域内只有一颗树,存在次优路径和贷款浪费的问题。虽然Rapid PVST+解决了这些问题,但Rapid PVST+ 带来新的问题,就是当VLAN数量增多时,每个VLAN都要计算生成树,可能很多VLAN的拓扑可能是一致的,但还是要分开计算生成树,这对交换机造成很大负载压力。

MST的改进

IEEE802.1s MST解决这个问题,MST的主要特点是支持将VLAN分组定义到不同的多生成树实例MSTI,既满足了不同VLAN不同拓扑的问题,也能将同拓扑VLAN归为一类计算同一生成树,解决交换机负载问题。可以看作是RSTP和RPVST+折中方案。

MIST

思科也曾尝试开发类似的生成树协议,叫MIST,Multiple Instance Spanning Tree多实例生成树,由于功能基本域MST类似,为了避免小特性上的不同,思科弃用MIST,改用MST。所以现在思科的交换设备上的STP协议通常只有三种:PVST+,Rapid-PVST+,MST。分别对应IEEE802.1D STP,IEEE802.1w RSTP和IEEE802.1s MST。

MST相关概念

MST Region

MST区域是指具有相同配置一类MST,这些配置包括:

  • 区域名

  • 相同的实例与vlan映射配置

  • 相同的修订号

MSTI

MSTI,MST Instance,多生成树实例。一个MSTI可以包含多个vlan的映射。每个MSTI单独使用RSTP计算生成树互不影响。

CST

CST,Common Spanning Tree,公共生成树,是连接各MSTP区域的一颗生成树。

IST

IST,Internal Spanning Tree,内部生成树,是指各MST域内的一颗生成树(MSTI0)。

CIST

CIST,Common and Internal Spanning Tree,公共和内部生成树,是连接二层网络所有交换机的一颗总生成树。

域根

域根是指MST区域内各MSTI的根(IST根)。

总根

总根是CIST的根。

MST端口角色

MSTP保留了RSTP中的RP,DP,AP,BP,EP的概念,新增Master端口MP和域边缘端口Boundary port(BdP)。

Master端口MP

Master端口是MST域和总跟相连路径中最短路径的端口,MP是特殊的BdP

域边缘端口BdP

域边缘端口BdP是位于MST域边缘并连接其它STP域的端口

MST端口角色示意图如下:

SWITCH MST_PORT

MST端口状态

MST端口状态与RSTP完全相同,分别为Forwarding,Learning和Discarding

MST BPDU格式

相比较于RSTP,MSTP BPDU增加了version3长度和MST配置信息的一些字段,抓包如下

SWITCH MST_BPDU

其中

MST conifg name:MST区域名

MST config revision:MST修订号

CIST Internal Root Path Cost:CIST内部路径开销,从本端口到IST Master累计路径开销。

CIST BID:CIST指定交换机BID

CIST Remaining Hops:BPDU在CIST剩余跳数

MSTID x:MSTI配置信息

MST收敛

MST将二层网络划分为多个MST域,MST域间计算生成CST,域内分别计算MSTI。各交换机通过MST BPDU来生成MSTI和CIST

CIST拓扑计算

经处理BPDU消息,整个二层网络BID最小的设备成为CIST总根。每隔MST域内计算生成IST(MST0),同时MST将各MST域作为整体在MST域间计算CST。CST和IST构成CIST。

CIST总根选举

CIST根据以下原则在域根桥中选总根(越小越优):

1、域根BID

2、外部路径开销

3、内部路径开销

4、指定交换机BID

5、指定端口PID

6、接受端口PID

CIST端口角色选举(RP/DP/MP)

CIST根据以下原则选举端口角色(越小越优):

1、CIST总根BID

2、CIST到总根的外部开销

3、CIST域根BID

4、CIST到域根的内部开销

5、CIST BPDU发送端BID

6、CIST BPDU发送端PID

7、CIST BPDU接收端PID

MSTI拓扑计算

MST域内,各MSTI根据VLAN映射关系分别计算生成树,计算方法与RSTP类似。在MST域内安装MSTI转发数据,MST域间按照CST转发数据。

MST拓扑变化与快速收敛机制

MSTP拓扑变化与快速收敛机制与RSTP类似。

MST兼容性

MSTI0可与RSTP/STP兼容,不能与PVST+/RPVST+兼容,相应互联端口会置BKN*状态。

MST配置

1
2
3
4
5
6
7
8
9
10
11
#进入mst配置
swtich(config)#spanning-tree mst configuration

#配置mst区域信息,name,revision,MSTI vlan映射
swtich(config-mst)#name ccie
swtich(config-mst)#revision 100
swtich(config-mst)#instance 1 vlan 2-19
swtich(config-mst)#instance 2 vlan 20-100

#配置msti优先级
switch(config)#spanning-tree mst 1 priority 8192