Spanning Tree Protoco (STP、生成树协议)

生成树协议是一个作用在 OSI 网络模型中第二层的通信协议。基本应用是防止交换机冗余链路产生的环路,用于确保以太网中无环路的逻辑拓扑结构,从而避免广播风暴大量占用交换机的资源

STP

其工作原理是当任意一交换机中如果到达根网桥有两条或者两条以上的链路,生成树协议都根据算法把其中一条阻塞,仅保留一条,从而保证任意两个交换机之间只有一条单一的活动链路

根桥选举
STP 中依据交换机的桥 ID (Bridge ID) 决定根桥,BID 由桥优先级 (Bridge Priority) 与 MAC 地址组成。桥优先级以 4096 为倍数,取值范围是 0 ~ 65535,默认值为 32768

  1. 比较桥优先级,数值越小越优先
  2. 若优先级相等,选 MAC 地址较小的交换机

根桥与备根桥都只能存在一个

Bridge Protocol Data Unit (BPDU、桥协议数据单元)

STP 选举时用配置 BPDU,当拓扑发生变化时通过 TCN BPDU 来改变端口状态
Configuration BPDU (配置 BPDU)
Topology Change Notification BPDU (TCN BPDU)

STP_w
BPDU

  • Protocol ID 协议号(2 bytes): 0x0000 IEEE 802.1D

  • Version ID 版本号(1 byte): 0x00 Config & TCN / 0x02 RST / 0x03 MST / 0x04 SPT BPDU

  • Type 类型(1 byte): 0x00 STP Config BPDU, 0x80 TCN BPDU, 0x02 RST/MST Config BPDU

  • Flags 标志(1 byte):

  • Root ID (8 bytes):根桥 ID

  • Root Path Cost(4 bytes):根路径开销

  • Bridge ID(8 bytes):桥 ID

  • Port ID(2 bytes):端口 ID

  • Message Age(2 bytes):BPDU 生存时间

  • Max Age(2 bytes):BPDU 老化时间,缺省为 20

  • Hello Time(2 bytes):BPDU 发送周期,缺省为 2 秒

  • Forward Delay(2 bytes):转发延迟,默认 15 秒

  • Version 1(1 byte): 仅用于 RST、MST、SPT

  • Version 3(2 bytes): 仅用于 MST、SPT

端口角色

Root Port (根端口)
非根交换机去往根桥交换机路径开销最小的端口,负责向根桥方向转发数据,同时还负责接收上游设备的 BPDU 报文和用户流量转发。每台运行 STP 协议的非根桥交换机只能存在一个根端口,根桥交换机没有根端口

Design Port (指定端口)
交换机向所连网段转发配置 BPDU 的端口,每个网段只能存在一个指定端口。根桥交换机上的端口都为指定端口

Alternate Port (预留端口)
交换机上除根端口和指定端口以外的端口为预留端口,通常预留端口会被禁用。当拓扑发生变化时会重新参与端口选举

端口角色选举

  1. 比较根桥 ID (RID),越小越优先
  2. 比较根路径开销 (RPC),越小越优先
  3. 比较网桥 ID (BID),越小越优先
  4. 比较接口 ID (PID),越小越优先

端口状态

状态 是否收发数据 是否收发 BPDU 是否学习地址 说明
Disabled 禁用 × × × 端口状态为 Down
Blocking 阻塞 × 仅接收 × 阻塞端口的最终状态
Listening 监听 × × 过度状态(15s)
Learning 学习 × 过度状态(15s),防止临时环路
Forwarding 转发 只有根端口和指定端口才能进入转发状态

定时器

Hello Time
指定 BPDU 发送周期

Forward Delay
用于控制端口在 Listening 和 Leaning 状态的持续时间

Max Age
控制存储配置 BPDU 的超时时间,超时代表根桥连接失败

拓扑改变

  1. 当网络拓扑发生变化时,非根桥向根桥发送 TCN BPDU 报文
    TCN_w

  2. 上游交换机回复 TCA 确认接收并向根桥发送 TCN BPDU 报文
    TCA_w

  3. 当根桥收到 TCN BPDU 后,向下游所有交换机发送 TC BPUD 报文,持续发送35s(Max Age + Forward Delay )
    TC_w

  4. 收到 TC BPDU 的交换机会将 MAC 地址表老化时间设置为 15s 加速老化

故障类型

  • 根桥故障
    当非根桥的 Max Age 超时后,重新开始根桥选举
    根桥故障

  • 直连链路故障
    当交换机检测到直连链路故障后,预留端口经过 30s(Listening、Learning)进入 Forwarding 状态
    直连链路故障

  • 非直连链路故障
    当 A 交换机的链路故障时,A 交换机开始进行根桥选举并向其他交换机发送配置 BPDU,而 B 交换机正常接收到根桥的配置 BPDU 则不会处理 A 交换机的 BPDU。当 B 交换机的预留端口经过 20s(Max Age) 未收到根桥的配置 BPDU 时,便从阻塞状态改为转发状态(所需经过Listening、Learning,默认15s × 2),发送配置 BPDU 与 A 交换机进行端口选举。整个过程所需 (Max Age + Forward Delay × 2) 秒
    非直链路故障

  • 拓扑改变导致 MAC 地址表错误
    MAC 地址表默认老化时间为 300s ,期间无法正常转发数据

Rapid Spanning Tree Protoco (RSTP、快速生成树协议)

与生成树协议相比,这种协议在网络结构发生变化时,能更快的收敛网络。并增加了边缘端口的概念及保护功能

RST BPDU

与 STP 的配置 BPDU 仅有两处不同,但是当运行 STP 协议的交换接收到 RST BPDU 则会丢弃

  1. Version 和 Type 值为 2
  2. 将 Flag 字段中间保留的 6 bit 使用

RSTP_w

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

端口角色

Root Port (根端口)
非根交换机连接根桥交换机路径开销最小的端口,每台运行 RSTP 协议的非根桥交换机只能存在一个根端口

Design Port (指定端口)
交换机向所连网段转发配置 BPDU 的端口,每个网段只能存在一个指定端口。根桥交换机上的端口都为指定端口

Alternate Port (替代端口)
根端口做备份,通常为 Discarding 状态

Backup Port (备份端口)
指定端口做备份,通常为 Discarding 状态。当交换机接收到自身的 BPDU 时,就会产生 BP

Edge Port (边缘端口)
一端连接终端设备,不接收配置 BPDU,不参与 RSTP 运算,接入设备时直接进入 Forwarding 状态

端口状态

状态 是否收发数据 是否收发 BPDU 是否学习地址 说明
Discarding 丢弃 × 仅接收 × 只接收BPDU报文
Learning 学习 仅接收 仅接收 过渡状态
Forwarding 转发 端口既转发用户流量又处理BPDU报文

P/A 协商机制

对于运行 STP 设备从初始化到完全收敛至少需要 30s 的问题,RSTP 采用 Proposal / Agreement (P/A 协商)机制让交换机的根端口和指定的互联接口快速进入转发状态

PA

  1. 各交换机广播发送 P 置位 的 RST BPDU ,并与接收到的 RST BPDU 进行比较
  2. 若接收到的 RST BPDU 落后于自身,则不进行处理,继续向外发送 RST BPDU ;若接收到的 RST BPDU 优先于自身,则将接收最优 RST BPDU 的端口保留, 阻塞其余全部端口, 停止 RST BPDU 发送
  3. 当其余端口全部阻塞完成后, 将接收最优 RST BPDU 的端口设定为 根端口,并回复 A 置位 的 RST BPDU 确认同步完成
  4. 当端口接收到 A 置位 的 RST BPDU 报文时, 将其端口设定为 指定端口。解除其余端口的阻塞,继续发送 RST BPDU
  5. 当对方的 RST BPDU 优于自身并且已经存在根端口时,则停止向对方发送 RST BPDU 并等待 30s (Forward Delay × 2)
  6. 最后将非根非指定的端口设定为 替代端口/备份端口

当指定端口进入 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 进行协商才恢复成之前的角色和状态

相关指令

系统视图

开启 stp 协议

stp enable

查看 stp 状态

display stp [brief]

设置 stp/rstp 协议

# stp mode {stp/rstp/mstp}
stp mode stp

修改交换机优先级

# stp priority <0-61440>
stp priority 4096

配置路径开销

# [interface]stp cost <1-200000000>
stp cost 2000

BPDU 保护

stp bpdu-protection

TC BPDU 保护

# stp tc-protection [threshold] 阈值
stp tc-protection 

指定当前路由器为主根桥/备根桥

stp root {primary/secondary}

端口视图

指定当前端口为边缘端口

stp edged-port enable

Root 保护

stp root-protection

环路保护

stp loop-protection