☰
以太网交换机工作原理与二层排障:MAC地址表、VLAN和防环
2026/10/26 19:56:23 网站建设 项目流程

说个很常见的场景:机房搬迁,几台交换机拔了电重新上架,线序全乱,插回去之后网络时通时不通,ping 丢包严重,监控上还能看到端口流量像心电图一样抖。现场的人第一反应往往是怀疑光模块、怀疑线缆、怀疑运营商,折腾一圈最后发现是两根网线接成了环路,交换机 MAC 地址表被反复刷写。这类问题排查不下去的根因,通常不是工具不够,而是对以太网交换机工作原理的那点理解只停留在“它会自己学习”这一句话上。

以太网交换机工作原理这件事,说白了就三件事:帧进来以后靠什么决定往哪个口送、这个决定依赖的数据从哪来、这份数据什么时候失效。把这三件事拆透,前面那种环路、丢包、时通时不通的问题,大部分能在十分钟内定位到端口级别。这篇内容面向的是刚接触网络运维的朋友、需要做小型网络规划的工程师,以及准备面试或考试想真正搞懂二层转发的人。我会从冲突域讲起,一路说到 MAC 地址表结构、三种转发模式的时延账、VLAN 与链路聚合的实际影响,再给一套可以照着敲的观察实验和一份踩坑速查表。基础薄弱的可以顺着读,做过几年运维的可以直接跳到第 3 章和第 6 章。

1. 从冲突域到交换域:交换机到底解决了什么根本问题

1.1 集线器时代的共享介质与冲突退避

要理解交换机,得先把时间拨回到共享式以太网。早期的集线器本质是个物理层的中继设备,任何一端口收到的电信号会被整形放大后复制到其余所有端口。也就是说,所有接在同一台集线器上的设备,共用一条逻辑上的传输介质。同一时刻只允许一台设备发送,两台同时发就会产生电信号叠加,也就是冲突。冲突发生后双方的数据都作废,需要各自退避一个随机时间再重发,这套机制叫 CSMA/CD。

问题在于,冲突的概率随设备数量上升得非常快。设备越多,碰撞越多,重传越多,有效吞吐越低。而且集线器只能工作在半双工模式,发送的时候不能接收,接收的时候不能发送,物理上就砍掉了一半的理论带宽。一台 100Mbps 的集线器挂十台机器,平均下来每台能分到的可能只有几兆。更麻烦的是冲突域无边界的扩散,一台机器网卡故障疯狂发包,整台集线器上所有设备一起瘫。这就是所谓的冲突域和广播域完全重合的状态。

交换机做的第一件事就是把冲突域切开。每个端口就是一个独立的冲突域,端口之间互不影响,A 口和 B 口可以同时收发,因为它们走的是交换机内部独立的通道而不是共享的同一条线。全双工模式下发送和接收各用一对线,收发互不干扰,理论上带宽翻倍。这一步的改变是革命性的:从共享介质变成了独享通道。

1.2 硬件转发为什么能做到线速

第二件事是转发方式的改变。集线器不做任何判断,来什么转发什么。交换机要看帧头里的目的 MAC 地址,再决定从哪个口送出去。这个判断如果靠 CPU 软件逐包处理,一个千兆口满负荷就是每秒 148 万个 64 字节小包,CPU 根本忙不过来。所以真实的交换机用的是专用的交换芯片,把 MAC 地址表存在芯片内部的高速存储里,查表动作由硬件在固定时钟周期内完成。

这里有个概念叫线速转发。一台标称 24 口千兆的交换机,它的交换容量需求是 24 × 1Gbps × 2(全双工收发)= 48Gbps,包转发率需求是 24 × 1.488Mpps = 35.7Mpps。芯片能不能在满配情况下做到所有端口同时收发不丢包,就是线速与否的分界线。这也是为什么便宜的交换机会标注“交换容量 48Gbps”但这种参数要看背板带宽和包转发率是否匹配,有些设备标称端口千兆,实际背板只有 16Gbps,端口全忙时内部就会出现拥塞丢包。

从运维角度看,理解这一层的意义在于:交换机的转发能力是硬件决定的、是确定性的,而它做判断所依赖的 MAC 地址表是动态学习的、是不确定的。所有二层故障几乎都出在这张动态表上,而不是硬件转发能力上。你排查问题时盯住 MAC 表和端口状态,方向就不会错。

1.3 二层转发与三层路由的边界

很多人会把交换和路由混在一起谈。交换机的本职是在同一个广播域内根据 MAC 地址转发帧,它不关心 IP。路由器的工作是在不同网段之间根据 IP 地址选路。三层交换机把两者揉在了一起,但它内部仍然分成两层处理:同网段流量走二层硬件转发,跨网段流量才上到三层引擎去做路由查表。

这个边界很重要。当你在一个二层网络里遇到“跨网段能通、同网段不通”或者“同网段通、跨网段不通”的情况,故障定位的层次完全不同。前者要看路由和网关,后者要看 MAC 学习、VLAN 划分、端口状态。我见过不少新手拿着三层交换机的路由表去查一个二层环路问题,查了半天没头绪,就是没把层次分清楚。

2. MAC 地址表:交换机所有决策的唯一依据

2.1 表项里到底存了什么

MAC 地址表有时候也叫 CAM 表,虽然严格来说不同实现存放介质不一样。一条典型的动态表项包含这些字段:MAC 地址(48 位)、所属 VLAN(这个字段很多人忽略,但它是 VLAN 间隔离的基础)、出端口号、表项类型(动态学习/静态配置/黑洞)、老化时间戳。

为什么要带 VLAN 字段?因为同一台交换机上不同 VLAN 里可以存在完全相同的 MAC 地址,这在虚拟机环境里很常见。如果表项只记 MAC 不记 VLAN,那么 VLAN 10 里某台设备的 MAC 被学到 VLAN 20 的端口上,转发逻辑就全乱了。所以完整的查表键值是 VLAN + MAC,缺一不可。这也是排查“同一 MAC 出现在两个 VLAN”这类问题时必须看 VLAN 字段的原因。

静态表项是人工绑定的,不会老化,通常用于关键服务器或者防止 MAC 欺骗。黑洞表项则相反,它的作用是让某个 MAC 的帧直接被丢弃,常用于抑制攻击。动态表项的容量因设备而异,入门机型可能只有 8K 条,中高端能到 32K 甚至更多。这个数字不是随便定的,它要能覆盖下挂所有设备的 MAC 数量,超了就会出现表项抖动。

2.2 学习、转发、泛洪、过滤四个动作的判定逻辑

帧从某个端口进来,交换芯片做这个顺序的判断。第一步学习:取出帧的源 MAC,连同入端口和 VLAN 写入表项,如果这个 MAC 已存在但端口不同,就更新端口并刷新时间戳,如果端口相同只刷新时间戳。注意,学习发生在转发决策之前,这是很多人没意识到的细节,意味着一台设备发出的第一个帧就能被学到。

第二步查目的 MAC。查到了,且出端口不是入端口,就从这个口转发出去,这是单播转发。查到了,但出端口等于入端口,直接丢弃,这叫过滤,因为目的设备就在同一个端口的方向上,不需要绕一圈。这也是为什么同端口下的两台设备互访,交换机只做转发不做回环。第三步,查不到,就是未知单播,此时向该 VLAN 内除入端口外的所有端口复制一份发出去,这叫泛洪。第四步,如果目的 MAC 是广播地址全 F 或者是组播地址,同样按泛洪规则处理,除非配置了组播侦听。

这四个动作构成了交换机的全部行为模型。理解了这个模型,你就能解释几乎所有二层现象。比如抓包看到某个单播帧同时出现在多个端口,那不是故障,是交换机还没学到那个目的 MAC,正在泛洪。等目的设备回了一个帧,表项建立,后续就变成精准转发了。

2.3 老化时间为什么默认是 300 秒

动态表项不能永久保留,否则设备下线、端口换接、IP 迁移之后表项就是错的。所以要有老化机制。主流默认值是 300 秒,也就是 5 分钟。这个数字的取舍有讲究:太短,表项频繁失效,泛洪量上升,网络里广播和未知单播变多;太长,设备迁移后流量会打到错误端口,造成一段时间黑洞,同时表项容量压力增大。

300 秒这个值大致对应了大多数终端的活跃周期。一台在线设备通常几分钟内至少会发一次帧,比如 ARP 刷新、心跳、组播加入,所以表项会被持续刷新。真正空闲超过 5 分钟的设备,大概率也确实不活跃了,老化掉问题不大。在虚拟化环境或者终端特别密集的接入场景,有人会把老化时间调短到 60 到 120 秒,代价是泛洪增加,需要权衡。

注意:不要为了“让表项更稳定”把老化时间调到极大。端口迁移后旧表项残留会造成真实的数据黑洞,而且表项容量被僵尸条目占满会导致新设备学不进来,表现为新接入的机器完全不通。

3. 三种转发模式的时延账与选型

3.1 存储转发、直通、碎片隔离的差异

存储转发是现在绝大多数交换机的默认模式。帧完整收进缓冲区,校验 FCS 尾部,确认没有 CRC 错误、没有超短帧、没有超长帧,再查表转发。好处是坏帧不会扩散,支持不同速率的端口互联(千兆进百兆出,缓冲区可以降速),支持策略过滤。代价是引入了整帧的接收时延。

直通模式只读帧头的前 6 个字节,也就是目的 MAC 一到位立刻开始转发,不等帧收完。时延极低且基本固定,与帧长无关。但坏帧也会被转发出去,接收端网卡会把它们丢掉,等于把错误传播到了链路上,同时不同速率端口无法互联。碎片隔离是折中方案,读满前 64 字节再转发,因为以太网最小帧就是 64 字节,冲突产生的碎片帧小于 64 字节,这样就可以把它们滤掉,同时又比存储转发快。这三种模式在低端设备上可能通过配置切换,中高端设备基本都是纯存储转发。

3.2 时延到底差多少:算一遍就清楚了

计算基于一个前提:端口速率决定比特到达速度。千兆口每秒 10 亿比特,也就是每纳秒 1 比特(实际线路编码有开销,这里按有效速率粗算)。

存储转发的接收时延等于帧长除以速率。64 字节小帧 = 512 比特,在千兆口上就是 512ns,约 0.5 微秒。1518 字节标准大帧 = 12144 比特,约 12.1 微秒。再加上芯片查表、排队、串行化的固定开销,实际每跳增加十几微秒很常见。直通模式下这个数基本固定在 1 微秒以内,与帧长无关。

表 1 三种转发模式对比

转发模式开始转发的时机每跳时延(千兆口)坏帧处理异速率互联典型场景
存储转发整帧收完并校验约 0.5 至 12 微秒加固定开销丢弃,不扩散支持通用接入、汇聚
直通读到目的 MAC 即转通常小于 1 微秒转发,由终端丢弃不支持低时延计算场景
碎片隔离读满 64 字节约 0.5 微秒加固定开销滤掉冲突碎片有限支持已较少使用

这组数字的意义在于判断时延敏感业务的可行性。一次跨三层交换的转发,如果是 20 跳存储转发,按每跳 10 微秒算就是 200 微秒,对普通业务无感,但对某些高频交易或者工业控制场景就是大问题。反过来说,绝大多数办公网络完全没必要为了几十微秒去牺牲坏帧过滤能力,所以默认存储转发是正确的。

3.3 缓冲区与拥塞:被忽视的时延来源

比起转发模式那点微秒差,真正的时延大头在排队。一个千兆口往百兆口转发,出口速率不够,帧就会在缓冲区里排队。出口队列满了就开始丢包。这种场景在上下行带宽不对称的接入层非常常见,比如服务器千兆接入但上行只有百兆,多个用户同时拉数据就会造成端口级拥塞。

交换机的缓冲区是共享的,一块内存池被所有端口抢。有些端口突发流量大,就会把池子占满,导致其他端口的正常流量也被丢。所以中高端交换机支持每端口或每队列的缓冲区配额,还会配拥塞管理策略。这些配置在纯办公网里可以不碰,但在有视频监控、有备份大流量、有存储流量的网络里,不做配额很容易出现“白天没事、晚上备份时全卡”的现象。

4. 更细的交换逻辑:VLAN、链路聚合与防环

4.1 VLAN 标签的 4 个字节是怎么用的

VLAN 的隔离能力靠帧头里插入的 802.1Q 标签实现,一共 4 个字节。前 2 个字节是类型标识,固定值 0x8100,告诉设备“后面跟着的是标签信息”。后 2 个字节拆开来看:3 位优先级、1 位丢弃指示、12 位 VLAN ID。12 位意味着最多 4096 个编号,去掉 0 和 4095 两个保留值,实际可用 4094 个。

端口类型决定了标签怎么处理。接入端口接终端,收到的无标签帧打上本端口 PVID 的标签进入交换机,发出时剥掉标签,终端始终看不到标签。干道端口接交换机,允许多个 VLAN 通过,转发时保留标签。混合端口则两种都支持。配置不一致是 VLAN 不通的头号原因:一端是接入端口、另一端是干道端口,标签处理对不上,帧就被丢在出口。

注意:两个交换机互联时两端允许的 VLAN 列表必须包含业务 VLAN,且原生 VLAN 的配置要一致或明确规划。原生 VLAN 的帧在干道上是不打标签传输的,两端不一致会导致该 VLAN 的流量串到错误的 VLAN 里,现象是能通但串网段,比完全不通更难查。

4.2 链路聚合的哈希选路与带宽利用率

多条物理链路聚合成一条逻辑链路,能提供带宽叠加和冗余。但要注意,聚合后的流量不是平均分配的,而是靠哈希算法把业务流绑定到成员口。常见哈希因子包括源 MAC、目的 MAC、源 IP、目的 IP、源端口、目的端口,设备支持的组合方式各不相同。

关键是:同一条流必须固定走同一个成员口,否则会出现乱序,上层协议会认为是丢包。所以哈希必须对同一条流算出同一个结果。这带来一个现实问题:如果网络里只有两台主机之间的一条大流量,无论聚合了几条线,这条流永远只走其中一个成员口,带宽叠加完全无效。这就是“聚合了四条千兆,实际只跑到一吉”的经典现象。

要让聚合真正有效,需要流量五元组足够分散,比如多台客户端访问多个服务端。哈希算法的选择也要匹配业务特征,如果主要流量是单一 IP 的大量连接,那就应该把源端口或目的端口纳入哈希因子。不同厂商默认的哈希因子不一样,做聚合前最好先问清楚或者实际压测一下。

4.3 生成树协议为什么需要,以及它的收敛代价

二层网络里如果存在物理环路,广播帧会沿着环无限复制,带宽瞬间被打满,交换机的 MAC 表会在两个端口之间反复翻转,形成广播风暴。生成树协议的作用就是逻辑上阻塞部分端口,把有环的物理拓扑修剪成一棵无环的树。

工作过程大致分三步:先选根桥,靠桥优先级和桥 MAC 比较,小的赢;再在每个非根桥上选根端口,也就是到根桥路径开销最小的口;最后在每条链路上选指定端口,剩下的阻塞。路径开销按端口速率折算,速率越高开销越小。端口从阻塞到转发要经过监听、学习两个过渡状态,传统生成树每一步等 15 秒,收敛一次要 30 秒以上,这在现在的网络里是不可接受的。

所以实际部署用的是快速生成树或者多实例生成树。快速生成树引入了边缘端口和提议协商机制,接入终端的端口直接进入转发不等 30 秒,链路故障时通过握手快速切换,收敛时间能压到亚秒级。多实例生成树则解决 VLAN 负载不均的问题,不同 VLAN 可以走不同的树。即便如此,接入端口配置为边缘端口这一步千万别忘,否则每次插拔网线终端都要等半分钟才能上网,用户会以为网络坏了。

5. 实操:搭一个最小环境把转发过程看出来

5.1 环境准备与拓扑搭建

准备三台设备即可:一台支持端口镜像的交换机、两台终端、一台做观察的笔记本。如果没有多余交换机,用虚拟环境也可以,但实操手感会差一些。拓扑是终端 A 接交换机 1 口,终端 B 接 2 口,观察机接 3 口并把 1 口和 2 口的流量镜像到 3 口。

第一步,清空动态 MAC 表。命令行里查看 MAC 表的命令各家拼写不同,一般是 show 或 display 加 mac 关键字,具体以设备手册为准。清空之后表应该是空的。第二步,在观察机上启动抓包,过滤条件设成两个终端的 MAC 地址。第三步,从 A 向 B 发第一个 ping。

这个顺序很重要:先清表、再抓包、最后触发流量。顺序反了你就看不到最初的泛洪过程,因为表项已经建立了。

5.2 抓包看到的三个现象与解释

现象一:A 发出 ping 之前会先发 ARP 请求,这是广播帧,目的 MAC 全 F。抓包能在观察口看到它,这是泛洪的第一个例子。交换机会把这个广播复制到除入端口外的所有端口。

现象二:B 回复 ARP 应答,这是单播。此时交换机还没学到 B 的 MAC,所以在观察口也能看到这个应答帧被泛洪。这是未知单播的典型表现。

现象三:A 和 B 开始正常互 ping,此后抓包在观察口就看不到这两个终端之间的单播流量了,因为交换机已经学到了双方的 MAC 和端口,精准转发不再泛洪。这时候去查 MAC 表,能看到两条动态表项,端口分别对应 1 和 2。

把这几个现象串起来,你就完成了一次对学习、泛洪、过滤、转发四个动作的完整观察。比看十篇文档都直观。

5.3 MAC 表的三种异常形态与判读

第一种,同一个 MAC 在两个端口之间快速跳变,查看时每次端口都不一样。这是典型的 MAC 漂移,几乎可以断定存在二层环路或者有人私接了设备。环路时广播帧绕着圈跑,两个端口都能收到同一个源 MAC,交换机就来回改表项。

第二种,某个端口下学到大量 MAC,几十上百个,而那个端口本应只接一台终端。这通常是下挂了未经管理的集线器或者小交换机,也可能是 MAC 欺骗攻击。前者要规范接入,后者要配合端口安全和 MAC 数量限制。

第三种,表项数量接近容量上限,新设备接入后时通时不通。这时候要看是不是有攻击或者扫描导致表项被大量占满,也要看设备本身的表容量是否够用。扩容前先确认没有异常学习,否则换了设备还是会被打满。

6. 常见问题与排查技巧实录

6.1 端口双工不匹配:最容易被忽略的丢包源

现象是两台设备互联后能通,但速率很低、丢包率高,ping 大包丢小包不丢。原因是一端强制全双工、另一端自协商,自协商失败后回落到半双工,或者两端都强制但设置不一致。半双工端会使用冲突检测,全双工端不检测,导致半双工端把对方的正常发送当成冲突,反复退避重传。

排查方法是看端口的双工状态和 CRC 错误计数。如果一端显示全双工、另一端显示半双工,基本就锁定了。解决方法是两端都改自协商,或者两端都强制且设置一致。我个人的习惯是互联口一律自协商,除非遇到老设备兼容问题才强制,强制时务必两端同步改。

6.2 广播风暴的现场特征与止血顺序

现场表现是所有业务同时变慢、交换机面板灯全部高频闪烁、管理界面卡顿甚至登不进去、MAC 表剧烈抖动。这时候不要先去分析原因,先止血。顺序是:找到环路端口,直接 shutdown,观察业务是否恢复;如果找不到,按接入区域分批断开,用二分法缩小范围。

止血之后再查原因。常见来源是两根网线接成环、用户私接小交换机、无线网桥配置错误、生成树被误关闭。预防手段是在接入端口开启生成树边缘端口加 BPDU 保护,一旦收到 BPDU 就自动 err-disable,把环路挡在接入侧。再加广播风暴抑制,给广播流量设个上限,超了直接丢,至少能保住网络不瘫。

6.3 常见问题速查表

表 2 二层故障速查

现象优先检查项常见根因处理动作
新设备接入完全不通端口状态、VLAN 配置、MAC 表是否有该设备端口被 err-disable、VLAN 未放行、端口安全触发恢复端口、补放 VLAN、检查安全策略
时通时不通、丢包双工模式、CRC 错误计数、光功率双工不匹配、线缆质量、光衰过大统一双工、换线、清洁或更换光模块
全网变慢、灯全闪端口流量、广播包占比、MAC 表漂移二层环路、广播风暴断端口止血、启用生成树保护
跨交换机同 VLAN 不通干道允许列表、原生 VLANVLAN 未放行、标签处理不一致核对两端干道配置
聚合后带宽不增哈希因子、实际流数量单流无法分摊调整哈希因子、增加并发流
表项学不进去表容量、是否有大量异常 MAC表满、MAC 攻击清理异常源、开启端口安全

6.4 几条不太好写进手册的经验

第一条,排查二层问题前先画拓扑。哪怕是口述的拓扑,也要在纸上画出谁接谁、哪个口接哪个口。我见过太多人对着命令行猜拓扑,猜了半小时。图画出来,环路往往一眼就能看出来。

第二条,端口计数器比日志更有用。日志可能因为 CPU 忙而丢,但端口的收发计数、错误计数是硬件统计的,不会漏。看 CRC 错包增长速率,比看任何告警都直接。

第三条,改动前先保存配置并记录时间点。二层配置一旦改错,影响面是整个广播域,回滚是常态。养成改之前导出配置的习惯,出事时能立刻恢复,而不是凭记忆一条条改回去。

第四条,别迷信默认值。老化时间、生成树模式、风暴抑制阈值、聚合哈希因子,这些默认值都是通用场景的折中,实际环境该调的就得调,但调之前要清楚代价是什么,比如调短老化时间会增加泛洪,调低风暴抑制阈值可能误伤正常的组播流量。

我个人在实际操作中的体会是,以太网交换机的工作原理看起来简单,但真正把故障定位做到端口级,靠的不是记住那四个动作,而是养成先看表、再看计数、最后看拓扑的习惯。表告诉你设备在哪,计数告诉你链路好不好,拓扑告诉你逻辑对不对。这三样凑齐,二层的问题基本没有查不出来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询