一、STP 出现的背景 STP 是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞以消除环路。由于局域网规模的不断增长,生成树协议已经成为了当前最重要的局域网协议之一。
环路的网络中,会产生如下两种情况: 1、广播风暴导致网络不可用。
2、MAC 地址表震荡导致 MAC 地址表项被破坏。
二、STP 基本概念
一个根桥 树形的网络结构必须有树根,于是 STP 引入了根桥(Root Bridge)概念。 对于一个 STP 网络,根桥在全网中只有一个,它是整个网络的逻辑中心,但不一定是物理中心。根桥会根据网络拓扑的变化而动态变化。 网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置 BPDU,其他设备仅对该报文进行处理,传达拓扑变化记录,从而保证拓扑的稳定。
两种度量 生成树的生成计算有两大基本度量依据:ID 和路径开销。 ID ID 又分为:BID(Bridge ID)和 PID(Port ID)。 BID:桥 ID IEEE 802.1D 标准中规定 BID 是由 16 位的桥优先级(Bridge Priority)与桥 MAC 地址构成。BID 桥优先级占据高 16 位,其余的低 48 位是 MAC 地址。 在 STP 网络中,桥 ID 最小的设备会被选举为根桥。 PID:端口 ID PID 由两部分构成的,高 4 位是端口优先级,低 12 位是端口号。 PID 只在某些情况下对选择指定端口有作用。
路径开销 路径开销(Path Cost)是一个端口变量,是 STP 协议用于选择链路的参考值。STP 协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树形网络结构。在一个 STP 网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口的路径开销累加而成,这个值叫做根路径开销(Root Path Cost)。
三要素选举 从环形网络拓扑结构到树形结构,总体来说有三个要素:根桥、根端口和指定端口 根桥 RB(Root Bridge) 根桥就是网桥 ID 最小的桥,通过交互配置 BPDU 协议报文选出最小的 BID。 根端口 RP(Root Port) 所谓根端口就是去往根桥路径开销最小的端口,根端口负责向根桥方向转发数据,这个端口的选择标准是依据根路径开销判定。在一台设备上所有使能 STP 的端口中,根路径开销最小者,就是根端口。很显然,在一个运行 STP 协议的设备上根端口有且只有一个,根桥上没有根端口。 指定端口 DP(Designated Port)
一旦根桥、根端口、指定端口选举成功,则整个树形拓扑建立完毕。在拓扑稳定后,只有根端口和指定端口转发流量,其他的非根非指定端口都处于阻塞(Blocking)状态,它们只接收 STP 协议报文而不转发用户流量。
四个比较原则 STP 选举有四个比较原则,构成消息优先级向量:{ 根桥 ID,累计根路径开销,发送设备 BID,发送端口 PID }。
在 STP 计算过程中,都遵循数值越小越好的原则。 最小 BID:用来选举根桥。运行 STP 协议的设备之间根据表 2 所示根桥 ID 字段选择最小的BID。 最小累计根路径开销:用来在非根桥上选择根端口。在根桥上,每个端口到根桥的根路径开销都是 0。
最小发送者 BID:当一台运行 STP 协议的设备要在两个以上根路径开销相等的端口之中选择根端口时,通过 STP 协议计算,将选择接收到的配置消息中发送者 BID 较小的那个端口。
最小 PID:用于在根路径开销相同的情况下,不阻塞最小 PID 的端口,而是阻塞 PID 值较大的端口。
五种端口状态
对于 STP,影响端口状态和端口收敛有以下 3 个参数。 Hello Time 运行 STP 协议的设备发送配置消息 BPDU 的时间间隔,用于设备检测链路是否存在故障。设备每隔 Hello Time 时间会向周围的设备发送 hello 报文,以确认链路是否存在故障。当网络拓扑稳定之后,该计时器的修改只有在根桥修改后才有效。新的根桥会在发出的 BPDU报文中填充适当的字段以向其他非根桥传递该计时器修改的信息。但当拓扑变化之后, TCN PDU 的发送不受这个计时器的管理。 Forward Delay 设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成临时环路。为此, STP 采用了一种状态迁移机制,新选出的根端口和指定端口要经过 2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。 说明:Forward Delay Timer 指一个端口处于 Listening 和 Learning 状态的各自持续时间,默认是 15秒。即 Listening 状态持续 15 秒,随后 Learning 状态再持续 15 秒。这两个状态下的端口会处于 Blocking 状态,这正是 STP 用于避免临时环路的关键。 Max Age 端口的 BPDU 报文老化时间,可在根桥上通过命令人为改动老化时间。 Max Age 通过配置 BPDU 报文的传输,可保证 Max Age 在整网中一致。运行 STP 协议的网络中非根桥设备收到配置 BPDU 报文后,报文中的 Message Age 和 Max Age 会进行比较: 如果 Message Age 小于等于 Max Age,则该非根桥设备继续转发配置 BPDU 报文。 如果 Message Age 大于 Max Age,则该配置 BPDU 报文将被老化。该非根桥设备直接丢弃该配置 BPDU,可认为网络直径过大,导致根桥连接失败。 说明:如果配置 BPDU 是根桥发出的,则 Message Age 为 0。否则, Message Age 是从根桥发送到当前桥接收到 BPDU 的总时间,包括传输延时等。实际实现中,配置 BPDU 报文经过一个桥,Message Age 增加 1。
三、STP 报文格式
桥 ID、路径开销和端口 ID 等信息,所有这些信息都是通过 BPDU 协议报文传输。 配置 BPDU 是一种心跳报文,只要端口使能 STP,则配置 BPDU 就会按照 Hello Time 定时器规定的时间间隔从指定端口发出。 TCN BPDU 是在设备检测到网络拓扑发生变化时才发出。 BPDU 报文被封装在以太网数据帧中,目的 MAC 是组播 MAC:01-80-C2-00-00-00, Length/Type字段为 MAC 数据长度,后面是 LLC 头, LLC 之后是 BPDU 报文头。以太网数据帧格式如下图。
配置 BPDU 通常所说的 BPDU 报文多数指配置 BPDU。 在初始化过程中,每个桥都主动发送配置 BPDU。但在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他桥在收到上游传来的配置 BPDU 后,才触发发送自己的配置 BPDU。配置 BPDU 的长度至少要 35 个字节,包含了桥 ID、路径开销和端口 ID 等参数。只有当发送者的 BID 或端口的 PID两个字段中至少有一个和本桥接收端口不同, BPDU 报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的 BPDU 报文。 配置 BPDU 在以下 3 种情况下会产生: 只要端口使能 STP,则配置 BPDU 就会按照 Hello Time 定时器规定的时间间隔从指定端口发出。 当根端口收到配置 BPDU 时,根端口所在的设备会向自己的每一个指定端口复制一份配置BPDU。 当指定端口收到比自己差的配置 BPDU 时,会立刻向下游设备发送自己的 BPDU。
BPDU 报文基本格式
标志字段STP 中只使用了其最高位和最低位。 Flags 字段格式
TCN BPDU TCN BPDU 内容比较简单,只有表 1 中列出的前 3 个字段:协议号、版本和类型。类型字段是固定值 0x80,长度只有 4 个字节。 TCN BPDU 是指在下游拓扑发生变化时向上游发送拓扑变化通知,直到根节点。
TCN BPDU 在如下两种情况下会产生: 端口状态变为 Forwarding 状态,且该设备上至少有一个指定端口。 指定端口收到 TCN BPDU,复制 TCN BPDU 并发往根桥。
四、STP 拓扑计算
网络中所有的设备使能 STP 协议后,每一台设备都认为自己是根桥。此时,每台设备仅仅收发配置 BPDU,而不转发用户流量,所有的端口都处于 Listening 状态。所有设备通过交换配置 BPDU后,进行选举工作,选出根桥、根端口和指定端口。
BPDU 报文的交互过程
如图 1 所示,用{}标注的四元组表示了由根桥 ID(图中以 S1_MAC 和 S2_MAC 代表两台设备的BID)、累计根路径开销、发送者 BID、发送端口 PID 构成的有序组。配置 BPDU 会按照 Hello Timer规定的时间间隔来发送。
STP 算法实现的基本过程
- 初始状态 由于每个桥都认为自己是根桥,所以在每个端口所发出的 BPDU 中,根桥字段都是用各自的 BID, Root Path Cost 字段是累计的到根桥的开销,发送者 BID 是自己的 BID,端口 PID是发送该 BPDU 端口的端口 ID。
- 选择根桥 网络初始化时,网络中所有的 STP 设备都认为自己是“根桥”,根桥 ID 为自身的设备 ID。通过交换配置消息,设备之间比较根桥 ID,网络中根桥 ID 最小的设备被选为根桥。
- 选择根端口和指定端口 根端口和指定端口的选择过程如表 1 所示
一旦根桥、根端口和指定端口选举成功,整个树形拓扑就建立完毕了。
STP 拓扑变化
STP 拓扑变化处理过程如图 3 所示。
- 在网络拓扑发生变化后,下游设备会不间断地向上游设备发送 TCN BPDU 报文。
- 上游设备收到下游设备发来的 TCN BPDU 报文后,只有指定端口处理 TCN BPDU 报文。其它端口也有可能收到 TCN BPDU 报文,但不会处理。
- 上游设备会把配置 BPDU 报文中的 Flags 的 TCA 位设置 1,然后发送给下游设备,告知下游设备停止发送 TCN BPDU 报文。
- 上游设备复制一份 TCN BPDU 报文,向根桥方向发送。
- 重复步骤 1、 2、 3、 4,直到根桥收到 TCN BPDU 报文。
- 根桥把配置 BPDU 报文中的 Flags 的 TC 位置 1 后发送,通知下游设备直接删除桥 MAC 地址表项。 说明: TCN BPDU 报文主要用来向上游设备乃至根桥通知拓扑变化。 置位的 TCA 标记的配置 BPDU 报文主要是上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送 TCN BPDU 报文。 置位的 TC 标记的配置 BPDU 报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备直接删除桥 MAC 地址表项,从而达到快速收敛的目的。