模块五 · 链路层和局域网
环路与 STP
上一章讲到二层帧没有 TTL,连成环就会广播风暴。可现实中又需要冗余链路(一根线断了还能通)—— 要冗余就必然成环。这个矛盾怎么解?靠生成树协议(STP)。
本章要解决的问题:上一章讲到二层帧没有 TTL,连成环就会广播风暴。可现实中又需要冗余链路(一根线断了还能通)—— 要冗余就必然成环。这个矛盾怎么解?靠生成树协议(STP)。
本章的证据来源:⚠️ 本章没有历史实测记录。 本机只有一台家用路由器,没有可管理的交换机组,无法构造或观察二层环路。本章内容标注为标准/原理(IEEE 802.1D / 802.1w),并在文中标明哪些是推断。
先从一个例子理解概念
为了网线断一根仍能通,你可能接两条备用线路;但多出来的线路也可能让帧绕圈。生成树是在保留备用线路时防止二层循环的一种办法。
多留一条路:冗余与环路
备用线路叫冗余;线路连成可反复绕行的圈叫环路。冗余是目标,环路是需要处理的风险,二者不能简单等同。
重复转发挤满网络:广播风暴
广播在环中循环并泛洪,可产生大量重复帧并占用资源,叫广播风暴。这是网络负载异常,不是天气现象。
选出无环的工作路径:STP
STP(生成树协议)让交换设备选一组无环的转发路径,其余冗余端口暂不转发普通数据。改选路径后恢复稳定,叫收敛。
交换机之间商量:BPDU
交换机用BPDU(桥协议数据单元)交换生成树信息。根桥是选定的树根设备,根端口是非根设备朝向根桥的一个选定端口;它们是角色名。
下面再用这些概念看原理、命令和结果。规范与官方资料列在本章末尾,类比只帮助理解,不代替协议规则。
先把"为什么会瘫痪"说清楚
《以太网帧》那一章讲过帧的格式:目的 MAC、源 MAC、类型、数据、FCS。这里面没有任何"跳数"字段。
对比一下三层:
| 有没有防环机制 | 后果 | |
|---|---|---|
| IP(三层) | 有 TTL,每过一台路由器减 1,减到 0 就丢弃 | 环路导致丢包,但不会无限循环 |
| 以太网(二层) | 没有 | 环路导致帧可反复转发,泛洪可造成大量副本,直到拓扑改变、过滤或资源限制使其停止 |
于是就有了这个场景:
两台交换机之间不小心插了两根网线(或者三台交换机连成一个三角):
A ────── B
│ │
└─── C ──┘
某个设备发一个广播帧:
A 收到 → 从两个口都发出去 → B 和 C 各收到一份
B 收到 → 也转发给 C 和 A → ...
每转发一次,副本数量翻倍几秒钟之内,这一个广播帧就会产生几十万个副本,把交换机的 CPU、内存和链路带宽全部占满。整个局域网瘫痪。这叫广播风暴。
环路带来的三个问题
| 问题 | 表现 |
|---|---|
| 广播风暴 | 帧的在有分支的泛洪拓扑中副本可能快速增长;具体增长依赖拓扑,带宽和 CPU 被打满 |
| MAC 地址表震荡 | 同一个 MAC 从两个不同的口都被学到,交换机反复改写表项,转发混乱 |
| 重复帧 | 目标设备收到多个相同的帧副本 |
但冗余又是必需的
如果为了防环就禁止冗余链路,会掉进另一个坑:
服务器 ──── 交换机这一根线断了,整台服务器就下线了。企业网络无法接受单点故障。
所以需求是矛盾的:要冗余(成环),又不能真的成环。
STP 的答案很巧妙:物理上保留所有链路,逻辑上把环剪断。
STP 怎么工作:三步选举
STP(Spanning Tree Protocol,生成树协议)的目标是:在所有交换机之间算出一棵没有环的树,把多余的口逻辑上封掉(但物理上仍然连着)。
第一步:选出一个"根桥"
所有交换机互相比较一个叫桥 ID 的值(= 优先级 + MAC 地址),最小的当根桥(Root Bridge)。
桥 ID 的比较顺序:先比优先级(默认 32768),优先级相同再比 MAC 地址根桥是这棵树的"树根"。可以把它理解成"全网的逻辑中心"。
第二步:每台非根桥选出自己的"根端口"
每台非根交换机,从自己的所有端口中选出一个"到根桥开销最小"的口,叫根端口(Root Port)。
开销(Cost)和链路速率有关:链路越快,开销越小。
第三步:每条链路选出一个"指定端口"
每条链路上,比较两端的"到根桥的开销",开销小的那台交换机的那个口成为指定端口(Designated Port),负责这条链路的转发。
最后:剩下的口被阻塞
经过上面三步,每个网段都有一个明确负责转发的端口,未被选为根端口或指定端口、且存在冗余转发风险的端口进入阻塞;不能把非根桥自己的根端口也说成阻塞。
结果:物理上是带环的拓扑
逻辑上变成了一棵树 —— 没有环,也就没有广播风暴关键点:被阻塞的端口并没有被关闭,它只是不转发数据帧,但仍然在接收 BPDU 报文。 一旦主链路断了,它可以在几秒到几十秒内被激活,接替工作 —— 这就是冗余的目的达到了。
端口状态与收敛时间
经典 STP 的端口要经过几个状态才能开始转发:
| 状态 | 行为 | 持续时间 |
|---|---|---|
| Blocking | 不转发数据,只收 BPDU | — |
| Listening | 开始参与选举,仍不转发 | 约 15 秒 |
| Learning | 学习 MAC 地址,仍不转发 | 约 15 秒 |
| Forwarding | 正常转发数据 | — |
所以经典 STP 的收敛时间大约 30~50 秒。 相关受影响路径可能中断,并非全部网络必然断开;实际时间还取决于拓扑、计时器和快速/边缘端口机制。
BPDU 是什么? 交换机之间每 2 秒交换一次的报文,用来交换桥 ID、开销等信息,完成选举和故障检测。可以理解成"交换机之间的心跳"。
本机为什么观察不到
诚实地说明:
本机没有可管理的交换机组。 家里只有一台路由器(内置交换模块 + 无线接入点),所有设备呈星型连接,物理上不构成环:
┌── 本机
路由器 ┼── 邻居 A
└── 邻居 B星型拓扑天然无环,STP 在这里无事可做。
会不会有隐形环路? 理论上如果用户自己把两根网线插回同一台路由器的两个 LAN 口,就构成环了。但家用设备是否支持并启用STP需查型号和配置,不能假定会自动保护这种接线。不要在业务网络中制造环路。本机环境里没有观察到任何异常(网络工作正常,没有广播风暴的迹象)。
要真正观察 STP,你需要:
- 两台以上支持 STP 的可管理交换机
- 或者用 GNS3 / EVE-NG 之类的网络模拟器(可以在软件里跑真实的交换机镜像)
- 观察手段是交换机的
show spanning-tree命令,或抓 BPDU 报文
本教程不编造这部分数据。 你在实际工作中接触到可管理交换机时,show spanning-tree 的第一行就会告诉你"谁是根桥"。
常见误解
误解一:"STP 是为了防止数据包绕圈"
它主要防的是广播风暴。单播帧在成环的拓扑里虽然也会绕圈,但因为有转发表(而且会被泛洪反复刷新),破坏力远不如广播帧 —— 广播帧持续转发和泛洪可产生大量副本,增长取决于拓扑,这是指数增长。
误解二:"为了更快,多插几根网线就行"
可能形成环路或被防环机制阻塞。 在同一对交换机之间插两根网线,如果没有配置链路聚合(把多根线绑成一条逻辑链路),STP 会把其中一根阻塞掉 —— 你并没有获得额外带宽,只是得到了一条备用链路。想要叠加带宽必须配置链路聚合(LACP)。
误解三:"STP 是路由器的功能"
是交换机的功能,工作在二层。纯三层接口不运行二层STP;路由器若包含桥接/交换模块,该模块仍可能需要防环。三层也可发生路由环路,TTL只限制单个包循环,不保证业务正常。
误解四:"STP 阻塞的端口等于关掉了"
不是。被阻塞的端口仍然可接收和处理BPDU,随时准备在拓扑变化时接管。这是"冗余能用"的关键 —— 如果真关掉了,就没法自动切换了。
本章小结
| 结论 | 类型 |
|---|---|
| 二层帧没有 TTL,成环会导致广播风暴 | 标准 |
| 环路的三个问题:广播风暴、MAC 表震荡、重复帧 | 标准 |
| STP 的目标是物理保留冗余、逻辑剪断环路 | 标准 |
| 三步选举:选根桥 → 选根端口 → 选指定端口,其余阻塞 | 标准 |
| 被阻塞的端口不转发数据,但仍接收 BPDU,可随时接管 | 标准 |
| 经典 STP 收敛约 30~50 秒,RSTP 降到秒级 | 标准 |
| BPDU 每 2 秒交换一次,用于选举与故障检测 | 标准 |
| 本机为星型拓扑、无可管理交换机组,无法实测 STP | 实测(环境限制) |
| 未观察到本机存在广播风暴迹象 | 实测 |
自测题
6 题 · 先自己答,再展开对照
为什么二层网络连成环会瘫痪,而三层网络不会?根本区别是什么字段?
基本以太网帧没有TTL,循环和泛洪可形成风暴;IP的TTL限制单个包的转发次数,但三层环路仍可造成大量丢包、占用带宽和业务中断。既然环路有害,为什么还要保留冗余链路?STP 是怎么同时满足这两个要求的?
因为单点故障不可接受 —— 一根线断了业务就中断。STP 的做法是物理上保留所有链路,逻辑上把多余的端口阻塞掉:这样平时没有环(不会广播风暴),一旦主链路故障,被阻塞的端口能在几十秒内激活接管,冗余的目的就达到了。用"逻辑上剪断"换来了"物理上冗余"。STP 选出根桥之后,其余端口为什么是"阻塞"而不是"关闭"?
因为要保留它作为备用。 被阻塞的端口仍然在接收 BPDU 报文,持续监听拓扑变化。如果把它彻底关闭,主链路故障时就没法自动切换了,冗余就失去了意义。"阻塞但不关闭"正是 STP 能提供冗余的关键。你在两台交换机之间插了两根网线,希望带宽翻倍。实际会发生什么?
带宽不会翻倍。 如果没有配置链路聚合(LACP),STP 会把其中一根标记为冗余并阻塞掉 —— 你得到的是"一条工作链路 + 一条备用链路",而不是双倍带宽。想要叠加带宽必须把两根线绑定成一条逻辑链路(链路聚合),这样从上层看就是一条更快的链路。经典 STP 的收敛时间大概多久?为什么现代网络很少用它?
大约 30~50 秒(Blocking → Listening 15 秒 → Learning 15 秒 → Forwarding)。这个时间在现代网络里太长了 —— 拔一根线要等半分钟才能恢复,业务上无法接受。所以现在实际部署的基本是 RSTP(IEEE 802.1w)或 MSTP,通过预先协商备用端口的角色,把收敛时间压到秒级。家用路由器需要 STP 吗?
若家用设备存在二层环路风险,需要防环设计或对应机制;是否支持并启用STP由设备决定,不能保证两个LAN口互接会自动被阻塞。
参考资料与适用范围
修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。