10.BPDU 解码:透视 STP 生成树的底层协议逻辑
一、BPDU是什么前面我们已经从拓扑和角色的角度讲了 STP 的基本概念根桥、根端口、指定端口、阻塞端口以及它们的选举规则。但 STP 并不是 “凭空” 选举的所有决策都来自一种关键协议报文 ——BPDU。BPDUBridge Protocol Data Unit桥协议数据单元是STP生成树协议用于在交换机之间交换拓扑信息、完成选举并防止二层环路的核心控制报文。它是交换机之间 “沟通拓扑、协商角色” 的唯一语言所有 STP 决策根桥、端口角色选举都基于对 BPDU 的接收、处理和比较。BPDU报文格式Protocol Identifier协议 ID固定为0标识通用网桥协议。Protocol Version Identifier协议版本标识符STP 为0RSTP 为2MSTP 为3。BPDU TypeBPDU 类型STP 配置 BPDU 为0x00STP TCN BPDU 为0x80RSTBPDU/MST BPDU 为0x02。Flags标记域只有两位有效第 1bit高位为 TCA拓扑改变确认最后 1bit低位为 TC拓扑改变。0x00二进制0000 0000拓扑无变化根桥周期性发出配置BPDU0x01二进制0000 0001TC 1根桥发送拓扑变化BPDU0x80二进制1000 0000TCA 1拓扑变化确认下游设备收到 TCN/TC 后主动向上游发送的确认报文。注意非根桥的拓扑变化是通过BPDU 类型STP TCN BPDU 为0x80向上游通知的。Root Identifier根桥 ID8 字节前 2 字节为优先级后 6 字节为 MAC 地址。Root Path Cost根路径开销本端口累计到根桥的开销。Bridge Identifier发送者网桥 ID同根桥 ID 格式。Port Identifier发送端口 ID端口优先级 端口号。Message Age消息年龄BPDU 传播过程中累计的时间实际是自根桥发出后经过的转发跳数每经一台设备递增 1.Max Age最大老化时间BPDU 过期时间。Hello Time发送 BPDU 的间隔时间。Forward Delay端口状态迁移延迟 Listening/Learning 状态时长。因为 BPDU 是上游交换机发过来的所以在当前交换机的 BPDU 报文中Bridge Identifier (BID)是上游交换机的网桥 ID发送该 BPDU 的交换机 IDPort Identifier (PID)是上游交换机发送该 BPDU 的端口 ID.也就是说BPDU 里的BID、PID 都是 “上游设备” 的信息不是本机的这里也解释了STP 第二步选举根端口为什么比较的是上游的桥 IDBID和端口IDBID。二、配置BPDU与STP选举在 BPDU 报文中BPDU TypeBPDU 类型是用于区分 BPDU 用途的核心字段其中0x00 代表配置 BPDUConfiguration BPDU。配置 BPDU是 STP 协议中最核心的控制报文所有 STP 选举逻辑都基于配置 BPDUType0x00的字段交互与对比实现。只要交换机启用 STP 协议其所有开启 STP 功能的端口都会周期性发送配置 BPDU—— 这类报文的BPDU Type 字段固定为 0x00是 STP 选举与拓扑维护的核心载体。配置 BPDU 的周期性发送间隔就是 BPDU 报文格式中定义的Hello Time默认 2 秒确保全网交换机能够实时同步拓扑信息。STP BPDU是一种二层报文目的MAC是多播地址01-80-C2-00-00-00所有支持STP的网桥都会接收并处理收到的BPDU报文。该报文的数据区里携带了用于生成树计算的所有有用信息。重点只有根桥设备才会向外发送配置BPDU当然在网络初始化时所有设备都视自己为根桥也会生成各自的配置BPDU并周期性地向外发送。1.配置BPDU与根桥选举T0 时刻初始状态网络启动SW A/B/ C/D 均认为自己是根桥发送 BPDU。SW A发送 BPDU宣称自己为根桥根桥ID 发送者桥ID 32768001122334455根路径开销 0 端口 ID 8001G口另一个方向的包端口 ID 8101E口SW B同理根桥ID 发送者桥ID 2768001122334466 根路径开销 0 端口 ID 8001G0/1另一个方向的包端口 ID 802G0/2SW C同理根桥ID 发送者桥ID 20000001122334477 根路径开销 0 端口 ID 8001G口另一个方向的包端口 ID 8101E口SW D同理根桥ID 发送者桥ID 20000001122334488 根路径开销 0 端口 ID 8001G0/1另一个方向的包端口 ID 802G0/2T1 时刻接收相邻交换机BPDU并对比结论SW C 为根桥更新本地根桥信息。T2 时刻接收不相邻交换机 BPDU并对比更新根桥认知。SW B 对比新增收到 SW C 的 BPDU 推翻之前的 SW D更新本地根桥为 SW C其余保持不变。以SW B 收到SW C 的BPDU为例什么变了SW B G0/2 方向收到 SW D 转发的 SW C 始发的 BPDU根桥ID 20000001122334477SWC发送者桥ID 20000001122334488SWD端口ID 802SW D G0/2根路径开销 2 SW D 到 CSW B计算去往SW C的路径开销时再加上自身去往 SW D的即可 2 2 4选举稳定全网统一根桥。全网确认 SW C 为根桥SW A、SW B、SW D 停止宣称自己为根桥仅转发 SW C 的 BPDU网络拓扑稳定不再重选根桥。2.配置BPDU与根端口选举在确认SW C 为根桥后其他交换机为非根交换机仅接收与转发配置BPDU不主动发送配置BPDU最终根端口选举状态如上图具体参考之前的步骤以 SW B 收到 SW D、SW A 转发的根桥SWC 的 BPDU 为例。根桥SW C发送配置BPDU字段为根桥 ID20000001122334477SW C发送者桥 ID20000001122334477SWC 自身根路径开销0端口 IDE0/1 对应 8101、G0/1 对应 8001SWA 转发BPDU到 SWB。SWA 从 E0/1 接口收到 BPDU 后通过 G0/1 接口转发给 SWB修改字段根桥 ID不变仍为 SW C 的桥 ID发送者桥 ID更新 32768001122334455SW A根路径开销更新报文中的根路径开销 SW A 到 SW C 的开销200SW A的E0/1出接口开销→ 0200200端口 ID更新SW A 转发接口 G0/1 的 ID8001SW D 转发 BPDU 到 SW B。SWD 从 G0/1 接口收到 BPDU 后通过 G0/2 接口转发给 SWB修改字段根桥 ID不变仍为 SW C 的桥 ID发送者桥 ID更新20000001122334488SW D根路径开销更新报文中的根路径开销 SWD 到 SWC 的开销2SW C的G0/1出接口开销→ 022端口 ID更新SW D 转发接口 G0/2 的 ID8002SWB 计算到根桥的开销。经 SW A 路径SWB 到 SWA 的开销2 SW A 转发的根路径开销200→ 2002202经 SW D 路径SWB 到 SWD 的开销2 SW D 转发的根路径开销2→ 224根端口选举。对比两条路径的开销4202因此 SWB 选择G0/2 接口为根端口。3.配置BPDU与指定端口选举同理最终指定端口选举状态如上图具体参考之前的步骤以 SW B 收到 SW D、SW A 转发的根桥SWC 的 BPDU 为例。这里普及下指定桥Designated BridgeDB和指定端口Designated Port, DP。对于一台设备而言指定桥是通往根桥的 “下一跳” 设备负责向本设备转发配置BPDU的设备指定端口就是指定桥向本机转发配置BPDU的那端口。例SW B 的指定桥是 SW D指定端口是 SW D 的 G0/2。对于一个网段链路而言指定桥是负责向该链路转发 BPDU 的设备指定端口是指定桥向该链路转发 BPDU 的端口。例链路④的指定桥是 SW D指定端口是 SWD 的 G0/2。链路④指定端口选举BPDU 角度指定端口选举是在链路两端的端口之间比较 BPDU。SWD 与 SWB 在链路④上互相发送 配置BPDU。SW D 发给 SW B 的 BPDU根桥 SW C开销 2发送桥 SW DSW B 发给 SW D 的 BPDU根桥 SW C开销 202发送者 SW B比较 BPDU根桥相同比较到根桥的开销SW D 开销更小因此SWD 的 G0/2 被选为链路④的指定端口DP。对 SWB 而言从 SW D 过来的路径开销最优所以SW B 将对应端口选为自己的根端口。三、STP的端口状态与转换STP 通过端口状态的变化将物理环路组织成一棵无环的逻辑树。端口状态共分为五种每种状态对应不同的转发能力和 BPDU 处理行为。1. 端口的五种状态Disabled未启用。此状态下端口不转发数据帧不学习MAC地址表不参与生成树计算。Blocking阻塞。仅接收处理 BPDU但不发送不学习 MAC 地址不转发数据。Listening监听。接收并发送 BPDU不学习 MAC 地址不转发数据。Learning学习。接收并发送 BPDU学习 MAC 地址不转发数据。Forwarding转发。接收并发送 BPDU学习 MAC 地址转发数据。2.STP初始化选举与端口状态机 t0 时刻初始化所有端口立即进入Blocking。交换机启动未收到任何 BPDU默认自己是根桥所有端口角色被暂定为指定端口立即发送一次配置 BPDU宣告自身为根桥。 t1 时刻接收邻居BPDU完成本地选举。所有端口依然保持 Blocking以 B 为例G0/1 收到 SW A 的 BPDU根桥 AG0/2 收到 SW D 的 BPDU根桥 D。SW B 内部比较后判断根桥为 SW A根端口 G0/1指定端口 G0/2。 t2 时刻本机选举完成指定端口和根端口进入Listening。本地选举完成后当端口被选为指定端口或根端口且无旧 BPDU时立即从 Blocking 进入 Listening无需等待定时器SW D 收到 SW A 和 B 的 BPDU判定根桥为SW C根端口G0/1指定端口G0/2同理进入Listening其他交换机同理会进行本地选举和进入Listening进入Listening的指定端口开始周期性发送自认为最优的配置 BPDU。 t3 时刻全网BPDU交互保持Listening。Listening 状态下指定端口正常发送 BPDU逐跳刷新全网拓扑信息SW D 从指定端口G0/2 发送 SW C为根的BPDUSW B更新根桥为 SW C 根端口G0/2指定端口G0/1全网在n 个 Hello Time内完成最终收敛角色确定。 t4 时刻Forward Delay到期进入Learning。指定端口和根端口在 Listening 状态停留满Forward Delay后进入Learning学习MAC但不转发用户数据阻塞端口保持Blocking。 t5 时刻又一个 Forward Delay 后进入Forwarding。根端口和指定端口完成 Learning 状态过渡正式进入 Forwarding 状态开始转发数据阻塞端口仍维持 Blocking 状态网络拓扑收敛完成。四、STP的时间约束与网络大小1. STP的时间参数Hello Time根桥发送配置 BPDU 的时间周期默认 2 秒控制 BPDU 发送频率确保网络拓扑信息同步。非根桥接收BPDU根端口和指定端口转发/生成 BPDU 时仅将 Root Path Cost 累加、自身 BID 和 PID 更新、Message Age 加 1其余参数保持不变。Forward Delay端口状态迁移的延迟时间默认 15 秒让交换机有足够时间处理 BPDU 完成拓扑计算。非根桥接收 BPDU 后根据计算结果更新端口状态阻塞 / 监听 / 学习 / 转发Max AgeBPDU 的最大存活时间默认 20 秒防止 BPDU 在网络中无限循环避免过时拓扑信息干扰。非根桥接收 BPDU 后若存活时间超过 Max Age 则直接丢弃。Message AgeBPDU 消息年龄代表已经 “活” 了多久IEEE 802.1D 标准规定每经过一跳Message Age 通常增加1 秒或者加上该端口的路径开销对应的时间但在标准直径计算中通常简化为 1s.2.STP收敛时间30 秒所有交换机同时初始化上电端口一开始都在 Blocking大家一启动都会发送 BPDU直连邻居立刻收到、立刻完成本地选举无旧 BPDU 时选举完成后端口立即进入 Listening这个切换时间忽略不计全网所有选举、根桥确定、角色最终确认全部在第一个 Forward Delay15s内完成Listening、Learning 两个状态是必须等待的环路防护延时选举本身不占用额外时间。最终收敛时间冷启动、无旧 BPDU收敛时间 2 × Forward Delay 2 * 15 30 s50 秒如果某台设备并非初始启动或端口内存中存储有上一轮稳定拓扑的旧有效 BPDU则无法立即进行新的选举必须等待Max Age20s老化旧 BPDU 信息确保旧拓扑信息完全失效此过程端口维持 Blocking旧 BPDU 老化后完成本地选举、进入 Listening/Learning 状态流程同 30s 场景最终收敛时间带旧 BPDU / 最坏情况收敛时间 Max Age 2 × Forward Delay 20 15 15 50 s3.STP的whySTP的Max Age决定了最大跳数是20Message Age每增加一跳 1默认时间Hello Time 2Max Age 20Forward Delay 151为什么Hello Time 2 工程折衷历史硬件、带宽、故障感知的平衡值。2为什么Max Age 20 工程经验表明连续丢 10 个包极大概率是物理故障。3为什么 Forward Delay 15 为了防止环路端口在 Listening 状态时长 Forward Delay必须能“熬死”所有旧 BPDU。Forward Delay保证全网拓扑完全同步、旧环路路径完全消失。IEEE 802.1D 推荐公式Forward Delay ≈ ((4 x Hello Time) (3 x Diameter)) / 24 × Hello允许连续丢失4 个 BPDU抗抖动、抗丢包冗余3 × Diameter 故障信息传遍全网所有交换机重新计算路径旧的 MAC 地址、旧拓扑信息全部老化 / 失效因此3倍直径冗余/2除以 2 因为 Listening、Learning 各占一段 Forward Delay。Forward Delay 24×23×7 282114.5≈15s4那为什么IEEE 802.1D 推荐网络直径 ≤ 7 跳呢网络直径是指任意两台终端之间经过的最大交换机数量。Max Age保证BPDU 一定能传到全网最远端不被提前老化。IEEE 802.1D 推荐公式Max Age (4 × Hello) (2 × Diameter) − 24 × Hello允许连续丢失4 个 BPDU抗抖动、抗丢包冗余2 × Diameter BPDU 从根桥走到最远交换机传播时间乘以2是留给链路抖动、交换机处理、重传等余量2校准偏移量可以说是安全余量。反推Diameter (Max Age 2 − 4×Hello) / 2 (202−8)/2 7