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中的阻塞端口
选举过程是这样的:
- 先选根桥(全网唯一)
- 每台非根桥交换机选一个根端口(到根桥最近的那个口)
- 每条链路上选一个指定端口(离根桥更近的那端)
- 剩下的端口全部阻塞
我画个简单的拓扑帮你理解:
[根桥]
/ \
/ \
[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秒的。到时候我会分享一个我在金融客户现场踩过的坑,保证让你印象深刻。