「STP」- 生成树协议,Spinning Tree Protocol,IEEE 802.1D

  CREATED BY JENKINSBOT

为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及 MAC 地址表不稳定等问题进而会影响到用户的通信质量。

问题描述

在二层交换网络中,环路容易引发很多问题:

问题:广播风暴

交换机通过多条链路互联,能够提升网络可靠性,但是可能会带来环路问题。环路会导致:广播风暴;主机收到重复数据帧。

当交换机未产生 CAM Table 条目之前,数据包会在多个端口上进行泛洪。此时,经过一系列转发,数据包有回到原始交换机。

问题:MAC 地址表震荡

发生广播风暴,某个数据包(SRC MAC)频繁从不同端口出现,导致 CAM Table 的条目会频繁发生变化。

协议作用:消除环路;链路备份

生成树协议 STP(Spanning Tree Protocol)能够在提高可靠性的,同时又能避免环路带来的各种问题。

消除环路:STP 通过阻塞端口来消除环路,并能够实现链路备份的目录。阻塞端口,指端口不转发数据,进入逻辑阻塞状态。

链路备份:当链路异常,交换机会将阻塞端口切换为转发状态。

原理简述

注意事项:
1)我们学习 STP 协议,应该关注 选举范围、选举方法、设备状态。
2)各交换机会根据在 BPDU 中的信息,确定自己的角色。因此,如下选举过程并非依次发生,而是同时发生。

选举:根桥(Root Bridge)

选举范围:在整个交换网络中,选举根桥

选举方法
1)当交换机启动 STP 之后,都会认为自己是 Root Bridge,然后向接口发送 BPDU 数据帧;
2)通过 Bridge ID 选举 Root Bridge,BID 越小优先级越高。

Bridge ID = Priority (4 bits) + locally assigned system ID extension (12 bits) . ID [MAC address] (48 bits))

比较 BID 的方法:先比较 Priority 参数,再比较 MAC 地址参数;

设备状态:在网络中仅有一个根桥设备,其他交换机为非根桥。

选举:根端口(Root Port)

Root Port(根端口),是 Switch 直连到 Root Bridge 的端口;或者,如果有多条路径,由 Root Bridge 计算出具有首选路径的端口;

选举范围:在非根交换机上,选举根端口,为转发状态,而根桥不会存在根端口;

选举方法(选举根端口):
1)路径代价(路径开销):Port 到 Root Bridge 的开销;
2)如果(1)相同,查看 紧邻对端的 Bridge ID 参数 进行选举;
3)如果(2)相同,则使用 对端 Port ID 参数 进行选举;
4)如果(3)相同,则使用 本地 Port ID 参数 进行选举;

Port ID = priority (4 bits, default=128) + ID (Interface number) (12 bits)

设备状态:端口为 Forwarding 状态;

路径代价(路径开销)有不同的标准,不同设备应该使用相同的标准。

选举:指定端口(DP – Designated Port)

选举范围:在每个链路中,选举一个指定端口;

选举方法
1)到 Root Bridge 的开销:通常根桥的端口都为指定端口,因为开销为零;
2)如果(1)相同,则 端口所在交换机 的 BID 参数,小的成为指定端口;
3)如果(2)相同,则查看 端口所在交换机 的 Port ID 参数;例如,同个交换机的两个端口相接。

设备状态:端口为 Forwarding 状态;并由 DP 向下泛洪 BPDU 数据帧(只有 DP 泛洪 BPDU 报文);

阻塞:非根端口、非指定端口

预备端口,Alternate Port(阻塞非根、非指定端口),这些端口进入阻塞状态。

设备状态:端口为 Blocking(Discarding)状态; AP 端口不会向下泛洪 BPDU 帧,但是能够处理 BPUD 帧;

补充:端口状态转换的关系

为了避免环路,交换机不会立刻进入 Forwarding 状态;

交换机拓扑发生变化时,(其他端口也会进入 Discarding 状态):
1)Listening 经过 15s 转发延迟,进入 Learning 状态;
2)然后,再经过 15s 转发延迟,进入 Forwarding 状态;

因此 AP ⇒ RP 需要 30s 时间。

补充:路径开销(Path Cost)

IEEE 802.1D-1998,IEEE 802.1T

在不同的路径开销标准中,路径开销的值是不同的。

协议报文:BPDU – Bridge Protocol Data Units

在网络初始时,所有交换机都会相互发送 BPUD 信息;
设备发现自己的 BPUD 优先级(BID)不如其他交换机,因此不再发送 BPDU 信息;
当网络稳定之后,Root Bridge 才会发送 BPDU 信息,包括 Root Bridge 的信息;其他设备的 Designated Port 将转发 BPDU 信息;

IEEE 8023.3 Ethernet | BPDU

字段说明

为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在 BPDU(Bridge Protocol Data Unit)中。

PID,Protocol ID,2 bytes(0x0000 IEEE 802.1D)
针对我们这里讨论的 STP 协议,该字段为 0x00 值;

PVI,Protocol Version ID,1 byte(0x00 Config & TCN / 0x02 RST / 0x03 MST / 0x04 SPT BPDU)
针对我们这里讨论的 STP 协议,该字段为 0x00 值;如果我们讨论 RSTP 协议,则该字段为 0x02 值;

BPDU Type,BPDU 类型。在标准 STP(IEEE 802.1D)中有两种类型:

1) CBPDU, Configuration BPDU,0x00:Bridge ID、路径开销、Port ID 等参数。STP 协议通过在交换机之间传递配置 BPDU 来选举 Root Bridge,以及确定每个交换机端口的角色和状态。在初始化过程中,每个桥都主动发送 CBPDU。在网络拓扑稳定以后,只有根桥主动发送 CBPDU,其他交换机在收到上游传来的配置BPDU后,才会发送自己的配置BPDU。

2)TCN BPDU,0x80:下游交换机感知到拓扑发生变化时,向上游发送的拓扑变化通知(这是控制信息,从根端口转发),此时使用该类型报文。

Flags,在 STP 中,仅使用 第一位(TC,Topology Change)与 第八位(Topology Change Acknowledgement),与拓扑变化有关。

在 CBPDU 中,包含足够的信息来保证设备完成生成树计算,其中包含的重要信息如下:

1)Root ID:由 Root Bridge 的优先级和MAC地址组成,每个STP网络中有且仅有一个根。
2)RPC,Root Path Cost,根路径开销:到根桥的最短路径开销。
3)Bridge ID,指定桥 ID:由指定桥的优先级和 MAC 地址组成。指定桥:指定端口所在的桥(即 BPDU 的来源);
4)Port ID,指定端口 ID:由指定端口的优先级和端口号组成。
5)Message Age: CBPDU 在网络中传播的生存期。每经过一个交换机会 +1,当达到 20 时,其他交换机不会再使用;
6)Max Age: CBPDU 在设备中能够保存的最大时间。在 Max Age 之内,如果未收到 Root Bridge 的 BPUD 帧,则网络出现问题,进行重新选举;
7)Hello Time: CBPDU 发送的周期,每两秒发送一次;
8)Forward Delay:端口状态迁移的延时,15s

在 STP 中,包含一些重要的时间参数,这里举例说明如下:
1)Hello Time 是指:运行STP协议的设备发送配置BPDU的时间间隔(默认2S),用于检测链路是否存在故障。交换机每隔HelloTime时间会向周围的交换机发送配置BPDU报文,以确认链路是否存在故障。当网络拓扑稳定后,该值只有在根桥上修改才有效
2)Message Age:如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文每经过一个交换机,Message Age增加1。
3)MaxAge 是指:BPDU报文的老化时间(默认20S),可在根桥上通过命令人为改动这个值。Max Age通过配置BPDU报文的传递,可以保证MaxAge在整网中一致。非根桥设备收到配置BPDU报文后,会将报文中的Message Age和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备会继续转发配置BPDU报文。如果Message Age大于Max Age,则该配置BPDU报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU,并认为是网络直径过大,导致了根桥连接失败。

拓扑变化(交换机层面)

这里“拓扑变化”指交换机协议层面的拓扑变化,而非物理层面拓扑变化。

问题:根桥故障

在 Max Age 内,20s,交换机未收到 Root Bridege 的 BPDU 帧:
1)在 20s 后,交换机 SWB/SWC 认为链路故障,开始发送 BPDU 帧;
2)端口状态迁移(Forward Delay)的延时,Listening ⇒ Learning ⇒ Forwarding,15s * 2 = 30s
3)总共为 50s 时间

问题:直连链路故障

在这个拓扑中,SWA/SWB 之间有两条链路,其中虚线链路不转发流量。
1)当 SWA/D ⇒ SWB/R 故障,SWB/A 会迅速变为 SWB/R 状态,无需等待 20s 老化。
2)但是为 Blocking 状态,到 Forwarding 状态,需要 30s 时间(Forward Delay)。

问题:非直连链路故障

此时,假如 SWB 与 SWA 之间有 Hub 存在,并且 SWB 到 Root Bridge 的链路出现故障,但 SWB 的接口为 UP 状态:
1)SWB 无法收到 Root Bridge 的 BPDU 帧,因此 SWB 无法向 SWC 转发 BPDU 帧,而 SWC 能收到来自 SWA 的 BPDU 帧;
2)SWC/A 切换到 SWC/P 状态,由 Blocking 进入 Forwarding 状态,整个过程需要 30s 时间;
3)然后,SWC/P 开始发送 BPDU 帧,然后 SWB/P 切换到 SWB/R 状态(因为 SWB 无法直接收到 Root Bridge 的 BPDU 帧,而是经过 SWC 设备,因此这个端口是 Root Port 状态,而非 Designated Port 状态)

总的来说,整个网络恢复需要 50s 时间:当故障时,在 20s 后,SWB 一直未收到 Root Bridge 的 BPDU 帧,失效。此时,SWC 切换 SWC/A 状态,需要 30s 时间。

问题:拓扑改变导致 MAC 地址表错误

1)如果 SWC/G1 端口发生异常,此时与 SWA/G2 相关 MAC 地址表条目将被清除。
2)此时 Host-A 发往 Host-B 的数据帧,在到达 SWA 时将被丢弃。
3)当 MAC 地址表条目 300s 时间超时之后,SWB/G1 相关的条目会老化。也就说 300s 之后 Host-A 才能访问到 Host-B 主机。

解决:TCN,TCA,TC

工作原理:
1)在拓扑变化后,Root Bridge 通过 TCN BPDU 帧获知生成树拓扑里发生故障。
2)然后,Root Bridge 生成 TC 用来通知 其他交换机 加速老化现有的 MAC 地址表项。

拓扑变更以及 MAC 地址表项更新的具体过程如下:
1)SWC 感知到网络拓扑发生变化后(比如链路异常,RP Down), AP ⇒ RP,并通过 RP 不断地向 SWB 发送 TCN BPDU 帧;
2)SWB 收到 SWC 发来的 TCN BPDU 帧后,会把 CBPDU 帧中的 Flags.TCA=1,然后发送给 SWC,告知 SWC 停止发送 TCN BPDU 报文;
3)SWB 向根桥转发 TCN BPDU 帧;
4)SWA 把 CBPDU 帧 的 Flags.TC=1 后发送,通知下游设备把 MAC 地址表项的老化时间由默认的 300s 变为 Forwarding Delay 时间(默认 15s)
5)最多等待15秒之后,SWB 中的错误映射关系会被自动清除。此后,SWB 就能通过 G0/0/2 端口把从 Host-A 到 Host-B 的帧正确地进行转发。

正如前面所说,BPDU 只有两种,其一是 TCN BPDU 类型,而 TCA=1 / TC=1 都属于 CBPDU 类型

注意事项:
1)端口从 Non-forwarding 变 Forwarding 状态,此时才能称之为“拓扑变化”;
2)仅在发送拓扑变化之后,才会发送进行拓扑通知过程;

参考文献

Spanning Tree Protocol – Wikipedia