局域网设计/生成树协议
如果网络在拓扑结构上具有逻辑环,则某些帧可能会无限期地以链式乘法方式在环路上移动。
- 广播/组播帧:它们始终在所有端口上传播,导致广播风暴;
- 单播帧发送到一个站点,但该站点不在过滤数据库中或不存在:它们以泛洪方式发送。
此外,环路中的网桥的过滤数据库可能不一致,也就是说,与发送方站点相关的过滤数据库中的条目每次有复制帧从不同的端口到达时都会更改其端口,这使得网桥认为该帧来自站点本身移动。
此页面包含来自维基百科的 CC BY-SA 内容:生成树协议。 |
生成树算法允许通过禁用链路[1]从网络物理拓扑中移除逻辑环,从而将网状拓扑(图)转换为称为生成树的树,其根是网桥之一,称为根桥。
每个链路都以基于链路速度的成本为特征:给定一个根桥,可以构建多个生成树,将所有桥彼此连接,但生成树算法选择由最低成本边组成的生成树。
- 参数
- 网桥标识符:它唯一标识网桥,包括
- 网桥优先级:可以自由设置(默认值为 32768);
- 网桥 MAC 地址:它由供应商特定的算法从其端口的 MAC 地址中选择,无法更改;
- 端口标识符:它标识网桥端口,包括
- 端口优先级:可以自由设置(默认值为 128);
- 端口号:理论上网桥不能超过 256 个端口→在实践中,如果需要,也可以使用端口优先级字段;
- 根路径成本:它等于生成树算法选择的所有链路的成本之和,这些链路用于到达根桥(穿过网桥的成本为零)。
可以使用以下标准确定生成树。
根桥是生成树的根:所有从其子树之一到另一个子树的帧都必须穿过根桥。[2]
具有最小网桥标识符的网桥被选中为根桥:因此,生成树的根将是具有最低优先级的网桥,或者如果优先级相同,则选择具有最低 MAC 地址的网桥。
根端口是负责连接到根桥的端口:它向根桥发送帧,并从根桥接收帧。
- 从网桥到根的每条可能路径的成本都是确定的。在这些路径中,选择成本最小的路径(最低成本路径)。然后,连接到该路径的端口是网桥的根端口。
- 当从网桥到根的多个路径是最低成本路径时,网桥使用具有最小网桥标识符的相邻网桥将帧转发到根。因此,根端口是连接到具有最低网桥标识符的网桥的端口。
- 当两个网桥由多条电缆连接时,单个网桥上的多个端口是根端口的候选者。在这种情况下,使用通过相邻网桥上具有最小端口标识符的端口的路径。
- 在远程端口标识符相等的集线器特定配置中,使用通过网桥本身具有最小端口标识符的端口的路径。
指定端口是负责服务链路的端口:它向叶子发送帧,并从叶子接收帧。
- 从连接到链路的每个网桥到根的每条可能路径的成本都是确定的。在这些路径中,选择成本最小的路径(最低成本路径)。连接到导致该路径的网桥的链路的端口是链路的指定端口。
- 当链路上的多个网桥导致通往根的最低成本路径时,链路使用具有最小网桥标识符的网桥将帧转发到根。将该网桥连接到链路的端口是链路的指定端口。
- 当桥接器连接到具有多个电缆的链路时,单个桥接器上的多个端口是指定端口的候选端口。在这种情况下,使用通过桥接器本身的端口(具有最小端口标识符)的路径。
阻塞端口永远不会在其链路上发送帧,并丢弃所有接收到的帧(BPDU 配置消息除外)。
任何不是根端口或指定端口的活动端口都是阻塞端口。
上述标准描述了确定算法将计算出哪种生成树的一种方法,但是按此编写规则需要了解整个网络。桥接器必须确定根桥接器并仅使用它们所拥有的信息来计算端口角色(根、指定或阻塞)。
由于桥接器可以交换有关桥接器标识符和根路径成本的信息,因此生成树协议 (STP)(标准化为 IEEE 802.1D (1990))定义了称为BPDU的消息。
BPDU 具有以下格式
1 | 7 | 8 | 16 | 24 | 32 |
协议 ID (0) | 版本 (0) | BPDU 类型 (0) | |||
TC | 000000 | TCA | 根优先级 | ||
根 MAC 地址 | |||||
根路径成本 | |||||
桥接器优先级 | |||||
桥接器 MAC 地址 | |||||
端口优先级 | 端口号 | 消息年龄 | |||
最大年龄 | Hello 时间 | ||||
转发延迟 |
16 | 24 | 32 |
协议 ID (0) | 版本 (0) | BPDU 类型 (0x80) |
其中字段为
- 协议标识符 字段(2 字节):指定 IEEE 802.1D 协议(值 0);
- 版本 字段(1 字节):区分生成树协议(值 0)和快速生成树协议(值 2);
- BPDU 类型 字段(1 字节):指定 BPDU 类型
- 拓扑更改 (TC) 标志(1 位):由根桥接器设置,以通知所有桥接器网络中发生了更改;
- 拓扑更改确认 (TCA) 标志(1 位):由根桥接器设置,以通知检测到更改的桥接器其拓扑更改通知 BPDU 已收到;
- 根标识符 字段(8 字节):指定网络中根桥接器的桥接器标识符
- 根优先级 字段(2 字节):包含根桥接器的优先级;
- 根 MAC 地址 字段(6 字节):包含根桥接器的 MAC 地址;
- 桥接器标识符 字段(8 字节):指定正在传播配置 BPDU 的桥接器的桥接器标识符
- 桥接器优先级 字段(2 字节):包含桥接器的优先级;
- 桥接器 MAC 地址 字段(6 字节):包含桥接器的 MAC 地址;
- 根路径成本 字段(4 字节):包含到达根桥接器的路径成本,如正在传播配置 BPDU 的桥接器所见;
- 端口标识符 字段(2 字节):指定桥接器正在其上传播配置 BPDU 的端口的端口标识符
- 端口优先级 字段(1 字节):包含端口优先级;
- 端口号 字段(1 字节):包含端口号;
- 消息年龄 字段(2 字节):值,初始化为 0,每当配置 BPDU 穿过桥接器时,会增加整个桥接器的传输时间;[3]
- 最大年龄 字段(2 字节,默认值为 20 秒):如果消息年龄达到最大年龄值,则接收到的配置 BPDU 将不再有效;[3]
- Hello 时间 字段(2 字节,默认值为 2 秒):指定根桥接器生成配置 BPDU 的频率;[3]
- 转发延迟 字段(2 字节,默认值为 15 秒):指定强制端口转换到另一种状态的等待时间。[3]
只有根桥接器才能生成配置 BPDU:所有其他桥接器只是在其所有指定端口上传播接收到的配置 BPDU。 根端口是接收最佳配置 BPDU 的端口,即具有最低消息年龄值 = 最低根路径成本的端口。 阻塞端口从不发送配置 BPDU,但会持续监听传入的配置 BPDU。
相反,拓扑更改通知 BPDU 可以由任何非根桥接器生成,并且它们始终通过根端口传播。
当桥接器生成/传播 BPDU 帧时,它使用端口本身的唯一 MAC 地址作为源地址,使用 STP 多播地址 01:80:C2:00:00:00 作为目标地址
6 字节 | 6 字节 | 2 字节 | 1 字节 | 1 字节 | 1 字节 | 4 字节 | |
01:80:C2:00:00:00(多播) | 源桥接器地址(单播) | ... | 0x42 | 0x42 | 0x03 | BPDU | ... |
目标 MAC 地址 | 源 MAC 地址 | 长度 | DSAP | SSAP | CTRL | 有效载荷 | FCS |
- 禁用
- 因为没有链接连接到端口,所以端口被关闭。
- 阻塞
- 如果端口处于活动状态,则会导致循环的端口。在阻塞状态下不会通过端口发送或接收任何帧(配置 BPDU 仍会在阻塞状态下接收),但如果使用的其他链接出现故障,并且生成树算法确定端口可以过渡到转发状态,则它可能会进入转发状态。
- 监听
- 桥接器处理配置 BPDU 并等待可能导致端口返回阻塞状态的新信息。它不会填充过滤数据库,也不会转发帧。
- 学习
- 虽然端口尚未转发帧,但桥接器会从接收到的帧中学习源地址并将其添加到过滤数据库中。它会填充过滤数据库,但不会转发帧。
- 转发
- 接收和发送数据的端口。STP 仍然会监视传入的配置 BPDU,因此端口可能会返回阻塞状态以防止循环。
端口状态 | 端口角色 | 接收帧? | 接收和处理 CBPDU? | 生成或传播 CBPDU? | 更新过滤数据库? | 转发帧? | 生成或传播 TCN BPDU? |
---|---|---|---|---|---|---|---|
禁用 | 阻塞 | 否 | 否 | 否 | 否 | 否 | 否 |
阻塞 | 是 | 是 | 否 | 否 | 否 | 否 | |
监听 | (在过渡时) | 是 | 是 | 是 | 否 | 否 | 否 |
学习 | 指定 | 是 | 是 | 是 | 是 | 否 | 否 |
根 | 是 | 是 | 否 | 是 | 否 | 是 | |
转发 | 指定 | 是 | 是 | 是 | 是 | 是 | 否 |
根 | 是 | 是 | 否 | 是 | 是 | 是 |
当一个新的网桥连接到数据链路网络时,假设它的网桥标识符比网络中当前根网桥的网桥标识符高
- 首先,网桥在不知道网络其他部分的情况下,假设自己是根网桥:它将所有端口设置为指定(监听状态),并开始在其上生成配置 BPDU,声称自己是根网桥;
- 其他网桥接收新网桥生成的配置 BPDU,并将新网桥的网桥标识符与网络中当前根网桥的网桥标识符进行比较,然后将其丢弃;
- 网络中的根网桥会定期生成配置 BPDU,其他网桥从其根端口接收这些 BPDU,并通过其指定端口进行传播;
- 当新网桥从网络中的根网桥接收配置 BPDU 时,它会发现自己不是根网桥,因为存在另一个网桥,其网桥标识符比它低,然后它停止生成配置 BPDU,并将接收来自根网桥的配置 BPDU 的端口设置为根端口;
- 新网桥还开始传播配置 BPDU,这次是与网络中的根网桥相关的,在所有其他(指定)端口上传播,同时它继续接收其他网桥传播的配置 BPDU;
- 当新网桥在一个指定的端口上接收到一个“最佳”的配置 BPDU 时,该配置 BPDU 根据指定端口选择标准,与它在该端口上传播的配置 BPDU 相比,它停止传播配置 BPDU,并变为阻塞(阻塞状态);
- 经过一段时间的转发延迟后,仍然处于指定状态的端口和根端口从监听状态切换到学习状态:网桥开始填充其过滤数据库,以防止网桥立即开始发送帧,从而导致网络泛洪过载;
- 经过一段时间的转发延迟后,指定端口和根端口从学习状态切换到转发状态:网桥可以将普通帧传播到这些端口。
当拓扑发生变化时,STP 能够检测到拓扑变化,这得益于根网桥定期生成配置 BPDU,并且通过根据需要重新计算生成树(即根网桥和端口状态)来继续保证拓扑中没有环路。
当链路(属于当前生成树)发生故障时
- 根网桥生成的配置 BPDU 无法再到达网络的另一部分:特别是,故障链路的指定端口不再发送配置 BPDU;
- 链路之外的阻塞端口最后收听的配置 BPDU 在网桥本身内“老化”,即其消息年龄随着时间的推移而增加;
- 当消息年龄达到最大年龄值时,最后收听的配置 BPDU 过期,网桥开始重新选举自己为根网桥:它将所有端口重置为指定状态,并开始生成配置 BPDU,声称自己是根网桥;
- STP 继续与之前讨论的新网桥接入相关的情况类似
- 如果存在一个不属于连接两个网络部分的生成树的链路,那么最后连接到该链路的阻塞端口将变为转发状态的根端口,该链路将加入生成树;
- 否则,如果两个网络部分无法再相互连接,那么每个网络部分都会选举一个根网桥。
当插入新的链路时,新链路连接的端口将变为监听状态的指定端口,并开始传播网络中根网桥生成的配置 BPDU→新的配置 BPDU 通过新链路到达
- 如果链路的成本足够低,连接到该链路的网桥开始从非根端口接收配置 BPDU,这些配置 BPDU 的根路径成本低于从根端口接收的配置 BPDU 的根路径成本→更新根端口,以便可以到达最佳路径的根网桥(基于根端口选择标准),以及指定端口和阻塞端口可能也会相应更新;
- 如果链路的成本过高,穿过它的配置 BPDU 的根路径成本过高→连接到新链路的两个端口中的一个将变为阻塞状态,另一个端口将保持指定状态(基于指定端口选择标准)。
当拓扑发生变化后,STP 通过更改端口状态来改变生成树时,它不会更改网桥过滤数据库中的条目以反映这些变化→条目可能过时:例如,发送到某个目的地的帧可能继续通过一个变为阻塞状态的端口发送,直到与该目的地相关的条目过期,因为其老化时间变为 0(在最坏情况下:5 分钟!)。
STP 考虑了一种机制,在检测到拓扑变化时,可以加快网络相对于过滤数据库的收敛速度
- 检测到拓扑变化的网桥通过其根端口向根网桥生成一个拓扑变化通知 BPDU,以宣布拓扑变化;[4]
- 交叉网桥立即通过其根端口转发拓扑变化通知 BPDU;
- 根网桥生成一个包含拓扑变化标志和拓扑变化确认标志都设置为 1 的配置 BPDU,该 BPDU 在被交叉网桥转发后,将被检测到拓扑变化的网桥接收;[5]
- 根网桥在其所有指定端口上生成一个包含拓扑变化标志设置的配置 BPDU;
- 每个网桥在接收配置 BPDU 时
- 删除其过滤数据库中所有老化时间小于转发延迟的条目;
- 依次在其所有指定端口上传播配置 BPDU(保持拓扑变化标志设置);
- 网络暂时处于次优状态,因为更多的帧以泛洪的方式发送,直到网桥通过学习算法重新填充其过滤数据库中的新路径。
STP 的理念是“始终拒绝,只有确定时才允许”:当拓扑发生变化时,帧不会被转发,直到确定瞬态已经消失,即不存在环路,并且网络处于一致状态,这也引入了很长的等待时间,以牺牲收敛速度和到达某些站点的能力为代价。
假设遵循标准推荐的计时器,即
- 采用标准推荐的计时值:最大年龄 = 20 秒,问候时间 = 2 秒,转发延迟 = 15 秒;
- BPDU 通过每个网桥的传输时间不超过传输延迟 = 问候时间 ÷ 2 = 1 秒;
两个端系统之间的级联中不能连接超过 7 个网桥,以便配置 BPDU 可以在转发延迟内两次穿过整个网络:如果实际上在级联中添加了第八个网桥,在最坏的情况下,新网桥(自选为根网桥)的端口将从监听状态切换到转发状态[6],早于来自网络另一端的根网桥的配置 BPDU 有时间到达新网桥;[7]
随着学习状态的引入,链路故障后,网络大约需要 50 秒才能收敛到一致状态
- 20 秒(最大年龄):最后收听的配置 BPDU 过期并检测到故障所需的时间;
- 15 秒(转发延迟):端口从监听状态切换到学习状态所需的时间;
- 15 秒(转发延迟):端口从学习状态切换到转发状态所需的时间。
此外,在网络中实现一致状态并不一定意味着用户所经历的故障服务会结束:实际上,故障也可能反映在应用程序层,对超过一定阈值的连接丢失非常敏感。
- 数据库管理系统可能会启动长时间的故障恢复过程;
- 生成非弹性流量(如 VoIP 应用程序)的多媒体网络应用程序对延迟变化非常敏感。
可以尝试自定义与计时参数相关的值,以提高收敛速度并扩展最大桥接直径,但此操作不建议
- 不加注意会导致网络对拓扑变化的反应能力降低,从而损害网络功能;
- 乍一看,似乎只需要在根桥上进行操作,因为这些值都由根桥传播到整个网络,但实际上,如果根桥发生变化,新的根桥必须通告相同的值 → 这些参数实际上必须更新所有桥接。
通常,STP 在边缘端口(即直接连接到终端主机的端口)上被禁用,以缓解用户所经历的故障服务
- 由于端口转换延迟,连接到网络的 PC 最初将被隔离,时间为两个转发延迟。
- 连接 PC 代表拓扑更改 → 由拓扑更改通告触发的旧条目清理将大大增加网络中泛洪发送的帧数量。
但是,只有主机必须连接到边缘端口,否则可能会在网络中创建循环 → 一些供应商不允许这样做:例如,思科的专有机制 PortFast 在不禁用边缘端口上的 STP 的情况下实现了相同目标,能够使它们立即切换到转发状态并检测它们上可能的循环(即两个边缘端口通过直接电线相互连接)。
给定一个根桥,可以构建多个生成树,将所有桥接彼此连接,但生成树算法选择由最低成本边组成的生成树。这样,路径仅针对树的根进行优化。
- 禁用的链接完全未使用,但仍然有人需要支付费用来保持它们作为容错的辅助链接处于活动状态;
- 无法实现负载均衡以将流量分布到多个并行链接 → 属于所选生成树的链接还必须承受流量的负载,如果不存在 STP,该流量将通过禁用链接走更短的路径。
相反,IP 网络能够更好地组织流量:生成树在整个网络中并不唯一,但每个源都可以计算自己的树并将流量发送到最短路径,从而确保更高的链接负载均衡。
虚拟局域网 (VLAN) 通过设置多个生成树来解决此问题。
STP 假设每个链接都是双向的:如果一个链接发生故障,帧将无法在两个方向中的任何一个方向发送。实际上,光纤电缆是单向的 → 要连接两个节点,需要两根光纤电缆,一根用于在一个方向上的通信,另一根用于在相反方向上的通信,其中一根电缆上的故障只会停止一个方向上的流量。
如果两个单向链接中的一个发生故障,尽管存在 STP,但另一个链接上可能会出现循环:配置 BPDU 从根到叶节点单向传播 → 如果直接传播路径断开,另一个端点的桥接停止从该链接接收来自根桥接的配置 BPDU,然后将根端口移动到另一个链接,并假设该链接上没有其他端口,则将端口设置为指定端口,从而创建一个循环。
单向链接检测 (UDLD) 是思科的一种专有协议,能够通过一种“ping”来检测单向链接上是否存在故障,并禁用端口(“错误禁用”状态),而不是将其选为指定端口。
根桥的位置对网络有很大影响
- 从网络的一侧到另一侧的流量必须穿过根桥 → 性能,就端口的总吞吐量和带宽而言,选定为根桥的桥接的性能应该足以承受大量流量;
- 优先考虑 星型拓扑结构,其中根桥是星型中心 → 每个链接仅连接一个桥接到根桥。
- 更均衡的链接 负载均衡:链接不应该承受来自其他桥接的流量;
- 更高的 容错性:链接的故障只会影响一个桥接的连接性;
- 服务器 和 数据中心 应该放置在靠近根桥的地方,以减少数据通信的延迟;
→ 必须将必须是根桥的桥接的优先级自定义为非常低的值,以避免另一个桥接被选为根桥。
备份桥接 的位置,该桥接旨在在主链接或主根桥发生故障时发挥作用
- 主链接故障:最佳配置是由辅助链接组成的冗余星型拓扑,其中每个桥接都通过辅助链接连接到备份桥接;
- 主根桥故障:备份根桥的优先级也需要自定义为略高于主根桥的优先级,以便在故障情况下强制该桥接被选为根桥。
STP 没有针对外部攻击的内置安全机制。
- 将用户的桥接选为根桥
用户可以将具有非常低优先级的桥接连接到网络,强制其成为新的根桥并更改网络的生成树。思科的专有功能 BPDU Guard 允许边缘端口仅传播来自网络内部的配置 BPDU,拒绝从外部接收的 BPDU(端口进入“错误禁用”状态)。
- 广播风暴速率限制
几乎所有专业桥接都具有一定的广播风暴控制功能,能够通过丢弃超出一定阈值的过量流量来限制端口上的广播流量,但这些流量计无法区分广播风暴中的帧和站点发送的广播帧 → 它们可能会过滤掉合法的广播流量,并且广播风暴更难检测。
- 连接没有 STP 的桥接
一个没有 STP 或 STP 被禁用的单一桥接可以开始将广播流量注入网络,从而创建 STP 控制范围之外的循环:将桥接端口直接连接到同一桥接的另一个端口,或通过两个冗余链接将用户的桥接连接到网络的两个内部桥接,都是例子。
- 多个 STP 域
有时,两个不同的 STP 域(每个域都有自己的生成树)应该连接到同一个共享通道(例如,同一个数据中心中两个具有不同 STP 域的提供商)。思科的专有功能 BPDU Filter 在域外围端口上禁用发送和接收配置 BPDU,以保持生成树分离。