大家好,我是程序员思绪

交换机刚启动时为什么会把单播帧发送到多个端口?两个端口明明都亮着,主机为什么仍然互相不通?为了冗余连接两条链路后,网络为什么可能瞬间被广播流量淹没?理解这些问题,需要把以太网帧、MAC 地址表、VLAN、Trunk 和生成树协议串成一套完整模型。

本文从交换机如何学习与转发帧开始,解释广播域、802.1Q VLAN、跨 VLAN 路由、二层环路、STP 和链路聚合,并给出常见二层故障的排查路径。

1. 以太网帧承载了什么

以太网在局域网中以帧为单位传输数据。常见 Ethernet II 帧包含以下字段:

字段 常见长度 作用
目标 MAC 6 字节 标识当前链路中的接收方
源 MAC 6 字节 标识当前链路中的发送方
EtherType 2 字节 指明上层协议,如 IPv4、IPv6、ARP
数据载荷 46 到 1500 字节 承载上层数据
FCS 4 字节 检测传输过程中的比特错误

网卡发送帧前还会加入前导码等物理层信息,它们通常不作为抓包工具展示的帧内容。接收网卡发现 FCS 错误时一般直接丢弃,操作系统和抓包工具未必能看到该帧。

目标 MAC

源 MAC

以太网类型

数据载荷

帧校验序列

MAC 地址长度为 48 位。普通单播 MAC 标识一个接口,广播 MAC 为 ff:ff:ff:ff:ff:ff,组播 MAC 则代表一组接收者。MAC 只用于当前二层网络,路由器转发 IP 包时会重新生成下一段链路的源和目标 MAC。

2. 交换机如何学习 MAC 地址

交换机不会预先知道每台主机连接在哪个端口。它通过进入帧的源 MAC 学习位置,并记录在 MAC 地址表中。

主机 B 交换机 主机 A 主机 B 交换机 主机 A 学习 MAC A 位于端口一 学习 MAC B 位于端口二 从端口一发送帧 源 MAC 为 A 首次未知单播向其他端口泛洪 从端口二回复 源 MAC 为 B 根据表项定向转发到端口一

MAC 表项会老化。如果主机长时间不发送帧,动态表项被删除;下一次发往它的帧可能再次成为未知单播并被泛洪。

交换机根据目标 MAC 执行三种基本动作:

交换机收到帧

学习源 MAC 与入口端口

目标 MAC 是广播或组播吗

向同一 VLAN 其他端口泛洪

MAC 表中存在目标吗

作为未知单播泛洪

目标端口等于入口端口吗

过滤该帧

仅向目标端口转发

“泛洪”不是把帧发送到整张互联网,而是发送到当前 VLAN 中除入口端口外的合适端口。VLAN 划定了二层泛洪的边界。

3. 冲突域与广播域

早期集线器把收到的电信号复制到所有端口,所有设备共享同一个冲突域。现代全双工交换以太网中,每个交换机端口通常是独立冲突域,不再运行传统 CSMA CD 竞争机制。

广播域则是广播帧能够到达的范围。默认情况下,一台二层交换机上的同一 VLAN 属于一个广播域。路由器或三层接口不会普通地转发二层广播,因此可以隔离广播域。

设备或机制 冲突域 广播域
集线器 所有端口共享 所有端口共享
二层交换机 每端口独立 同一 VLAN 共享
VLAN 不改变每端口冲突域 每个 VLAN 独立
路由器 每接口独立 每接口隔离

广播域过大会增加 ARP、邻居发现和服务发现等广播或组播流量的影响范围,也会放大环路故障。VLAN 可以控制范围,但过度拆分会增加地址规划、路由和策略复杂度。

4. VLAN 如何实现逻辑隔离

VLAN 允许在同一套物理交换网络上建立多个逻辑二层网络。同一 VLAN 内可以直接交换帧,不同 VLAN 之间必须经过三层转发。

Trunk 承载 VLAN 10 和 20

员工主机 VLAN 10

接入交换机

访客主机 VLAN 20

汇聚交换机

员工服务器 VLAN 10

访客出口 VLAN 20

Access 端口

Access 端口通常连接终端设备,只属于一个数据 VLAN。终端发送的普通无标签帧进入端口后,交换机在内部把它归入该 VLAN;帧离开 Access 端口时通常不携带 802.1Q 标签。

Trunk 端口

Trunk 端口用于交换机之间、交换机与路由器之间或连接支持 VLAN 的服务器。它可以承载多个 VLAN,通常使用 IEEE 802.1Q 标签标明帧属于哪个 VLAN。

802.1Q 标签中最重要的信息包括:

字段 作用
TPID 表示这是带 802.1Q 标签的帧
PCP 二层服务质量优先级
DEI 拥塞时的丢弃倾向标识
VLAN ID 12 位 VLAN 编号

VLAN ID 并不等于 IP 子网,但工程中通常让一个 VLAN 对应一个 IP 子网,以保持广播边界、网关和安全策略一致。

5. Native VLAN 与 VLAN 不一致

部分 Trunk 配置允许一个 Native VLAN 的帧不携带标签。链路两端若 Native VLAN 配置不同,同一无标签帧可能被归入不同 VLAN,造成流量串入错误广播域,甚至形成生成树异常。

常见 VLAN 配置问题包括:

  • Access 端口被放入错误 VLAN;
  • Trunk 两端允许的 VLAN 列表不一致;
  • 一端为 Access,另一端为 Trunk;
  • Native VLAN 不一致;
  • VLAN 已创建但没有在上联链路放行;
  • 虚拟化宿主机与物理交换机对标签处理的约定不一致。

排查时不能只看物理链路灯。端口 Up 只代表物理层或链路层部分条件满足,不代表帧被归入了正确 VLAN。

6. 不同 VLAN 如何通信

VLAN 10 与 VLAN 20 是两个独立广播域,二层交换机不会直接在它们之间转发帧。通信必须经过路由器子接口或三层交换机的 SVI。

VLAN 20 主机 VLAN 20 网关 三层转发设备 VLAN 10 网关 VLAN 10 主机 VLAN 20 主机 VLAN 20 网关 三层转发设备 VLAN 10 网关 VLAN 10 主机 将远端数据发送给本 VLAN 网关 取出 IP 包并查询路由 转发到 VLAN 20 三层接口 解析目标 MAC 并发送新帧 回包按反向路由返回

源主机发送给异网段目标时,以太网帧的目标 MAC 是本 VLAN 网关,IP 包的目标 IP 仍是远端主机。路由设备进入 VLAN 20 后重新封装,目标 MAC 才变成主机 B 的 MAC。

跨 VLAN 不通时应同时检查:

  1. 终端地址、掩码和默认网关;
  2. Access VLAN 与 Trunk 放行列表;
  3. SVI 或路由器子接口状态;
  4. 三层路由表;
  5. ACL、防火墙和回程路径。

7. 二层环路为什么危险

为提高可用性,网络常部署冗余链路。如果二层拓扑中出现环路,而没有协议阻断冗余路径,广播帧和未知单播可能被交换机无限复制。

交换机一

交换机二

交换机三

广播帧进入网络

以太网帧没有类似 IP TTL 的逐跳生存时间。环路中的帧不会自然过期,会造成:

  • 广播风暴占满链路和交换机处理能力;
  • 同一源 MAC 从不同端口反复出现,MAC 表持续漂移;
  • 大量重复帧到达主机;
  • 交换机管理面失联,正常业务中断。

物理冗余本身不是错误,关键是必须由 STP、链路聚合或受控的多路径机制决定哪些链路可以转发。

8. STP 如何消除逻辑环路

生成树协议 STP 通过选举根桥、计算到根桥的最佳路径,并阻塞部分冗余端口,把有环物理拓扑变成无环逻辑树。

交换机交换 BPDU

选举桥 ID 最小的根桥

非根交换机选择根端口

每个网段选择指定端口

其他冗余端口进入阻塞状态

形成无环转发拓扑

链路或拓扑发生变化吗

保持当前转发状态

根桥如何选举

桥 ID 由优先级和 MAC 等信息组成,数值最小者成为根桥。如果所有设备保持默认优先级,根桥可能由 MAC 地址偶然决定,导致流量绕行。生产网络通常显式指定主根和备根。

端口角色

  • 根端口:非根交换机到根桥开销最小的端口;
  • 指定端口:某个网段上负责向根桥方向转发的端口;
  • 备用或阻塞端口:为防止环路而暂不转发普通数据帧。

RSTP 在传统 STP 基础上改进了端口角色和握手机制,通常能更快收敛。收敛仍不是零时间,链路切换期间可能出现短暂丢包和 MAC 重新学习。

边缘端口保护

连接普通终端的边缘端口可以快速进入转发状态,但应配合 BPDU Guard。当边缘端口意外收到 BPDU 时,将其关闭或置为错误状态,以阻止用户私接交换机改变生成树拓扑。

9. 链路聚合与 LACP

两台设备之间有多条物理链路时,不能简单并联。链路聚合把多条兼容链路组成一个逻辑接口,在提供冗余的同时允许基于哈希分担流量。

成员链路一

成员链路二

聚合链路

交换机 A

逻辑聚合接口

交换机 B

LACP 用于协商聚合成员并检查对端一致性。成员端口的速率、双工、VLAN 模式和允许列表等关键参数必须兼容,否则端口可能无法加入聚合组。

链路聚合并不保证一个 TCP 连接同时使用全部成员带宽。设备通常根据源和目标 MAC、IP、端口等字段计算哈希,让同一流保持在同一成员链路上,以避免乱序。多流并发时才更容易利用聚合总带宽。

10. 二层安全风险

MAC 地址表泛洪

攻击者发送大量不同源 MAC 的帧,可能填满交换机 MAC 表,使更多单播变成未知单播并被泛洪。端口安全可以限制允许学习的 MAC 数量或绑定合法地址。

ARP 欺骗

ARP 本身缺少身份认证。攻击者发送伪造 ARP 响应,可能让主机把网关 IP 映射到攻击者 MAC。DHCP Snooping 与 Dynamic ARP Inspection 可以结合租约绑定验证 ARP 信息。

非法 DHCP 服务器

攻击者向客户端提供错误网关或 DNS。DHCP Snooping 将连接合法服务器的端口标记为可信,只允许可信方向发送服务器响应,并生成 IP、MAC、VLAN 与端口绑定信息。

这些能力依赖正确的拓扑和信任边界。把所有上联端口都设为可信会削弱保护效果,配置前应明确终端端口、服务器端口和交换机互联端口的角色。

11. 二层网络排障流程

主机通信异常

接口和链路是否正常

检查线缆 光模块 速率和双工

端口 VLAN 是否正确

修正 Access 或 Trunk 配置

MAC 地址是否正确学习

检查源帧 VLAN 与端口安全

STP 是否阻塞或拓扑变化

确认根桥 端口角色和环路

跨 VLAN 路由是否正常

检查网关 路由和访问策略

抓包并检查上层协议

第一步:物理层与接口计数

检查端口是否 Up、速率和双工是否一致,以及 CRC、丢包、错误帧、光功率等计数。CRC 持续增加常与线缆、光模块、接口或双工问题有关。

第二步:确认 VLAN 路径

沿主机到网关或对端的每一跳核对:接入口 VLAN、上联 Trunk 允许列表、Native VLAN、聚合口配置。只要一段没有允许目标 VLAN,帧就无法通过完整路径。

第三步:检查 MAC 学习

确认交换机是否在预期 VLAN 和端口学到主机 MAC。如果同一 MAC 在多个端口间快速移动,应优先怀疑环路、虚拟机迁移配置或错误聚合。

Linux 主机侧可使用:

ip link
ip -s link
ip neigh
bridge link
bridge vlan show
tcpdump -eni any arp

交换机命令因厂商不同而异,核心信息通常包括接口状态、VLAN、MAC 地址表、生成树、聚合组、错误计数和日志。

12. 常见现象与定位方向

现象 常见原因 优先检查
接口 Up 但无法获取地址 VLAN 错误、DHCP 路径或安全策略 Access VLAN、Trunk、DHCP Snooping
同 VLAN 主机不能互通 端口隔离、MAC 学习或掩码错误 MAC 表、VLAN、主机配置
同 VLAN 正常,跨 VLAN 失败 网关、SVI、路由或 ACL 三层接口和回程路由
网络周期性整体抖动 环路、STP 重算或链路不稳定 STP 日志、MAC 漂移、接口 flap
单流无法跑满聚合带宽 哈希保持同一流在单成员链路 聚合哈希与多流测试
某些 VLAN 能通过 Trunk,另一些不能 允许列表不一致 Trunk 两端配置
抓包看到大量重复广播 二层环路或异常终端 STP 状态和广播来源

13. 常见误区

  1. 交换机只看目标 MAC,不学习源 MAC。 交换机根据源 MAC 学习位置,再依据目标 MAC 决定转发。
  2. 未知单播会被直接丢弃。 普通交换机通常在当前 VLAN 内泛洪未知单播。
  3. VLAN 之间完全不能通信。 它们不能直接二层转发,但可以通过受控的三层路由通信。
  4. 端口灯亮表示 VLAN 配置正确。 物理链路正常不能证明逻辑 VLAN 路径正确。
  5. 两条并行网线一定能提高带宽。 未配置聚合或 STP 时,可能形成环路或让一条链路被阻塞。
  6. STP 阻塞端口说明链路浪费,应关闭 STP。 阻塞是为了保留冗余同时避免二层环路。
  7. 聚合后单连接带宽等于所有成员之和。 单流通常只映射到一条成员链路。

14. 总结

交换机通过源 MAC 学习位置,根据目标 MAC 执行定向转发、过滤或泛洪。VLAN 把一套物理网络划分为多个广播域,Access 端口连接终端,Trunk 使用 802.1Q 承载多个 VLAN,不同 VLAN 之间则需要三层设备转发。

冗余链路带来可用性,也带来二层环路风险。STP 构建无环逻辑拓扑,链路聚合则把多条受控链路组成一个逻辑接口。排障时应沿着“物理接口、VLAN 路径、MAC 学习、STP 状态、三层网关”的顺序检查,避免把端口 Up 误认为整条通信路径已经正常。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐