交换机工作原理: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地址学习过程
具体怎么学的?我给你拆解一下:
- 接收帧:交换机从某个端口收到一个以太网帧。
- 提取源MAC:读取帧头中的源MAC地址。
- 查表匹配:看这个源MAC是否已经在MAC地址表中。
- 更新/添加:如果不存在,就添加一条新记录,关联到接收端口;如果存在但端口变了,就更新端口信息。
- 重置老化计时器:该条目的老化时间归零重新计时。
核心原则:交换机只学习源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之间要通信,必须经过三层设备。常见的方式有两种:
- 路由器单臂路由:路由器的一个物理接口连接交换机的Trunk端口,路由器上创建多个子接口,每个子接口对应一个VLAN。
- 三层交换机:在三层交换机上创建SVI(Switch Virtual Interface),每个VLAN对应一个SVI接口,配置IP地址后即可实现VLAN间路由。
我个人更推荐使用三层交换机。单臂路由的瓶颈太明显了——所有VLAN间的流量都要经过那一条物理链路和一个路由器接口,带宽和性能都是问题。
SVG: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链路,这三者构成了二层网络的核心骨架。理解透了,你就能看懂大部分交换机故障的本质原因。