# STP、RSTP、MSTP

## 作用

STP、RSTP、MSTP 都属于生成树协议，核心作用是：
- 防止二层网络中因为冗余链路产生环路
- 避免广播风暴
- 避免 MAC 地址表震荡
- 在保证无环的前提下保留链路冗余

可以简单理解为：

二层交换网络为了防止单点故障，常常会接入冗余链路，但冗余链路一多，就可能形成环路。生成树协议会从逻辑上阻塞部分端口，让网络形成一棵无环的树；当主链路故障时，再让备用链路接管转发。

## 基本概念

### 1. 根桥 Root Bridge

生成树会先选出一台交换机作为根桥，整张网络的拓扑计算都围绕根桥进行。

### 2. 根端口 Root Port

每台非根桥交换机都会选出一个到根桥路径最优的端口，称为根端口。

### 3. 指定端口 Designated Port

每个网段都会选出一个负责向该网段转发数据的端口，称为指定端口。

### 4. 阻塞端口

如果某个端口既不是根端口，也不是指定端口，通常就会被阻塞，从而避免环路。

## STP 的工作思路

STP 的大致流程可以概括为：
1. 先选举根桥
2. 每台非根桥交换机选举根端口
3. 每个网段选举指定端口
4. 其余不参与转发的端口进入阻塞状态

这样就能在物理上有环、逻辑上无环。

## STP、RSTP、MSTP 的区别

### STP

STP 是最基础的生成树协议，优点是原理清晰，缺点是收敛速度较慢。

### RSTP

RSTP 是快速生成树协议，相比 STP，收敛速度更快，链路切换也更快，更适合实际网络使用。

### MSTP

MSTP 是多生成树协议，可以把不同 VLAN 映射到不同生成树实例，让不同业务走不同链路，从而更好地利用冗余带宽。

可以简单记成：
- STP：基础版
- RSTP：快速版
- MSTP：可按实例划分、适合多 VLAN 场景

## 常见理解误区

### 1. 生成树不是“丢弃重复包”

生成树的重点不是发现某个包重复后再丢弃，而是提前通过阻塞端口避免二层环路形成。

### 2. 不是“手工指定根端口”

实际配置里，一般是通过调整桥优先级来影响根桥选举，通过调整路径开销等方式影响端口角色，而不是直接简单写成“手工指定根端口”。

### 3. 不是算力够就默认都开

不同厂商、不同型号、不同系统版本的默认行为可能不完全一样。复习时更稳妥的说法是：

- 生成树功能在交换网络中非常常见
- 是否默认开启，要以具体厂商设备为准

## 常见保护特性

### 边缘端口 Edge Port

连接终端主机的端口一般可以配置为边缘端口，这样端口能够更快进入转发状态。

### 根保护 Root Protection

用于防止接入层或下游设备错误地抢占根桥位置，保证预期的根桥不被替换。

### BPDU 保护

一般用于边缘端口。当边缘端口意外收到 BPDU 时，设备可以采取保护动作，防止网络拓扑异常。

### 环路保护 Loop Protection

用于降低某些异常场景下端口错误切换带来的风险。

## 一句话理解

- **生成树的本质是“阻塞冗余链路中的一部分端口，避免二层环路”**
- **RSTP 比 STP 收敛更快**
- **MSTP 适合多 VLAN 场景**

## 常见厂商命令

### 华为

查看生成树状态：

```bash
display stp
```

查看某接口生成树状态：

```bash
display stp interface GigabitEthernet 0/0/1
```

查看 MSTP 配置：

```bash
display stp region-configuration
```

开启 STP：

```bash
stp enable
```

把交换机优先级调低，提升其成为根桥的概率：

```bash
stp priority 4096
```

把接口配置为边缘端口：

```bash
stp edged-port enable
```

配置根保护：

```bash
stp root-protection
```

### 思科 Cisco

查看生成树状态：

```bash
show spanning-tree
```

查看某 VLAN 的生成树信息：

```bash
show spanning-tree vlan 10
```

查看某接口生成树状态：

```bash
show spanning-tree interface gigabitEthernet 0/1
```

启用快速生成树：

```bash
spanning-tree mode rapid-pvst
```

把交换机设为根桥优先：

```bash
spanning-tree vlan 10 root primary
```

把接入口设为边缘端口：

```bash
spanning-tree portfast
```

启用 BPDU Guard：

```bash
spanning-tree bpduguard enable
```

## 复习时容易写错的点

- 生成树的核心是“防环”，不是“包重复了再丢弃”
- 根桥是选举出来的，根端口和指定端口也是计算出来的
- MSTP 不是单纯“更高级的 STP”，它的重要特点是支持多实例
- 是否默认开启生成树，要看具体厂商和设备型号，不要写得太绝对
