交换机工作原理:MAC地址表的建立与维护,VLAN的隔离与Trunk链路

交换机这东西,说白了就是一台高速转发数据的专用计算机。它不像集线器那样无脑广播,而是靠一张表来精准转发。这张表就是MAC地址表。今天我就带你把它的底裤扒干净。

MAC地址表:交换机的记忆核心

MAC地址表长什么样?我直接给你看一个典型的结构:

MAC地址 关联端口 所属VLAN 老化时间
00:1A:2B:3C:4D:5E GigabitEthernet0/1 10 300s
00:1A:2B:3C:4D:5F GigabitEthernet0/2 20 298s
00:1A:2B:3C:4D:60 GigabitEthernet0/3 10 295s

这张表是动态学习的。交换机每收到一个数据帧,都会做两件事:查表转发,同时学习源MAC地址。我刚开始做网络运维时,总觉得这过程很简单,直到有一次线上故障排查了整整一个通宵……嗯,从那以后我再也不敢小看这张表了。

MAC地址学习过程

具体怎么学的?我给你拆解一下:

  1. 接收帧:交换机从某个端口收到一个以太网帧。
  2. 提取源MAC:读取帧头中的源MAC地址。
  3. 查表匹配:看这个源MAC是否已经在MAC地址表中。
  4. 更新/添加:如果不存在,就添加一条新记录,关联到接收端口;如果存在但端口变了,就更新端口信息。
  5. 重置老化计时器:该条目的老化时间归零重新计时。

核心原则:交换机只学习源MAC,不学习目的MAC。目的MAC是用来查表转发的。

你想想看,如果交换机收到一个目的MAC未知的帧,它会怎么做?它会把这个帧从除了接收端口以外的所有端口广播出去——这就是泛洪。我记得有一次在数据中心调试,就是因为某个端口下挂了一台有问题的设备,疯狂发送未知目的MAC的帧,导致整个广播域都被淹没了。

MAC地址老化机制

MAC地址表不能无限增长。交换机内部资源有限,而且设备可能会移动。所以每个条目都有一个老化计时器,默认通常是300秒(5分钟)。

老化机制是这样的:

  • 每次收到该源MAC的帧,计时器重置。
  • 如果超过老化时间没有收到任何帧,该条目被删除。
  • 删除后,下次再收到该MAC的帧,重新学习。

避坑指南:我曾经遇到过一个问题——某台服务器频繁掉线,排查了半天发现是MAC地址在交换机不同端口之间来回漂移。原因是服务器上配置了双网卡绑定,但交换机没有开启端口安全或STP,导致MAC地址表不断被更新,造成间歇性丢包。解决方案是配置端口安全或使用链路聚合。

VLAN:广播域的隔离利器

没有VLAN的时候,整个二层网络是一个广播域。一台设备发ARP广播,所有设备都能收到。这就像在一个大办公室里,所有人都在喊话,谁也听不清。

VLAN(虚拟局域网)的作用,就是把一个物理交换机分割成多个逻辑交换机。每个VLAN是一个独立的广播域。VLAN之间默认是不能通信的,必须通过三层设备(路由器或三层交换机)才能互通。

我习惯把VLAN比作楼层。同一楼层的人可以互相串门(广播),但不同楼层的人必须通过电梯(三层路由)才能见面。

特性 无VLAN 有VLAN
广播域范围 整个交换机 每个VLAN独立
安全性 低,所有设备可见 高,VLAN间隔离
网络管理 混乱,难以划分 灵活,按需分组
带宽利用率 广播占用大量带宽 广播限制在VLAN内

Access端口与Trunk端口

交换机的端口有两种主要模式:Access和Trunk。这个区别很多新手容易搞混。

Access端口:

  • 只属于一个VLAN。
  • 收到的帧不带VLAN标签。
  • 发出的帧也不带VLAN标签。
  • 通常连接终端设备(PC、服务器、打印机)。

Trunk端口:

  • 可以承载多个VLAN的流量。
  • 帧在传输时会打上VLAN标签(802.1Q)。
  • 用于交换机之间的互联,或交换机与路由器之间的连接。

注意:Trunk链路上默认会允许所有VLAN通过,但实际生产环境中一定要手动修剪掉不需要的VLAN。我曾经见过一个事故——某台交换机Trunk端口没有做VLAN修剪,导致一个VLAN的广播风暴通过Trunk传播到了整个园区网,所有交换机都受到了影响。

802.1Q标签:VLAN的身份证

802.1Q是VLAN tagging的标准。它在以太网帧头中插入一个4字节的标签:

原始以太网帧:
| 目的MAC(6B) | 源MAC(6B) | 类型/长度(2B) | 数据(46-1500B) | FCS(4B) |

带802.1Q标签的帧:
| 目的MAC(6B) | 源MAC(6B) | 802.1Q标签(4B) | 类型/长度(2B) | 数据(46-1500B) | FCS(4B) |

802.1Q标签结构:
| TPID(2B) | Priority(3bit) | CFI(1bit) | VLAN ID(12bit) |
| 0x8100   | 0-7            | 0         | 1-4094          |

VLAN ID的范围是1到4094,0和4095保留。其中VLAN 1是默认VLAN,所有端口默认都属于VLAN 1。我个人习惯在生产环境中把VLAN 1改掉或者禁用,因为它是默认的,容易成为攻击目标。

Trunk链路的工作原理

两台交换机通过Trunk链路连接时,它们之间传递的帧都带着VLAN标签。接收方根据标签就知道这个帧属于哪个VLAN,然后转发到对应的端口。

举个例子:

  • 交换机A的Access端口(VLAN 10)收到一个无标签帧。
  • 交换机A给这个帧打上VLAN 10的标签,从Trunk端口发出。
  • 交换机B从Trunk端口收到这个带标签的帧。
  • 交换机B看到标签是VLAN 10,就把标签去掉,从属于VLAN 10的Access端口转发出去。

这个过程对终端设备是完全透明的。终端设备根本不知道VLAN的存在,它只看到普通的以太网帧。

实战经验:配置Trunk链路时,一定要确认两端交换机的Trunk封装方式一致。有的老设备支持ISL(思科私有),有的只支持802.1Q。我早期做项目时,两台交换机Trunk死活不通,查了半天发现一端配了ISL,另一端配了802.1Q。统一成802.1Q后问题解决。

VLAN间路由

不同VLAN之间要通信,必须经过三层设备。常见的方式有两种:

  1. 路由器单臂路由:路由器的一个物理接口连接交换机的Trunk端口,路由器上创建多个子接口,每个子接口对应一个VLAN。
  2. 三层交换机:在三层交换机上创建SVI(Switch Virtual Interface),每个VLAN对应一个SVI接口,配置IP地址后即可实现VLAN间路由。

我个人更推荐使用三层交换机。单臂路由的瓶颈太明显了——所有VLAN间的流量都要经过那一条物理链路和一个路由器接口,带宽和性能都是问题。

SVG:MAC地址表学习与转发流程

下面这张图展示了交换机从收到帧到学习MAC地址、再到转发帧的完整流程:

交换机MAC地址表学习与转发流程 1. 从端口接收帧 2. 提取源MAC地址 3. 查MAC地址表 4a. 不存在 → 添加新条目 4b. 已存在 → 更新/重置计时器 5. 查目的MAC并转发 说明:目的MAC已知 → 单播转发;目的MAC未知 → 泛洪(广播到除接收端口外的所有端口)

MAC地址表与VLAN的协同

MAC地址表不是全局一张表,而是每个VLAN一张表。为什么?因为同一个MAC地址可以出现在不同的VLAN中,但对应的端口可能不同。交换机在转发时,先根据帧的VLAN标签找到对应的MAC地址表,再查表转发。

举个例子:

  • MAC地址 00:1A:2B:3C:4D:5E 在VLAN 10中关联端口G0/1。
  • 同一个MAC地址在VLAN 20中可能关联端口G0/2。
  • 两者互不干扰。

这就是VLAN隔离的底层实现——每个VLAN维护自己独立的MAC地址表,广播域自然也就隔离了。

关键点:Trunk链路传递的是带VLAN标签的帧,但MAC地址表的学习和转发仍然基于源MAC和目的MAC。VLAN标签只是告诉交换机这个帧属于哪个广播域,不影响MAC地址的学习逻辑。

常见问题与避坑

  • MAC地址漂移:同一个MAC地址在短时间内出现在不同端口,通常是由于环路或配置错误。开启STP(生成树协议)可以解决环路问题。
  • Trunk链路两端VLAN不匹配:一端允许VLAN 10通过,另一端不允许,导致VLAN 10的流量在Trunk链路上丢失。配置时一定要两端核对。
  • 本征VLAN不一致:Trunk链路上有一个本征VLAN(Native VLAN),默认是VLAN 1。本征VLAN的帧在Trunk链路上是不带标签的。如果两端本征VLAN配置不一致,会导致流量错乱。

安全警告:不要将Trunk端口连接到终端设备。如果攻击者通过终端设备发送带VLAN标签的帧,可能实现VLAN跳跃攻击(VLAN Hopping)。我建议在所有非Trunk端口上关闭Trunk模式,并配置端口安全。

好了,交换机的工作原理就讲到这里。MAC地址表、VLAN隔离、Trunk链路,这三者构成了二层网络的核心骨架。理解透了,你就能看懂大部分交换机故障的本质原因。