2、生成树协议(STP)原理:STP的基本概念、BPDU报文结构、根桥选举过程

各位好,咱们今天聊聊生成树协议,也就是STP。说实话,这玩意儿是网络工程师的必修课,也是我当年入行时觉得最绕的一个协议。但搞懂了它,你就能明白交换机是怎么在物理环路上“拆桥”的。

2.1 STP的基本概念

先问个问题:为什么要有STP?

你想想看,在二层网络中,如果交换机之间用两条线连起来,形成了物理环路,那广播帧就会在环路里无限转发,最终导致广播风暴,整个网络瘫痪。我刚开始做项目时,就亲眼见过一个同事因为误接了一根网线,导致整栋楼的网络卡死。嗯,那场面,真是“一锅粥”。

STP的核心思想很简单:逻辑上切断冗余链路,只保留一条最优路径。当主链路挂了,再自动激活备份链路。说白了,就是“留一手,但平时不用”。

STP的三大核心功能:

  • 消除环路:通过阻塞某些端口,打破物理环路。
  • 链路冗余:当主链路故障时,自动启用备份链路。
  • 自动收敛:网络拓扑变化时,重新计算生成树。

我个人习惯把STP比作一个“选举系统”。所有交换机先选出一个老大(根桥),然后其他交换机根据距离老大的远近,决定自己的端口角色。端口角色主要有三种:

  • 根端口(RP):非根桥上,离根桥最近的端口。
  • 指定端口(DP):每条链路上,离根桥最近的端口。
  • 阻塞端口(AP):既不是RP也不是DP的端口,逻辑上被阻塞。

这里有个避坑指南:我曾经遇到过有人把“阻塞端口”理解为“物理断开”。其实不是的,端口只是逻辑上不转发数据帧,但BPDU报文照收不误。它一直在“监听”网络状态,随时准备上岗。

2.2 BPDU报文结构

STP能正常工作,全靠一种叫BPDU(Bridge Protocol Data Unit)的报文在交换机之间“通风报信”。BPDU每隔2秒发一次,就像心跳一样。

BPDU的报文结构,我建议你记住几个关键字段。其他的,用到时再查表就行。

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

你看,BPDU里最重要的就是根桥ID根路径开销。这两个字段决定了谁当老大,以及你离老大有多远。

小技巧:抓包时,你可以用Wireshark过滤BPDU报文。过滤表达式是 stpbpdu。我习惯在排查环路问题时,先抓个BPDU看看根桥是谁,心里就有底了。

2.3 根桥选举过程

根桥选举,说白了就是比谁“更牛”。怎么比?看两个东西:优先级MAC地址

选举规则很简单:

  1. 先比桥优先级(Bridge Priority),数值越小越牛。默认是32768。
  2. 如果优先级一样,再比MAC地址,MAC地址越小越牛。

举个例子:

交换机A:优先级 32768,MAC 00-11-22-33-44-01
交换机B:优先级 32768,MAC 00-11-22-33-44-02
交换机C:优先级 4096, MAC 00-11-22-33-44-03

谁会是根桥?

答案是交换机C。因为它的优先级是4096,比32768小。虽然A和B的MAC地址更小,但优先级优先,所以C胜出。

选举过程是这样的:

  • 一开始,每台交换机都以为自己是根桥。它们会发送BPDU,里面填上自己的桥ID。
  • 当交换机收到邻居的BPDU时,会比较对方的根桥ID和自己的根桥ID。
  • 如果对方的根桥ID更优(优先级更低或MAC更小),就更新自己的根桥信息,并转发这个更优的BPDU。
  • 这个过程会一直扩散,直到所有交换机都认同同一个根桥。

我记得有一次在数据中心做割接,新加了一台交换机,结果它把自己的优先级设成了0(最低)。好家伙,它直接抢了根桥的位置,导致整个网络的流量路径全变了。嗯,从那以后,我每次上线新设备,都会先检查一下STP优先级配置。

注意:根桥选举不是一劳永逸的。如果根桥挂了,或者有更优的交换机加入,会触发重新选举。这个过程需要30-50秒(STP收敛时间),所以生产环境中建议使用RSTP(快速生成树协议),收敛时间能缩短到1秒以内。

最后总结一下:STP通过BPDU报文交换信息,选举出一个根桥,然后其他交换机根据根桥的位置,决定端口角色,最终形成一棵无环的逻辑树。你想想看,这就像在一个迷宫里,大家先选出一个领路人,然后所有人跟着领路人的方向走,自然就不会绕圈子了。