# 简介

在复杂网络中,需要对链路做一定的冗余,以便当其中一条链路或者某台交换机出现故障时,整个网络还能保持通畅。

但是冗余链路会形成环路,造成网络风暴。

这种情况下,生成树协议应运而生,生成树协议是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路备份功能。

# 发展

生成树协议和其他协议一样,是随着网络的不断发展而不断更新换代的。最初被广泛应用的是 IEEE 802.1D-1998 STP(Spanning Tree Protocol,生成树协议),随后以它为基础产生了 IEEE 802.1w RSTP(Rapid Spanning Tree,快速生成树协议)和 IEEE 802.1s MSTP(Multiple Spanning Tree Protocol,多生成树协议)。

三种生成树协议特点比较:

生成树协议

# 知识点

## Bridge Group Address

Bridge Group Address 01-80-C2-00-00-00

STP协议使用的所有BPDU都是组播报文,目的MAC是01-80-c2-00-00-00。

## Root Bridge

根桥(Root Bridge),就是“网桥ID”最优的桥,当STP的拓扑结构稳定之后由根桥负责每2秒(Hello Time)向树中所有的网桥发送配置BPDU报文,其他网桥接收并转发。

## Port Role

port-role

根端口(Root Port),即去往根桥路径最近的端口,这个最近的衡量是靠 Root Path Cost 来判定的。Path Cost 的计算,是每当一个端口收到一个 BPDU 后,会在该 BPDU 所指示的 Path Cost 上加上该端口的 Port Path Cost(这是可以人为配置的)。比较累计 Root Path Cost 最小的端口就是根端口,如果两条路径开销相同,那么就选择 BID 较小的。

指定端口(Designated Port),即在一个 LAN 里面负责转发 BPDU 的端口,根桥和非根桥上都有它,但根端口只在非根桥上有,同样 block 端口也只存在于非根桥上。

Block 端口,即被对方的指定端口抑制的端口,Block 端口不转发任何报文,但它接收 BPDU ,监听网络变化。

eNSP-STP

eNSP-STP_2

# STP 工作原理

## 生成树算法

生成树协议运行生成树算法(STA)。生成树算法很复杂,但是其过程可以归纳为以下三个步骤。

1)选择根网桥(Root Bridge)

2)选择根端口(Root Ports)

3)选择指定端口(Designated Ports)

### 一、选择根网桥

根据网桥ID

struct bridge_id
{
	unsigned char	prio[2];			// 默认 32768
	unsigned char	addr[ETH_ALEN];
};
LSW1:CIST Bridge         :32768.4c1f-cce5-1c02
LSW2:CIST Bridge         :32768.4c1f-cc9f-5fde	// 最小,被选为 Root Bridge
LSW3:CIST Bridge         :32768.4c1f-ccf2-23fd

### 二、选择根端口

选出了根网桥后,网络中的每台交换机必须和根网桥建立关联,因此,STP开始选择根端口。根端口存在每个非网桥上,需要在每个非根网桥上选择一个根端口。

选择根端口按照如下顺序:

a)到根网桥最低的根路径开销

b)直连的网桥 ID 最小

c)端口 ID 最小

到达根路径的cost值计算方式为收到的cost值 + root端口的cost值

根路径开销,是指当前口收到的从Root Bridge发出的BPDU的路径开销,而不是从这个口发出去的。

即在LSW1、LSW3上选择Root Port。先看LSW1,GE 0/0/1 口的根路径开销为20000,GE 0/0/2 口的根路径开销为40000(经过LSW3),所以会选择 GE 0/0/1 为 Root Port。同理可得 LSW3 会选择 GE 0/0/2 为 Root Port

### 三、选择指定端口

选择完根网桥和非根网桥的根端口后,一个树形结构已初步形成,但是,所有链路仍然连接在一起,并可以到处处于活动状态,最后导致形成环路。

为此,STP进行最后的计算,在每一个网段(网线)上选择一个指定端口,选择指定端口的依据有三个:

a)根路径成本较低

b)所在的交换机的网桥ID较小

c)端口ID较小

根网桥上的接口都是指定端口(原因?:因为根网桥上端口的根路径成本为0)

LSW1的GE 0/0/1 和 LSW3的 GE0/0/2 已经被选为Root Port了,现在只能在 LSW1的GE0/0/2 和 LSW3的GE 0/0/1中选择一个作为指定端口了,两个端口的路径开销相同(都为40000),那么只能比较网桥的ID了,LSW1的网桥ID较小,所以LSW1上的端口选作指定端口。

STP 计算过程结束,这时,只有在LSW3上连接到LSW1的端口既不是根端口,也不是指定端口,那么这个端口被阻塞(Block)。被阻塞的端口不能进行数据传输。

由于端口阻塞,所以拓扑结构等价于图STP_2

LSW1和LSW3之间的链路成为备份链路。

# 帧格式

BPDU 报文帧格式

BPDU

STP

DA 目的 mac
SA 源 mac
Length 帧长,从下一个字节到结束的长度
LLC Header 固定为 42 42 03
Protocol ID 恒为 0
Version 版本
Type 两种 BPDU 类型:配置BPDU 或 TCN BPDU
flags STP 只使用 bit0、bit7
Root ID 网桥优先级 + 网桥MAC
Root Path Cost 某端口到根网桥累计的路径开销
Bridge ID 桥优先级 + 桥MAC
Port ID 端口优先级 4bits + 端口号 12bits
Message Age 配置消息的生存期
Max Age 配置消息的最大生存期
hello time 配置消息的发送周期
Forward Delay 控制端口在 Listening 和 Learning 状态的持续时间

STP

实例演示 STP 生成过程

STP_2

交换机 LSW1 刚启动时,在抓包点处进行抓包,报文如下,印证了上图所述的三个阶段。

STP_生成过程

在阶段 3 之后,该交换机才开始进行包转发,如转发 ARP、ICMP 报文。

# 参考

STP生成树协议

Alternate Port和Backup Port 如何识别

不太明白root port和designated port的区别

二层概念

【网络实验六】STP 的原理与配置

shanzhizi的专栏

华为交换机常用命令

让你彻底理解STP的各种角色选举

华为生成树stp配置实例

华为交换机stp简单配置

STP 实验

STP生成树协议原理与算法简析

华为交换机如何查看端口状态和光模块信息

STP配置和选路规则

STP