STP基础:STP的作用、BPDU报文结构、根桥与端口角色选举

各位同学,咱们今天聊聊STP。说实话,很多刚入行的朋友觉得STP是个老掉牙的技术,没什么好学的。但我告诉你,我见过太多网络故障,最后查来查去,根因就是STP没配好。有一次半夜三点被叫起来处理全网瘫痪,到现场一看——广播风暴,交换机CPU直接100%。嗯,从那以后,我再也不敢小看STP了。

一、STP到底解决什么问题?

说白了,STP就是为了防止广播风暴。你想想看,一个网络里如果存在冗余链路,数据帧就会在交换机之间来回转发,越转越多,最后把整个网络堵死。这就是广播风暴。

STP的全称是Spanning Tree Protocol,生成树协议。它的核心思想很简单:逻辑上切断某些端口,让网络变成一棵树,没有环路。但物理链路还在,一旦主链路挂了,STP会重新计算,把之前切断的端口打开。

核心要点:STP不是消灭冗余,而是管理冗余。它让网络在正常时无环,故障时有备份。

二、BPDU报文结构——STP的“心跳”

STP靠什么通信?靠BPDU(Bridge Protocol Data Unit)。我习惯把它叫作“桥协议数据单元”。每台交换机都会定期发送BPDU,告诉邻居“我还活着,我的信息是这样的”。

BPDU报文里包含哪些关键字段?我列个表给你看:

字段 长度 说明
协议ID 2字节 固定为0
版本 1字节 STP为0,RSTP为2
BPDU类型 1字节 0x00表示配置BPDU,0x80表示TCN BPDU
根桥ID 8字节 包含优先级和MAC地址
根路径开销 4字节 到根桥的累计开销
发送桥ID 8字节 发送该BPDU的交换机标识
发送端口ID 2字节 发送该BPDU的端口编号
消息老化时间 2字节 BPDU的有效时间
最大老化时间 2字节 默认20秒
Hello时间 2字节 默认2秒
转发延迟 2字节 默认15秒

这里我特别提醒一下:根桥ID和发送桥ID这两个字段,是选举的关键。根桥ID决定了谁是老大,发送桥ID决定了谁更优先。

我的经验:有一次排查STP震荡问题,抓包一看,发现某台交换机的BPDU里根桥ID一直在变。最后发现是优先级配置冲突,两台交换机都觉得自己是根桥。所以,我建议你养成习惯——核心层交换机手动指定优先级,别让设备自己抢。

三、根桥选举——谁才是老大?

STP的第一步,就是选根桥。根桥是整个生成树的根,所有路径计算都以它为准。

选举规则很简单:比BPDU里的根桥ID,小的赢。根桥ID由两部分组成:

  • 优先级(2字节):默认32768,可手动配置
  • MAC地址(6字节):交换机背板MAC

比较时先比优先级,优先级小的当选。如果优先级一样,再比MAC地址,MAC小的当选。

举个例子:

交换机A:优先级32768,MAC 00-1C-23-45-67-01
交换机B:优先级32768,MAC 00-1C-23-45-67-02
交换机C:优先级4096, MAC 00-1C-23-45-67-03

结果很明显:交换机C优先级最小,直接当选根桥。A和B优先级相同,但A的MAC更小,所以如果C挂了,A会成为新根桥。

注意:根桥不是一成不变的。如果网络拓扑变化,或者有人改了优先级,根桥可能会重新选举。这个过程会导致网络短暂中断(30-50秒)。所以,我建议你在核心层交换机上手动设置一个较低的优先级,比如4096,让它稳定当根桥。

四、端口角色选举——谁是指定端口?谁是根端口?

根桥选出来后,每台非根桥交换机要决定自己每个端口的角色。STP定义了四种端口角色:

  • 根端口(Root Port):每台非根桥交换机上,到根桥路径开销最小的端口
  • 指定端口(Designated Port):每条链路上,离根桥更近的那一端的端口
  • 阻塞端口(Blocking Port):既不是根端口也不是指定端口的端口,逻辑上被切断
  • 备用端口(Alternate Port):RSTP中的概念,相当于STP中的阻塞端口

选举过程是这样的:

  1. 先选根桥(全网唯一)
  2. 每台非根桥交换机选一个根端口(到根桥最近的那个口)
  3. 每条链路上选一个指定端口(离根桥更近的那端)
  4. 剩下的端口全部阻塞

我画个简单的拓扑帮你理解:

        [根桥]
        /    \
       /      \
   [SW-A]----[SW-B]
    |          |
    |          |
   [PC1]     [PC2]

假设根桥是上面的那台。SW-A和SW-B之间的链路,谁是指定端口?看谁离根桥更近。如果SW-A的根路径开销是10,SW-B是20,那么SW-A那端的端口就是指定端口,SW-B那端的端口就被阻塞。

关键点:根端口是“收”的方向,指定端口是“发”的方向。阻塞端口既不收也不发数据帧,只收BPDU。

五、端口状态变迁——从阻塞到转发

端口角色定下来后,端口状态会经历几个阶段:

状态 说明 时间
阻塞(Blocking) 不收发数据,只收BPDU 20秒(最大老化时间)
监听(Listening) 开始参与STP计算,不收发数据 15秒(转发延迟)
学习(Learning) 开始学习MAC地址,仍不收发数据 15秒(转发延迟)
转发(Forwarding) 正常收发数据

从阻塞到转发,总共需要50秒。这就是为什么STP网络里,交换机启动后要等将近一分钟才能通。我遇到过客户投诉说“交换机插上网线要等好久才能上网”,其实就是STP在收敛。

避坑指南:我曾经在一个数据中心里,因为STP收敛时间太长,导致虚拟机迁移时网络中断超过30秒,业务直接报错。后来我换用了RSTP(快速生成树),收敛时间从50秒缩短到1-2秒。所以,如果你的网络对中断时间敏感,建议直接用RSTP或MSTP。

六、总结一下

STP的核心就三件事:

  • 选根桥:比优先级和MAC,小的赢
  • 选端口角色:根端口、指定端口、阻塞端口
  • 端口状态变迁:阻塞→监听→学习→转发,耗时50秒

嗯,STP的基础就这些。虽然现在RSTP和MSTP用得更多,但STP的原理是所有生成树协议的根基。你把这个搞懂了,后面学RSTP、MSTP就是水到渠成的事。

下一节咱们聊RSTP,看看它怎么把50秒缩到1秒的。到时候我会分享一个我在金融客户现场踩过的坑,保证让你印象深刻。