STP - Spanning Tree Protocol 生成树协议 (以华为为主,Cisco 贴出部分命令)
转载: Astion 路由交换技术笔记,可在 Gitee 上找到相关笔记项目
STP
如何在保证网络冗余性的情况下,消除二层环路。
网络中部署生成树之后,交换机之间便会开始交互相关协议报文,计算得到一个无环的网络拓扑。
当网络中存在环路时,生成树会将网络中的一个或多个接口进行阻塞(block),从而打破二层环路。
当网络拓扑发生变更时,它能够及时感知,并且动态地调整被阻塞接口。
STP基本概念
桥 ID
每台运行 STP 的交换机都有一个唯一的桥 ID。
桥 ID 一共 8Byte,包含 16bit 优先级;48bit 桥 MAC 地址。
默认是32768
步长是4096
最终得桥 ID 值必须是 4096 的倍数。
修改桥优先级stp priority
根桥
STP 的一系列计算均以根桥为参考点。
当 STP 开始工作后,第一件事就是在网络中选举根桥。
在一个交换网络中,根桥只有一个。
网络中拥有最小桥 ID 的交换机称为根桥。
桥优先级最小的交换机胜出,若相等,MAC地址最小的成为根桥。
开销与根路径开销 RPC
每一个激活了 STP 的接口都维护着一个 Cost 值,接口 Cost 主要用于计算 RPC。
接口 Cost 与接口速率、工作模式有关,缺省使用 IEEE802.1t
使用stp pathcost-standard
可以修改 Cost 计算方式,不建议修改。
路径开销是一个端口变量,是 STP 用于选择链路的参考值;在一个 STP 网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口累加而成,即根路径开销 RPC
接口ID
主要用于在特定场景下选举根接口。
高 4bit 是接口优先级;
低 12bit 是接口编号。
缺省接口优先级为 128.
取值范围 0~240,步长 16
在接口视图下使用stp port priority
修改接口优先级。
基本工作原理
在交换网络中选举一个根桥 RB
对于一个交换网络而言,正常情况下只会存在一个根桥。
STP 的工作依赖该协议所使用的报文正常交互,即BPDU(网桥协议数据单元)
初始桥优先级都为 32768,因此 MAC 地址最小的为根桥,即 SW3 被选举为根桥。
根桥的地位是具有可占性的。
若在网络中新增一台交换机且桥优先级比任何交换机都低,那么它成为该交换网络中的根桥,STP 将重新收敛、计算网络拓扑,一般建议手工指定根桥。
在每个非根交换机上选举一个根接口 RP
一个交换网络中,除了根桥之外的其它交换机都是非根桥;
根接口即去往根桥路径开销最小的端口,非根桥上所有接口中收到的最优 BPDU 的接口。
在一个STP协议的设备上根端口有且只有一个,根桥上没有根端口。
在 STP 收敛完成后,根桥依然会周期性地向网络中发送 BPDU,而非根桥则会周期性地在自己的跟接口上收到 BPDU,并沿着 STP 树向下游转发。
选举指定接口 DP
STP 将在每个网段中选举一个指定接口,是该网段内所有接口到达根桥的最优接口,指定几口还负责向该网段发送 BPDU。
对于非根交换机,根接口是将自己收到的所有 BPDU 进行比较;而指定接口是用自己计算出的 BPDU 与别的设备发来的 BPDU 进行比较。
阻塞非指定端口打破二层环路
如果交换机的某个接口既不是根接口,又不是指定端口,那么该接口将被 STP 阻塞。
被阻塞的既不会接收数据也不会转发业务数据。
该接口不发送 BPDU,但会持续监听 BPDU,以便感知网络拓扑的变更情况。
STP 报文
BPDU (Brige Protocol Data Unit, 网桥协议数据单元)
STP能够正常工作的基本前提是 BPDU 的正常交互。
STP 的 BPDU 有两种类型:
- 配置 BPDU
- TCN BPDU
BPDU 直接封装在数据帧中,目的 MAC 是组播 0180-c200-0000
配置 BPDU
交换网络初始化过程中,每台交换机都从自己激活了 STP 的接口向外发送配置 BPDU。
当 STP 收敛完成后,只有根桥才会周期性地发送配置 BPDU,非根桥则会在自己的根桥上收到上游发送过来的配置BPDU,并立即触发而产生自己的配置 BPDU,然后从指定接口发送出去。
发送 BPDU 周期为 2s,系统视图使用stp timer hello
修改发送周期。
TCN BPDU
TCN BPDU 格式只有 “协议ID”、”协议版本ID” 及 “BPDU 类型”。
TCN BPDU 用于在网络拓扑发生变化时向根桥通知变化的发生。
TCN BPDU 需要从发现拓扑变更的交换机传递到根桥,交换机会从其根接口发送 TCN BPDU,一跳一跳的向上游传递直至到达根桥。
当一台交换机收到 TCN BPDU,STP 要求拓扑变更传递的过程是可靠的,当收到下游发送上来的 TCN BPDU 时,需要使用标志 TCA 为 1的配置 BPDU 回应对方,并向上游发送 TCN BPDU,直至抵达根桥。
根桥收到 TCN BPDU 后,它将通知该变化到全网,向网络泛洪标志位 TC 为 1,的配置 BPDU,网络中的交换机收到该配置 BPDU,立即将 MAC 地址表老化调整成较小的数值,使 MAC 地址表尽快刷新。
STP时间参数
- Hello Time:运行 STP 交换机发送 BPDU 的时间间隔(缺省 2s),修改该值必须在根桥上修改,非根交换机会自动对齐
- Forward Delay :运行 STP 的接口从侦听状态进入学习状态,或从学习状态进入转发状态的延迟时间,默认 15s
- MaxAge:BPDU 最大生存时间,或老化时间;若在 BPDU 到达最大生存时间之前再次受到该 BPDU,该定时器重置;若没有及时受到 BPDU 则被老化,根端口将重新选举。
BPDU 比较原则
四个关键元素:根桥 ID、RPC、网桥ID、接口ID
最优匹配原则:
- 最小根桥 ID
- 最小 RPC
- 最小网桥 ID
- 最小接口 ID
BPDU 交互与拓扑计算
初始情况下,交换网中的交换机都认为自己是根桥,在开始运行后从所有激活 STP 的接口中发送 BPDU。
由于所有交换机都认为自己是根桥,所以发送 BPDU 时根桥 ID 字段为自身网桥I D。
由于自己本身是根桥,所以 BPDU 中根路径开销为 0,即 RPC 为 0。
在交互了第一个 BPDU 之后,各桥使用接口上收到的 BPDU对比接口自身 BPDU,根据 BPDU 比较原则:
如果收到的 BPDU更优,则将该 BPDU 更新到接口下,并且不再发送 BPDU;
如果接口自身 BPDU更优,丢弃该 BPDU,仍使用自身 BPDU,并且周期性发送接口自身 BPDU。
即:通过这种方式初步选举出最小根桥 ID 的 BPDU,既为最优 BPDU。
此处桥优先级都为默认值 32768,SW3 的 MAC 地址最小,所以 SW3 当选根桥。各桥接口 BPDU 更新情况如下:
未当选为根桥的交换机为非根桥,各非根桥通过对比自身各接口收到或拥有的 BPDU,拥有最优 BPDU 的接口当选为根接口。
此处根桥 ID 为 SW3 的 BPDU 显然更优,所以非根桥以下接口为根接口, 每个非根桥有且只有一个根接口,根接口用来接收根桥发送的 BPDU。
注意:无论是初步选举根接口还是后续的根接口变更,所对比的都是桥接口处已经存在的 BPDU。
每条链路上都需要有且只有一个指定接口,用来发送根桥 BPDU。根桥所有使能 STP 的接口都发送 BPDU,即根桥所有 STP 接口都为指定接口。
在选举指定接口之前,非根桥使用根接口的最优 BPDU为其它接口计算指定端口配置消息,计算方式为:
- 在 “根桥ID” 字段中写入最优 BPDU 中的根桥 ID。
- 最优 BPDU 中的 PRC 与根接口 Cost 之和
- “网桥ID” 字段写入本设备桥 ID
- “接口ID” 为本接口 ID(即被计算的接口)
使用指定端口配置消息与该接口上的 BPDU 对比,若指定端口配置消息更优,该接口为指定接口,将指定端口配置消息更新到该接口上;若该接口上的 BPDU 更优,则阻塞该接口,BPDU 不变。
此处由于接口开销都为默认值,快速以太网百兆接口,所以 Cost 均为 200000,很显然SW1和SW2均是计算后的 BPDU 更优,所以它们的接口都为指定接口。
此时 SW1 与 SW2 的指定接口周期性的发送刚更新的最优 BPDU,很显然它们之间 SW1 的 BPDU 更优,SW2 的指定接口被更新;此时 SW2 再次触发根接口选举(因为其它接口的 BPDU 再次被更新),很显然根接口本身的 BPDU 更优,并且该接口不再发送消息,即 SW2 E0/0/1 接口被阻塞
接口状态
五种接口状态:
- 禁用(Disable):不收发 BPDU 及业务数据帧。
- 阻塞(Blocking):不收发业务数据帧,不学习 MAC 地址,只侦听 BPDU。
- 侦听(Listening):初步计算该接口为根接口或指定接口,只收发 BPDU,不收发数据帧及 MAC 地址学习。
- 学习(Learning):只侦听业务数据帧,但不转发,学习其 MAC 地址。
- 转发(Forwarding):可以正常收发业务数据帧及处理 BPDU,只有根接口或指定接口才进入此状态。
交换机接口被激活 STP 后,会从禁用状态进入阻塞状态,被选举为根接口或指定接口会进入侦听状态并且需要从侦听状态停留 15s,给予 STP 15s 收敛时间,防止出现临时环路,若该接口仍然是根接口或指定接口,进入学习状态并且停留 15s,持续侦听业务数据帧 MAC 地址,为转发状态作准备。
STP 基础配置
在该环网中部署 STP 协议。
华为 S5700 交换机默认运行 MSTP;
开启 STP;
1 | stp enable |
修改交换机 stp 工作模式 stp/rstp/mstp
1 | stp mode stp |
在实际部署中需要手工进行根桥指定,将 SW1 指定为根桥
1 | [sw1] stp root primary |
指定 SW2 为次根桥
1 | [sw2] stp root secondary |
查看 stp 状态
1 | display stp |
查看接口 stp 状态
1 | display stp brief |
RSTP
新增两个接口角色:替代接口和备份接口
引入了 P/A 机制,加快收敛
引入了边缘接口,终端设备接入无需收敛
接口角色
替代接口
可以将替代接口理解为根接口的备份,当设备的根接口发生故障,替代接口可以成为新的根接口。
执行dis stp brief
查看接口角色和接口状态,根接口故障后,最优的替代接口成为根接口。
备份接口
备份接口是一台设备上由于收到了自己所发送的 BPDU 从而被阻塞的接口。
查看其接口角色,由于 e0/0/2 口收到的 BPDU 中,接口 ID 比自身更优,该接口为备份接口,状态为丢弃状态 Discarding
接口状态
RSTP 将 STP 的状态:Disabled、Blocking、Listening 合并为丢弃状态(Discarding),Learning、Forwarding 状态不变。
丢弃状态的接口不转发业务数据,也不学习 MAC 地址。
RST BPDU
版本ID 字段值为 0x02 为RSTP
BPDU 类型 字段值为 0x02
标志 字段中除最高位 TCA 和最低位 TC 位,RSTP 还应用了其余的 6 位;
Agreement(同意)和 Proposal(提及)用于 RSTP 的 P/A 机制;
Port Role(接口角色)用于标志发送接口的接口角色:01 为根接口,10 为替代接口,11 为指定接口,00 保留。
Forwarding 和 Learning 表示 RST BPDU 的接口状态。
无论非根桥设备是否接收到根桥传来的配置 BPDU 报文,非根桥仍然按照 Hello Timer规定的时间间隔发送配置 BPDU,该行为完全由每台设备自主进行。
在RSTP中,无论接口角色如何,只要接口收到次优 BPDU,便立即发送自己的 BPDU。
边缘接口
接入 PC 或终端的接口是没有必要参与 STP 计算的,可以将其交换机接口配置为边缘接口,边缘接口缺省不参与生成树计算,当边缘接口激活之后,可以立即切换到转发状态并开始收发业务流量,不用经历转发延迟时间。
边缘接口的激活和关闭不会触发 RSTP 拓扑变更
激活边缘接口
1 | [sw3] int e0/0/3 |
如果在边缘接口上接入交换机并受到了 BPDU,该接口立即变成生成树接口。
在边缘接口变成生成树接口时,可能会引发 RSTP 重计算。
当接口激活边缘接口后,该接口仍然周期性的向接口发送 BPDU,这显然是多余的;
激活 BPDU 过滤:
1 | [E0/0/3] stp bpdu-filter enable |
激活 BPDU 过滤后,该接口不再发送 BPDU,该接口收到 BPDU 时也会将其忽略。
P/A 机制
RSTP 通过Proposal/Agreement(提议/同意)机制来保证一个指定接口 得以从丢弃状态快速进入转发状态,从而加速了生成树的收敛。
最开始两交换机交互 RST BPDU,选举出根桥为 SW1,此时 E0/0/2 成为指定端口 DP,SW2 的 E0/0/1 成为根端口;此时两个接口都处于Discarding状态。
此时根桥从指定端口发出Proposal置位的 RST BPDU,SW2 收到该 BPDU 发现 Proposal 置位,则立即启动一个同步过程Sync;
此时 Rstp 的机制是让指定端口 DP 快速的进入转发状态,从而避免标准 STP 的 Forwarding DelayTimer。
该机制为先将本地的所有非边缘接口全部阻塞,然后答复 SW1 不存在环路,可以进入 Forwarding 状态;
已经处于丢弃状态的接口缺省同步完成,已经处于转发状态的指定接口需要切换到 Discarding 状态以便完成同步,边缘接口不参与 P/A 协商;
此时 SW2 完成 Sync 过程,向上游指定接口发送Ageement置位的 RST BPDU;
SW1 收到Ageement置位的 BPDU 后立即将接口转换到Forwarding状态;
此时该指定接口至少可以与 SW2 的所有边缘接口进行通信。
此时 SW2 的指定接口 E0/0/3 还处于Discarding状态,它需要再与下游设备进行 P/A 协商即可进入Forwarding状态。
保护功能
华为交换机支持多种保护功能,这些功能提升了生成树协议的稳定性。
1.BPDU 保护
当边缘接口收到 BPDU 后,该接口立即变成普通的 rstp 接口,这个过程可能引发 rstp 重新收敛。
可以通过在交换机上激活 BPDU 保护功能,如果在边缘接口收到 BPDU 后,交换机立即将接口关闭(Error-Down)同时触发警告。
在视图视图下执行:
1 | stp bpdu-protection |
在交换机上查看 stp 接口摘要:
假设 E0/0/1 收到了 BPDU,该接口关闭,并且交换机发出警告。
要使 Error-Down 的接口恢复,可以手工将该接口重启即可恢复如:将该接口shutdown
后undo shutdown
;或者执行restart
重启接口;
自动恢复可从系统视图下执行:
1 | error-down auto-recovery cause bpdu-protection interval <interval-vlaue> #最后跟接口恢复的延迟时间,至少30s |
2.根保护
在一个交换网络中将手工选举根桥stp root primary
或者stp priority 0
这样该设备的优先级为 0,如果有第三方的交换设备接入该网络,其 stp 优先级也为 0,并且 MAC 地址比该网络根桥 MAC 地址更小,那么我们手工选举的根桥将被第三方交换设备抢占。
可以在接入第三方网络的接口上使能根保护,当根桥的指定接口收到更优的 BPDU,则会忽略这些 BPDU,并将接口切换至丢弃状态。如果该接口不再收到更优 BPDU,则一段时间后(通常为两倍的转发延迟时间)将会自动恢复到转发状态。
在根桥的接口视图下:
1 | SW2: |
开启根保护之前需要注意:根保护功能只有在指定接口上激活才会生效。即,需要在该接口接入其它交换机之前就要配置,当根桥被抢占,原指定接口就会成为根接口,配置该接口根保护将不会生效。
此时是无法与第三方交换网络进行通信的;
当移除了第三方交换机,激活了根保护的接口不再收到 BPDU,接口状态自动恢复到 Forwarding。
3.环路保护
以 SW1 为根桥的交换网络中,SW3 的 E0/0/2 接口为替代接口,SW2 不断地向 SW3 发送 BPDU;
SW2 与 SW3 之间通过双向的光纤连接,此时SW2到SW3方向的光纤故障,SW3 无法接收 BPDU;
SW3 到 SW3 方向可以正常通信,SW3 接收不到 SW2 指定接口发送 BPDU,超过 3 * HelloTimer,SW3 就认为 SW2 的上游接口故障;
此时 SW3 的替代接口将会变成指定接口并进入 Forwarding 状态,这种情况下便出现了环路。
交换机的根接口以及处于丢弃状态的替代接口都可能出现上述情况。
- 在根接口上激活环路保护功能,若该接口长时间没有收到 BPDU,该交换机将重新选举根接口,并将该接口调整为指定接口并处于 Discarding 状态。
- 在替代接口上激活了环路保护功能后,若长时间没有收到 BPDU,将该接口调整为指定接口,但将其状态保持为 Discarding 状态。
在 SW3 的根接口上使能环路保护:
1 | int e0/0/1 stp loop-protection |
在 SW 的替代接口上使能环路保护:
1 | int e0/0/2 stp loop-protection |
拓扑变更保护
一旦网络拓扑出现变更,TC 置位 BPDU 将会被泛洪全网,如果网络环境极端不稳定,导致 TC BPDU 频繁泛洪,那么交换机的性能将受到极大损耗。
交换机使能拓扑变更保护后,将在单位时间内进行一定次数的 TC BPDU 处理。
若超过所设上限,只按照规定次数进行处理,超出部分必须等待一段时间后进行处理。
系统视图下执行:
1 | stp tc-protection |
缺省单位时间为 HelloTimer
缺省次数为一次
修改缺省单位时间:
1 | stp tc-protection interval |
修改缺省处理次数:
1 | stp tc-protection threshold |
RSTP 基础配置
SW1 为主根桥,SW2 为次根桥,要求阻塞 SW4 的 E0/0/2 接口。
使所有交换机都运行 rstp
1 | stp mode rstp |
使 SW1 成为根桥
1 | stp root primary |
使 SW2 成为次根桥
1 | stp root secondary |
默认情况下阻塞 SW4 的 E0/0/1 接口,因为 E0/0/2 接口接收的 BPDU 更优,其成为根接口,E0/0/1 成为替代接口。
修改 E0/0/2 接口开销值,使其接口开销大于 e0/0/1
1 | int e0/0/2 stp cost 400000 |
此时查看 SW4 的 STP 摘要
查看其接口开销
MSTP
STP 和 RSTP 它们在部署在交换网络中时,所有的 VLAN 共用一棵生成树。这个短板使得网络中的流量无法在所有可用链路上实现负载分担,导致链路带宽利用率、设备资源利用率较低。
如果有一种基于 VLAN 的生成树协议,自然可以将生成树的可操控性发挥到极致。
但如果网络中 VLAN 的数量十分庞大,交换机不得不给每个 VLAN 都计算一棵生成树,那设备资源消耗将十分巨大,整个网络中充斥着 BPDU 报文,影响业务流量。
IEEE 发布的 801.1s 标准为上述一系列问题提供了解决方案。
MSTP(Multiple Instance Spanning Tree Protocol,多实例生成树协议)
MSTP 能够兼容 STP 及 RSTP。
MSTP 中,生成树不是基于 VLAN 运行的,而是基于 Instance 运行的,Instance 即一个或多个 VLAN 的集合。
基于 Instance 的生成树被称为 MSTI(Multiple Spanning Tree Instance,多生成树实例),MSTP 为每个 Instance 维护独立的 MSTI。
映射到同一个 Instance 的 VLAN 将共享同一棵生成树。
一个 Instance 可以包含多个 VLAN,但是一个 VLAN 只能被映射到一个 Instance。
缺省时,交换机上所有 VLAN 都映射到 Instance 0
按照一定规律将 VLAN 映射到不同的 Instance,从而通过 MSTP 实现负载分担。
MSTP 引入了域(Region)概念,一个 MST 域可包含一台或多台交换机,同属一个 MST 域交换机必须配置相同的域名(RegionName)、相同修订级别(RevisionLevel)、相同 VLAN 与 Instance 映射关系。
MSTP 单实例
三台交换机构成三角形二层环路,通过部署 MSTP 使网络无环化,部署单个 MST 域,所有 VLAN 均保持在缺省的 Instance 0 中。
分别规划 SW1 为主根桥,SW2 为次根桥。
每个 MST 域内都存在一棵 IST( Internal Spanning Tree),交换机上的所有 vlan 都属于 Instance 0,而 IST 则是 MST 域内的交换机针对 Instance0,计算出的一棵生成树。
SW1 关键配置:
1 | #进入MST域视图 |
SW2 MST域配置与SW1相同
1 | [sw2] stp root secondary |
SW3 配置 MST 即可;
查看 SW3 接口状态:
查看当前生效的 MST 域配置信息
1 | dis stp region-configuration |
MSTP 多实例
要求 vlan2 到 vlan10 的流量在 sw3-sw1 之间传输,vlan11 到 vlan20 的流量在 sw3-sw2 之间传输。
通用 MSTP 配置
1 | stp region-configuration |
SW1 配置:
1 | stp root instance 1 primary |
SW2 配置:
1 | stp root instance 1 secondary |
查看 SW3 的接口状态:
PVST (Cisco 私有的 STP 协议)操作
PVST 是基于 VLAN 的生成树协议,是 Cisco 对 802.1D STP 协议进行扩展提出的,每个VLAN都会拥有一个生成树实例。
PVST 的优点
- 当一条链路不可用时,不需要完全阻塞整个链路而构成生成树,提高了链路的利用效率
PVST 的缺点有:
- (1) 由于 PVST 是 Cisco 私有协议而且只支持 Cisco 专有的 ISL 中继协议,不支持 802.1q 中继协议
- (2) PVST 无法兼容于其他厂商的设备
- (3) 由于每个 VLAN 都需要生成一棵树,PVST BPDU 的通信量将成倍增加,与 VLAN 数目成正比
- (4) 在 VLAN 个数比较多的时候,交换机需要维护更多的生成树的实例,而计算量和资源占用量将急剧增长
环境
基本命令
查看所有 VLAN 的生成树
1 | # show spanning-tree |
指定 VLAN 根桥或者次根桥
1 | // 根桥 |
当配置了主根后,其优先级的值缩小了
指定交换机 对应 VLAN 的优先级的值(也可以使对应的交换机为根桥)
1 | (config)#spanning-tree vlan 1 priority 0 |
0 4096 8192 12288 16384 20480 24576 28672
32768 36864 40960 45056 49152 53248 57344 61440
启用 Cisco 的生成树
1 | (config)# spanning-tree mode pvst |