STP
STP (Spanning Tree Protocol、生成树协议) 是一个作用在 OSI 网络模型中第二层的通信协议。基本应用是防止交换机冗余链路产生的环路,用于确保以太网中无环路的逻辑拓扑结构,从而避免广播风暴大量占用交换机的资源
其工作原理是当任意一交换机中如果到达根网桥有两条或者两条以上的链路,生成树协议都根据算法把其中一条阻塞,仅保留一条,从而保证任意两个交换机之间只有一条单一的活动链路
相关概念
- Root Bridge : 根桥,在 STP/RSTP 网络中,网桥只能存在一个。它是整个网络的逻辑中心,但不一定是物理中心。若网络拓扑发送改变,根桥设备可能会发生改变
- Bridge Priority : 桥优先级,以 4096 为倍数,取值范围是 0 ~ 65535,默认值为 32768
- Bridge ID : 网桥 ID,IEEE 802.3d 标准中规定 BID 由 桥优先级 与 MAC 地址组成
- Port ID : 端口 ID,端口优先级 + 端口号组成。PID 只在两个端口的根路径开销和发送交换设备 BID 都相同的情况下,起到选举指定端口的作用。比较端口的 PID,小者为指定端口
- RPC : 路径开销,STP/RSTP 协议用于选择链路的参考值。STP/RSTP 保留开销最小的路径,阻塞多余的链路。根桥的端口 RPC 都为 0
根桥选举规则
- 比较桥优先级,数值越小越优先
- 若优先级相等,选 MAC 地址较小的交换机
- 根桥与备根桥 (secondary) 都只能存在一个
BPDU
BPDU (Bridge Protocol Data Unit、桥协议数据单元)。STP 角色选举时用配置 BPDU,当拓扑发生变化时通过 TCN BPDU 来改变端口状态。BPDU 报文被封装在以太网数据帧中,目的 MAC 是组播 MAC : 01-80-C2-00-00-00
配置 BPDU (Configuration BPDU) : 用来进行生成树计算和维护生成树拓扑的报文
TCN BPDU (Topology Change Notification BPDU) : 当网络拓扑发生变化时,用来通知相关设备的报文
- Protocol ID : 协议号,0x0000, IEEE 802.1D
- Version ID : 版本号
- 0x00 STP
- 0x02 RST
- 0x03 MST
- Type : 类型
- 0x00 STP Config BPDU
- 0x80 TCN BPDU
- 0x02 RST/MST Config BPDU
- Flags : 标志
- 最低位 TC (Topology Change,拓扑变化) 标志
- 最高位 TCA (Topology Change Acknowledgment,拓扑变化确认) 标志
- Root ID : 根桥 ID
- Root Path Cost : 根路径开销
- Bridge ID : 桥 ID
- Port ID : 端口 ID
- Message Age : BPDU 生存时间
- Max Age : BPDU 老化时间 (默认 20s)
- Hello Time : BPDU 发送周期 (默认 2s)
- Forward Delay : 转发延迟 (默认 15s)
STP 端口角色
Root Port (根端口)
非根桥交换机去往根桥交换机路径开销最小的端口,负责向根桥方向转发数据,同时还负责接收上游设备的 BPDU 报文和用户流量转发。每台运行 STP 协议的非根桥交换机只能存在一个根端口,根桥交换机没有根端口
Design Port (指定端口)
交换机向所连网段转发配置 BPDU 的端口,每个网段只能存在一个指定端口。根桥交换机上的端口都为指定端口
Alternate Port (预留端口)
交换机上除根端口和指定端口以外的端口为预留端口,通常预留端口会被禁用。当拓扑发生变化时会重新参与端口选举
端口选举规则
- 比较根桥 ID (RID),越小越优先
- 比较根路径开销 (RPC),越小越优先
- 比较发送方网桥 ID (BID),越小越优先
- 比较发送方接口 ID (PID),越小越优先
- 比较接收方接口 ID (PID),越小越优先
STP 端口状态
状态 | 是否收发数据 | 是否收发 BPDU | 是否学习地址 | 说明 |
---|---|---|---|---|
Disabled 禁用 | × | × | × | 端口状态为 Down |
Blocking 阻塞 | × | 仅接收 | × | 阻塞端口的最终状态 |
Listening 监听 | × | √ | × | 过度状态 (15s) |
Learning 学习 | × | √ | √ | 过度状态 (15s),防止临时环路 |
Forwarding 转发 | √ | √ | √ | 只有根端口和指定端口才能进入转发状态 |
定时器
Hello Time
指定 BPDU 发送周期
Forward Delay
用于控制端口在 Listening 和 Leaning 状态的持续时间
Max Age
控制存储配置 BPDU 的超时时间,超时代表根桥连接失败
拓扑改变机制
- 当网络拓扑发生变化时,非根桥向根桥发送 TCN BPDU 报文
- 上游交换机回复 TCA 确认接收并向根桥发送 TCN BPDU 报文
当根桥收到 TCN BPDU 后,向下游所有交换机发送 TC BPUD 报文,持续发送 35s (Max Age + Forward Delay)
- 收到 TC BPDU 的交换机会将 MAC 地址表老化时间设置为 15s 加速老化
故障类型
- 根桥故障
当非根桥的 Max Age 超时后,重新开始根桥选举
- 直连链路故障
当交换机检测到直连链路故障后,预留端口经过 30s (Listening、Learning) 进入 Forwarding 状态
- 非直连链路故障
当 A 交换机的链路故障时,A 交换机开始进行根桥选举并向其他交换机发送配置 BPDU,而 B 交换机正常接收到根桥的配置 BPDU 则不会处理 A 交换机的 BPDU。当 B 交换机的预留端口经过 20s (Max Age,默认 20s) 未收到根桥的配置 BPDU 时,便从阻塞状态改为转发状态 (所需经过 Listening、Learning,默认 15s × 2),发送配置 BPDU 与 A 交换机进行端口选举。整个过程所需 (Max Age + Forward Delay × 2) 秒
-
拓扑改变导致 MAC 地址表错误
MAC 地址表默认老化时间为 300s ,期间无法正常转发数据
RSTP
RSTP (Rapid Spanning Tree Protoco、快速生成树协议) 与生成树协议相比,这种协议在网络结构发生变化时,能更快的收敛网络。并增加了边缘端口的概念及保护功能
RST BPDU
与 STP 的配置 BPDU 仅有两处不同,但是当运行 STP 协议的交换接收到 RST BPDU 则会丢弃
- Version 和 Type 值为 2
- 将 Flag 字段中间保留的 6 bit 使用
Flags 标志 (1 Byte)
- TCA : 拓扑变化确认
- 0 : No
- 1 : Yes
- Agreement : 协商
- 0 : No
- 1 : Yes
- Forwarding : 转发状态
- 0 : No
- 1 : Yes
- Learning : 学习状态
- 0 : No
- 1 : Yes
- Port Role : 端口角色
- 00 : Unkown (未知)
- 01 : Alternate / Back up (替代端口/备份端口)
- 10 : Root (根端口)
- 11 : Desginated (指定端口)
- Proposal : 提议
- 0 : No
- 1 : Yes
- TC : 拓扑变化
- 0 : No
- 1 : Yes
非根桥交换机无论是否接收到根桥发送的 RST BPDU,都会按照 Hello Time 周期发送 RST BPDU
RSTP 端口角色
Root Port (根端口)
非根交换机连接根桥交换机路径开销最小的端口,每台运行 RSTP 协议的非根桥交换机只能存在一个根端口
Design Port (指定端口)
交换机向所连网段转发配置 BPDU 的端口,每个网段只能存在一个指定端口。根桥交换机上的端口都为指定端口
Alternate Port (替代端口)
为根端口做备份,通常为 Discarding 状态
Backup Port (备份端口)
为指定端口做备份,通常为 Discarding 状态。当交换机接收到自身的 BPDU 时,就会产生 BP
Edge Port (边缘端口)
一端连接终端设备,不接收配置 BPDU,不参与 RSTP 运算,接入设备时直接进入 Forwarding 状态
RSTP 端口状态
状态 | 是否收发数据 | 是否收发 BPDU | 是否学习地址 | 说明 |
---|---|---|---|---|
Discarding 丢弃 | × | 仅接收 | × | 只接收BPDU报文 |
Learning 学习 | 仅接收 | 仅接收 | √ | 过渡状态 |
Forwarding 转发 | √ | √ | √ | 端口既转发用户流量又处理BPDU报文 |
P/A 协商机制
对于运行 STP 设备从初始化到完全收敛至少需要 30s 的问题,RSTP 采用 Proposal / Agreement (P/A 协商) 机制让交换机的根端口和指定的互联接口快速进入转发状态
- 各交换机广播发送 P 置位 的 RST BPDU ,并与接收到的 RST BPDU 进行比较
- 若接收到的 RST BPDU 落后于自身,则不进行处理,继续向外发送 RST BPDU ;若接收到的 RST BPDU 优先于自身,则将接收最优 RST BPDU 的端口保留, 阻塞其余全部端口, 停止 RST BPDU 发送
- 当其余端口全部阻塞完成后, 将接收最优 RST BPDU 的端口设定为 根端口,并回复 A 置位 的 RST BPDU 确认同步完成
- 当端口接收到 A 置位 的 RST BPDU 报文时, 将其端口设定为 指定端口。解除其余端口的阻塞,继续发送 RST BPDU
- 当对方的 RST BPDU 优于自身并且已经存在根端口时,则停止向对方发送 RST BPDU 并等待 30s (Forward Delay × 2)
- 最后将非根非指定的端口设定为 替代端口/备份端口
当指定端口进入 Discarding 或 Learning 状态时,RST BPDU P 置位
当指定端口进入 Forwarding 状态时,会发送 TC BPDU
- TC 发送者会清除边缘端口以外的其他端口的 MAC 绑定条目
- TC 接收者会清除接收 TC 报文的端口和边缘端口以外的其他端口的 MAC 绑定条目
收敛优化
- 直连链路故障 : 当 RP 失效时,AP 转为新 RP 并从 Discarding 快速进入 Forwarding 状态
- 非直连链路故障 : 当连续丢失 3 个 RST BPDU 时,将自己作为根桥,开始向其他交换机发送根桥 ID 为自身的 RST BPDU
- 次优场景 : 当 AP 接收到次优的 RST BPDU 时,向对方发送最优 BPDU 并转为 DP 。对方 DP 收到最优 BPDU 后,接收端口转为 RP 并回复 A 置位 RST BPDU。DP 接收到 A 置位的 RST BPDU 进入 Forwarding 状态
保护功能
BPDU 保护
边缘端口是 RSTP 中收敛最快的端口,边缘端口不参与 RSTP 运算,可以直接从 Discarding 转为 Forwarding 状态,所以通常会把连接终端设备的端口配置为边缘端口。但当边缘端口接收到 RST BPDU 报文时,就会端口角色选举而丧失边缘端口特性
当边缘端口配置了 BPDU 保护,并且接收到 BPDU 时,边缘端口将被 RSTP 立即关闭 (error-down),边缘端口角色不会发生改变也不会转发数据,同时通知网关系统。被 error-down 的端口只能由网络管理员手动恢复,自动恢复需要配置额外的延迟时间
Root 保护
当生成树收敛完成后,如果收到更优先的 BPDU 时将会重新进行根桥选举,可能造成链路拥塞,将流量迁移到低速链路上
根保护需要在所有指定端口内进行配置,当开启根保护的指定端口接收到优先级更高的 BPDU 时,端口状态将变更为 Discarding ,持续 30s (Forward Delay × 2) 内没有再接收到优先级更高的 BPDU 则恢复到 Forwarding 状态
TC-BPDU 保护
当交换机接收到 TC BPDU 报文时会清除接收 TC BPDU 报文和边缘端口以外的 MAC 地址表项,若频繁接收 TC BPDU 报文会导致 CPU 占用率过高直到设备瘫痪
启用 TC-BPDU 保护的交换机可以通过配置决定在单位时间内处理 TC BPDU 报文次数,如果交换机在单位时间内接收的 TC BPDU 报文数量大于设定的阈值,则只会处理阈值指定的次数。对于超出阈值的报文,定时器到期后只对其统一处理一次,从而避免频繁删除 MAC 地址表项和 ARP 表项,保证系统资源不会被滥用
环路保护
当出现链路拥塞或光纤链路单向故障时,非根交换机的根端口或替代端口连续 3 个 Hello Time 未接收 BPDU ,根端口老化重新开始根端口选举,而替代端口则会转为根端口进入 Forwarding 状态引起环路
环路保护功能配置在根端口和替代端口上,当根端口或替代端口连续 3 个 Hello Time 没有接收到 BPDU 时,会变为指定端口并进入 Discarding 状态,直到再次接收到 BPDU 进行协商才恢复成之前的角色和状态