11. TCN BPDU:揭秘 STP 拓扑变更的通知与收敛机制
一、TCN BPDU介绍
在 STP 网络稳定运行时,根桥会周期性发送配置 BPDU(Configuration BPDU),用于维持整个生成树拓扑的稳定性。然而,当网络中出现链路故障、端口 UP/DOWN 等拓扑变更事件时,仅靠常规的 Hello 机制无法快速清除旧的转发表项。此时,设备必须启动一套特殊的通知与确认机制,通知全网快速刷新 MAC 地址表,以防止临时环路并加速收敛。
在 IEEE 802.1D 标准中,这一过程严格依赖以下三种 BPDU 的协同工作,当然所有 STP 协议报文(配置 BPDU、TCN BPDU 等)都使用组播地址 01:80:c2:00:00:00 发送,没有单播目的地址,不存在点对点定向发送。
- 拓扑改变通知 BPDU(TCN BPDU),Topology Change Notification BPDU。
- 报文类型:类型0x80,是独立的 BPDU 格式,不是配置 BPDU。
- 由非根交换机产生,仅从设备的根端口发送,目的是往根方向传播拓扑变更。
- 设备会每隔一个 Hello Time重复发送 TCN BPDU,直到收到上游设备回复TCA BPDU。
- 拓扑改变确认配置 BPDU(TCA BPDU),Topology Change Acknowledgment Configuration BPDU。
属于配置 BPDU,类型 0x00;在 Flags 字段中,TCA 位被置为 1(第 7 位)。
上游设备在收到 TCN BPDU后,从对应的指定端口回复,确认已收到拓扑变更通知。同时从设备的根端口发送TCN,目的是往根方向传播拓扑变更。
收到 TCN 后立即发送一次即可,无需周期发送。
拓扑改变配置 BPDU(TC BPDU),Topology Change Configuration BPDU。
属于配置 BPDU,类型 0x00;在 Flags 字段中,TC (Topology Change)位被置为1(第 0 位)。
非根桥在向上游转发 TCN(tcWhile > 0)时,它从指定端口向下游发出的所有配置 BPDU,必须将 TC 位置 1,用于提前通知下游刷新 MAC 地址表,不用等待根桥通告。
根桥收到 TCN 后,会全网泛洪将TC 位置 1的配置 BPDU,确保整网所有设备都感知到拓扑变更。
发送周期为Hello Time(2 秒)。
二、TCN报文
1. 变更通知:TCN BPDU
非根交换机感知到拓扑变化,从根端口向上游发送 TCN,报文非常简单,不携带任何拓扑参数,仅仅有一个 BPDU 类型字段,用于告知上游拓扑发生了变更。
从物理层面看是组播,“向上游发送” 是逻辑拓扑方向:TCN 从根端口发出,只能被上游交换机接收,实现逐级上报。例如:交换机 4c:1f:cc:17:65:47 感知拓扑变更,发送 TCN BPDU。
2. 变更回复:非根 TCA BPDU
上游交换机收到 TCN 后会进行确认回复,这个确认报文本质就是配置 BPDU,只是对 Flag 标志位做了特殊标记。
由于所有 BPDU 都使用组播地址 01:80:c2:00:00:00 传播,没有单独的单播应答,因此上游设备在回复 TCA 时,会同时将 TC 与 TCA 置位:
- TCA=1:用于确认收到下游的 TCN;
- TC=1:用于直接通知下游刷新 MAC 地址表,不必等待根桥通告。
802.1D 标准规定:只要设备正在向上转发 TCN(tcWhile>0),下发的配置 BPDU 必须置 TC=1。发生拓扑变更的交换机 4c:1f:cc:17:65:47,会收到其上游设备 4c:1f:cc:36:1a:d6 发出的TC=1、TCA=1的配置 BPDU。
3. 变更传播:非根 TC BPDU
与此同时,上游交换机 4c:1f:cc:36:1a:d6 还会周期性发送仅 TC=1、TCA=0的组播配置 BPDU,持续通知下游刷新 MAC 地址表。该报文由中间交换机自身发出,并非根桥下发。只要本机还在向上游转发 TCN,就会一直置 TC=1。
4. 变更通知传播:非根转发TCN BPDU
同时,上游交换机 4c:1f:cc:36:1a:d6 会从自己的根端口,重新生成并发送新的 TCN BPDU,继续向上接力上报,保证变更消息最终能到达根桥。
TC 位只能向下通知,无法替代 TCN 向根桥上报,因此必须单独转发 TCN。
5. 变更确认:根桥TCA BPDU
根桥 4c:1f:cc:5d:75:fb 收到 TCN 后回复一个TC=1 且 TCA=1的配置 BPDU,一边确认 TCN一边开始通告拓扑变更。
6.变更泛洪:根桥TC BPDU
首次应答完成后,根桥按照 Hello Time 周期,持续发送仅 TC=1、TCA=0的组播配置 BPDU,全网泛洪拓扑变更信息,让所有设备刷新 MAC 地址表,直到收敛完成。
7.总结
- TCN:只向上,负责把变更报到根桥,报文:类型0x80,独立BPDU 格式,不携带任何拓扑参数。。
- TCA:向下应答,确认收到 TCN,报文:类型0x00,配置 BPDU,置位TCA。
- TC:向下通知,刷新 MAC;中间交换机、根桥都可以发送,报文:类型0x00,配置 BPDU,置位TC。
- 全部 BPDU 都是组播,方向由端口角色决定,不由目的 MAC 决定。
三、拓扑变更与收敛
根桥 SW C,SW A ↔ SW B 的 G0/1 链路中断,SW A 和 SW B 感知到这条链路断开。
1.感知变更,发起 TCN
SW A、SW B 感知到 G0/1 链路断开,触发拓扑变更。各自从根端口(SW A:E0/1;SW B:G0/2)发送TCN BPDU,向上游逐级上报。以 Hello Time 周期重复发送,直到收到 TCA 确认。
2.接力上报,提前通知
SW D 收到 SW B 的 TCN:
- 从对应的指定端口(G0/2)回复TC=1,TCA=1的配置 BPDU,TCA=1:确认收到下游 TCN;TC=1:提前通知下游刷新 MAC,无需等待根桥。
- 同时从根端口(G0/1)重新生成新的 TCN BPDU,继续向根桥 SW C 上报。
- 后续周期性向下游(SW B)发送仅 TC=1的配置 BPDU(TCA=0),提前通知刷新 MAC 表。
SW C 收到 SW D 的 TCN:
- 根桥无需再向上上报,从指定端口(G0/2)回复TC=1,TCA=1的配置 BPDU 确认。
- 同时启动全网 TC 泛洪(TC=1,TCA=0)。
3.泛洪 TC,全网刷新
根桥 SW C 开始向所有指定端口(G0/1、G0/2)周期性发送TC=1, TCA=0的配置 BPDU,持续时间Max Age + Forward Delay = 20 + 15 = 35秒:
- 所有收到 TC 报文的交换机,将 MAC 地址表老化时间缩短为Forward Delay(默认 15 秒),加速清理失效条目。
- 中间交换机继续从指定端口转发 TC 报文,确保全网覆盖。
4.重新计算,完成收敛
链路中断后,STP 会重新计算无环拓扑:
SW A:原 G0/1 是根端口(指向根桥 SW C),现在链路断开,该端口失效。重新计算后,E0/1 端口从阻塞状态转为根端口,成为新的最优路径到根桥 SW C。
SW B:原 G0/1 是指定端口(负责向下游网段转发),链路断开后失效。根端口 G0/2 保持不变,仍为最优路径到根桥 SW C。
全网收敛完成:
- 所有交换机完成 MAC 表刷新,新的无环拓扑稳定。
- 根桥 SW C 在 Forward Delay + Max Age 后停止发送 TC 报文。
5.全网收敛时间
- 根桥发送 TC 报文的时间(TC 泛洪时长)Max Age + Forward Delay,默认 20 + 15 =35 秒;
- 全网最长收敛时间:网络中最远的设备,可能35 秒末才收到 TC,之后还需要Forward Delay时间完成 MAC 老化,TC 泛洪时长 + Forward Delay, 20 + 15 + 15 =50 秒;
- 全网最短收敛时间:如果拓扑变化直接发生在根桥直连设备,TCN 立刻到达根桥,下游设备立刻收到 TC,经过 1 个 Forward Delay 完成 MAC 刷新,最短收敛时间 ≈ Forward Delay = 15 秒。
6.核心总结
- 变更触发:端口进入 / 离开 Forwarding 状态(如链路断开)。
- 上报路径:非根桥 → 上游 → 根桥(通过 TCN BPDU 接力)。
- 通知路径:根桥 → 全网(通过 TC 标志位的配置 BPDU 泛洪),泛洪 Max Age + Forward Delay 时长。
- 收敛结果:收到 TC 的交换机将MAC表老化时长缩短为 Forward Delay,全网 MAC 表快速刷新,新的无环拓扑建立。
