STP 产生背景

为了提供冗余链路,防止单点故障,加强网络可靠性。通过连接多台交换机提供备份,但是会产生二层环路。 可能产生如下影响:

  1. 广播风暴
  2. MAC 地址表震荡

STP 简介

STP(Spanning-Tree Protocol,生成树)由 IEEE 制订的 802.1D 标准定义,用于解决局域网中上述问题。

其基本思想是运行该协议的交换机彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞而生成无环路的连通图,从而保证数据传输路径的唯一性,从而消除环路,避免 MAC 地址表震荡,并提供链路备份。

STP 基本概念

桥的概念来自于网桥,现在被交换机所替代。

根桥(Root Bridge):整个网络的逻辑中心,全网中只有一个根桥,其他节点均为指定桥。

指定桥:网络中的叶子节点,负责转发 BPDU。

端口角色

根端口:指定桥上与根桥通信的端口,有且只有一个。

指定端口:流量从根桥方向来,从该端口转发出去。根桥上端口都是指定端口。

端口状态

  1. Disabled:端口关闭。
  2. Blocking:仅接收和处理 BPDU。
  3. Listening:接收、发送和处理 BPDU,不转发用户流量。
  4. Learning:接收、发送和处理 BPDU,构建 MAC 地址表,不转发用户流量。
  5. Forwarding:端口可以接收、发送和处理 BPDU,也转发用户流量。

stp端口转换

STP BPDU 报文

STP采用的协议报文是 BPDU(Bridge Protocol Data Unit,网桥协议数据单元)。

  • Configuration BPDU
用来进行生成树计算和维护生成树拓扑的报文。 


    字段内容 说明
    Protocol Identifier 协议ID=“0”
    Protocol Version Identifier 协议版本标识符,STP为0,RSTP为2,MSTP为3。
    BPDU Type BPDU类型,MSTP为0x02。0x00:STP的Configuration BPDU。0x80:STP的TCN BPDU(Topology Change Notification BPDU)。0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU)
    Flags 对于“标记域”(Flags),第一个bit(左边、高位bit)表示“TCA(拓扑改变响应)”,最后一个bit(右边、低位bit)表示“TC(拓扑改变)”。
    Root Identifier 网桥ID都是8个字节——前2个字节是网桥优先级,后6个字节是网桥MAC地址。现在交换机配置网桥优先级必须是4096的倍数,相当于网桥优先级只有4bit。
    Root Path Cost 根路径开销,本端口累计到根桥的开销。
    Bridge Identifier 发送者BID,本交换机的BID。
    Port Identifier 发送端口PID,发送该BPDU的端口ID,前1个字节是端口优先级,后1个字节是端口编号。 现在交换机配置端口优先级必须是16的倍数,相当于端口优先级只有4bit。
    Message Age 该BPDU的消息年龄。
    Max Age 消息老化年龄。
    Hello Time 发送两个相邻BPDU间的时间间隔。
    Forward Delay 控制Listening和Learning状态的持续时间。
  • Topology Change Nofitication BPDU 当拓扑发生变化时,用来通知相关设备网络拓扑结构发生变化的报文。

    字段内容 说明
    Protocol Identifier 协议ID=“0x0000”
    Protocol Version Identifier 协议版本标识符,STP为0,RSTP为2,MSTP为3。
    BPDU Type BPDU类型,0x80:STP的TCN BPDU(Topology Change Notification BPDU)。

STP 收敛

收敛比较原则

字段 说明
Root ID(根桥ID) 每个STP网络中只有一个根桥,最小的BID选作根桥
Root Path Cost(累计根路径开销) 接收BPDU的端口到根桥的开销,最小的累计根桥路径开销选作根端口
Bridge ID(桥ID) 发送BPDU的交换机桥ID,RPC相等时,最小的发送者BID用来在非根桥选择根端口
PID(端口ID) 发送BPDU的端口ID,RPC、BID相等时,PID用来选择根端口

收敛基本过程

  1. 初始状态:网络初始化时,所有的STP设备都认为自己是根桥,所有端口为指定端口,向外发送的BPDU报文中,RID为BID,RPC为0,BID为自身BID,PID为发送的端口。
  2. 选择根桥:每个端口都按照Hello Time时间间隔向外发送BPDU。收到邻居的BPDU后,比较其中的BID,如果邻居BID比自己更小,则将邻居选作根桥,RID字段填充邻居的BID向外发送BPDU,反之则继续以自身为RID向外发送。当网络中的RID一致时,根桥就选出来了。
  3. 选择根端口:每个指定桥都需要一个根端口。RPC计算方式如下:端口收到一个BPDU后,抽取BPDU中RPC字段的值,加上该端口本身的路径开销。RPC最小的端口被选为根端口。如果RPC相等,则比较端口收到的BPDU中BID的值,那个端口收到的BID最小,就作为根端口。
  4. 选择指定端口:设备通过根端口收到根桥发来的BPDU后,通过指定端口发送出去。每一段链路中都有一个指定端口,另一端则阻塞。通过比较两个端口发送的BPDU的RPC大小可以确定,RPC小的是指定端口,大的阻塞。RPC = 根端口接收到的BPDU中RPC + 根端口自身路径开销。如果RPC相等,比较发送BPDU的设备的BID。
举个🌰️

STP拓扑

根据编号从小到大,MAC从小到达。

  1. 通过比较BID,在所有优先级相同地情况下,SW1的MAC最小,被选为根桥,其他设备为指定桥。
  2. SW2 G1/0/1 RPC = 5,SW2 G1/0/2 RPC = 10,SW2的G1/0/1端口为根端口; SW3 G1/0/1 RPC = 5,SW3 G1/0/2 RPC = 10,SW3的G1/0/1端口为根端口。
  3. 在链路SW2 - SW3中,比较两个端口发出的RPC谁更小,选举指定端口和阻塞端口。 SW2 G1/0/2发出BPDU带的RPC = 5,SW3 G1/0/2发出BPDU带的RPC = 5,相等则比较BID。 SW2 G1/0/2发出BPDU带的BID为SW2的BID,SW3 G1/0/2发出BPDU带的BID为SW3的BID,根据已知条件,SW2的BID小于SW3的BID,因此SW2 G1/0/2为指定端口,SW3 G1/0/2为阻塞端口。

时间参数

  1. Hello Time:默认2s。超时时间 = 超时时间因子(厂商自行指定)* 3 * Hello Time。
  2. Forward Delay:Blocking向Listening,Listening向Learning迁移,都会持续该时间间隔。用于保证BPDU已经传遍网络,避免临时环路。默认15s。
  3. Max Age:端口BPDU老化时间,如果超时收不到新的BPDU,则重新收敛,默认20s。

拓扑变化触发重新收敛

当网络拓扑变化后,发生如下两个条件,交换机会发送TCN BPDU,通知上游交换机,重新收敛:

  1. 网桥有至少一个指定端口,并且该网桥上某个端口从Blocking、Listening或Learning状态迁移到Forwarding状态;
  2. 某端口从Forwarding或Learning状态迁移到Blocking状态。 值得注意的是,以上可能为协议规定,但是实际中,设备端口任何变化都会触发重新收敛。
举个🌰️

拓扑变化情况一:非根桥交换机的指定端口断掉

如果非根桥交换机的指定端口断掉(SW2 的 B 端口),由于该端口从 Forwarding 状态直接进入 Disabled 状态,根据协议,不符合拓扑变化条件,故 SW2 不会发送 TCN BPDU 报文。被阻塞端口 SW3 A 由于不能收到之前 SW2 B 发来的 BPDU,在等待 MAX Age 后进入 Listening 状态,开始向外发送自己计算而得到的 BPDU,在经历 Listening 和 Learning 状态后,进入 Forwarding 状态。同时由于 SW3 A 从阻塞状态进入转发状态,所以交换机 SW3 会立即通过根端口以一定速率发送 TCN BPDU 给上游交换机,上游交换机收到该 TCN BPDU 后会立刻向下游交换机回应 TCA BPDU,并继续向上游传递 TCN BPDU.下游交换机收到 TCA BPDU 会停止发送 TCN BPDU。如此不断传递,直到传到根桥。然后,根桥将自己的 MAC 地址表老化时间改为 Forward Delay.其后会在持续 Forward Delay + MAX Age 时间发出 TC BPDU 其下游任何交换机接收到根桥传递过来的 TC BPDU 都会将自己的 MAC 地址表老化时间修改为 Forward Delay。至此完成收敛。

需要注意的是一开始 SW2 B端口 Down 掉并不属于协议中规定拓扑变化情况,所以按照协议是不会发送 TCN BPDU 的,但是在我司实现中,实际上是会发送 TCN BPDU 通知根桥的。在 SW3 A 端口经历 MAX Age 加两倍 Forward Delay 从阻塞状态变为转发状态时,即 20 + 15 + 15 秒后会发送拓扑变化通知。在 STP 中,根桥以 Hello Time 时间间隔发送 BPDU 报文维护整个网络拓扑,拓扑发生变化时,设备发出 TCN BPDU 一级一级向上游传递,根桥再向下游发送 TC BPDU 通知整个网络。

拓扑变化情况二:根端口断掉

在 STP 中,如果某交换机根端口断掉(SW2 A)则交换机 SW2 立即会认为自己是根桥向外发送 BPDU。由于 SW2 与根桥 SW1 并未采取直联方式,所以根桥 SW1 不会感知到拓扑变化。SW3 A 端此时可以接收到 SW2 B 发送的以SW2为根桥的BPD,这个 BPDU 对于 SW3 A 来说是次等的,所以丢弃该报文。在等待 MAX Age 后,由于仍未收到满足条件的 BPDU,所以进入 Listening,并发送以 SW1 为根桥的 BPDU,SW2 收到 SW3 A 发来的 BPDU,经过比较 SW3 A 的 BPDU 更优,则会停止发送 BPDU,并成为根端口。SW3 A 在经历 Listening 和 Learning 状态后,进入 Forwarding 状态。同时由于 SW3 A 进入转发状态,所以交换机 SW3 会立即向上游发送 TCN BPDU 通告拓扑变化。根桥收到新的 TCN 报文会向其发送一个 TCA 报文,并持续发送 Forward Delay + MAX Age 时间的 TC BPDU,完成此次收敛过程。

在 STP 协议规定中,阻塞端口收到次等 BPDU 不会回复,继续等到自己当前端口信息更优或者一样好的 BPDU,在超过 MAX Age 没有收到期望的 BPDU 时,会进入 Listening 状态,开始向外发送新的 BPDU,准备重新进行选择。在 STP 或 MSTP 中阻塞端口收到次等 BPDU 会立即回复自己更好的 BPDU。我司实现中阻塞端口收到次等 BPDU 也会立即回复的。