在网络二层协议中,STP生成树应算是最难懂最能给网络制造麻烦的一位,可以说不经历过STP故障造成的网络崩溃也不算见过世面的网工。网络技术经历了那么多年的创新迭代,尽管有些新的技术架构号称可以无需使用STP,但我所接触到的顶级科技公司的数据中心网络依然会使用STP。值得一提的是在虚拟网络里,譬如说用NSX,的确是没有STP,但这是另外一个课题了。
今天我们来复习一下STP生成树,以下是本文的提纲。
- 基本原理
- STP中的报文BPDU
- 根桥和根端口的选举
- 拓扑的变更
- STP的几种模式
- 排错清单
基本原理
一般网络系统中都会搭建有多台的交换机,交换机之间会有冗余链路,STP的提出就是用来解决局域网(二层网络)中的环路问题的。二层上的报文是没有TTL的(就是说没有毁灭计时器),如果网络有环路,报文就会被反复传播最后造成二层网的风暴。 STP通过阻断一些端口,达到打破环路的目的,从而让整个网络拓扑逻辑上成为一个树状结构。
STP生成树的生成过程大概如下:
- 选举根桥(Root Bridge)-- 根桥交换机位于整个逻辑树的根部,并由此确定那些交换机处于下游。
- 选举根端口(Root Port)-- 一旦根桥确定,其他交换机会计算出自身的端口中那一个(并只有一个)端口去往根桥的路径,并以该端口为根端口。
- 选举指定端口(Designated Port) -- 交换机用于转发BPDU(STP报文)的端口, 每个网段有且只能有一个指定端口。
- 阻断端口(Blocking Port),阻断一些端口达到断开环路的目的。
特别指出的是在根桥上的所有端口都是指定端口。

上图是从书ENCOR350-401[1]引用而来,它很好的展示了STP各种端口的状况,DP指的就是Designated Port, RP为Root Port。从上图可见,designated port一般都连着root port, 其对应连着的交换机为处于下游的交换机。
STP中的报文BPDU
在STP协议中发送的报文叫Bridge Protocol Data Unit, 简称为BPDU。根桥根端口的选举都依赖于交换机之间发送的BPDU报文,可以说局域网生成树的建立和维持都要使用BPDU报文。BPDU报文的类型有两种:
- Configuration BPDU -- 这类报文用于确定根桥,根端口,指定端口和阻断端口。
- Topology change notification (TCN) BPDU -- 这类报文用于交换机之间通知拓扑发生了变更。拓扑变更是常见现象,例如某一个交换机中原先连接的端口突然中断,TCN BPDU就会被发出。
在抓包时你能在BPDU报文中看到以下几个参数,后文会对这些参数进行解析:
- Bridge ID -- 根桥ID。
- Local bridge identifier -- 交换机自身的桥ID(交换机也被称作桥bridge)。
- System Priority -- 系统权重,在交换机上可配置的一个权重值,可用于影响根桥的计算。
- root cost path -- 到根桥的距离。
- System Extention ID -- 这个其实就是VLAN ID。
- Hello time -- BPDU报文发送的间距,默认值为2秒。
BPDU报文以组播的方式发送,BPDU的组播地址为01:80:C2:00:00:00,一个接口发送BPDU报文时用自己接口MAC地址作为源地址发送到BPDU地址01:80: