CS 168 · LECTURE 17 · 2026-10-22 · 应用与端到端
以太网用 MAC 学习减少无谓广播,生成树则主动关闭部分冗余链路,换取一个无环的二层转发拓扑。
版本快照:Fall 2026 官方课表与在线教材,核对日期 2026-09-02;官网仍标注 under construction,日期与政策可能变化。
交换机没有 TTL 可依赖时,为什么一个短暂二层环路会迅速演变成广播风暴?
收到源 MAC=S 的帧,交换机把 S 与入端口绑定并刷新老化时间。对目的 D,若表中有 D 则单播到对应端口;若未知或广播,则除入端口外泛洪。
学习来源是 source,不是 destination,因为入端口提供了“返回 S 的下一跳”证据。主机移动后,新的源帧会更新绑定;老化让沉默旧位置最终消失。
二层帧通常没有类似 IP TTL 的逐跳寿命。未知单播或广播在环中被复制,多个副本又导致 MAC 表在不同端口间抖动,最终占满链路与交换机处理能力。
冗余链路对容错有价值,不能简单拔掉。需要控制平面选择当前无环子集,并在故障后重新启用备用路径。
桥交换 BPDU,比较 root ID、到根路径成本、发送桥 ID 与端口 ID。全网选出最小 root,每个非根桥选一条 root port,每个 LAN segment 选 designated port,其余阻塞。
树上任意两点只有一条路径,广播不会循环。代价是部分链路闲置且路径可能次优;数据中心通常采用三层 ECMP 或更现代二层方案利用多路径。
在同一子网内,主机用 ARP 找到目的 MAC并经交换机转发;跨子网时,帧目的 MAC 是默认网关,IP 目的仍是远端主机。路由器拆掉旧帧后进入三层转发。
这解释了为什么 traceroute通常看不到普通二层交换机:它们不递减 IP TTL,也不作为三层 hop 产生 ICMP。
MAC 学习和 STP 都依赖拓扑随消息变化的状态。
给四交换机环,先模拟未知单播泛洪,再选 A 为 root 跑 STP;断开一条树边后说明哪个阻塞端口可能转为转发。
检查:普通二层交换机为什么通常不会显示在 traceroute 中?
未知目的 MAC 触发 flood
未知目的 MAC 触发 flood;source learning 更新 MAC→port;STP 使冗余拓扑只保留无环 forwarding tree。
检查:判断一个实现分支是否必要,最有力的问题是什么?
为三交换机环手推一轮 source learning 与 blocked port。
答案必须出现 packet/message、local state/table、触发 event、after state 与 output;只给定义不算完成。
S1、S2、S3 构成三角形,H1 接 S1,H2 接 S3;STP 已阻塞 S3→S1 的冗余口。
| 事件 | 入端口 | table before | 学习 / 查表 / 输出 |
|---|---|---|---|
| H1→H2 到 S1 | host | 空 | 学 H1→host;H2 unknown,泛洪 |
| 到 S2 | S1 | 空 | 学 H1→S1;向 S3 |
| 到 S3 | S2 | 空 | 学 H1→S2;交付 H2;blocked 口不发 |
| H2 回复 | host | H1→S2 | 学 H2→host;精确单播 |
从源 MAC 反向学习位置,再用目的 MAC 查输出。STP 保持 active forwarding topology 无环且连通。
广播/未知单播没有 IP TTL,帧循环且每轮复制;同一源 MAC 从不同端口抵达又造成 MAC flapping。阻塞冗余边不是删除物理链路,而是换取稳定的逻辑无环图。
| 状态 | 事件 | 更新 | 输出 |
|---|---|---|---|
| MAC table | frame arrives | source→ingress + expiry | unicast/flood/filter |
| root ID | 更优 BPDU | 采用更小 tuple | 通告新 best |
| root port | cost 变化 | 选到 root 最佳口 | 改变角色 |
| port state | 收敛 | 冗余 blocking | 数据面无环 |
检查:端口 3 收到源 X,能学习什么?
检查:二层环为何快速恶化?
检查:blocked link 实际如何?
正文是 CourseStack 的中文解释与重新绘制的教学例子;官方页面负责课程原始定义,历史仓库只提供你的实现证据。