第2章 交换机的工作原理:MAC地址表与VLAN隔离
交换机这东西,说白了就是个聪明版的集线器。但它怎么聪明?核心就靠一张表——MAC地址表。我刚开始搞网络时,总觉得交换机是个黑盒子,直到有一次排查一个间歇性丢包问题,最后发现是MAC表老化了……嗯,从那以后我对这玩意儿的敬畏心就上来了。
2.1 MAC地址表的学习过程
交换机的端口刚启动时,MAC表是空的。它就像个刚入职的新人,啥都不知道。但它学得很快。
举个例子:PC-A从端口1发送一个帧。交换机会做什么?它会记下——
- 源MAC地址(PC-A的MAC)
- 接收端口(端口1)
- 时间戳
这就是一次学习。我把这个过程叫做“一次转发,终身记住”。当然不是真的终身,后面会讲老化机制。
关键点:交换机只学习源MAC地址,不学习目的MAC地址。目的MAC是拿来查表的,不是拿来学的。
我在项目中遇到过这样一个坑:一台新设备上线后,网络时断时续。排查了半天,发现是设备MAC地址和另一台冲突了。交换机学到A的MAC,过一会儿又学到B的相同MAC,表项反复覆盖,数据转发就乱了。你想想看,这种问题抓包都很难抓到,因为报文链路层是通的,但数据跑错了地方。
2.2 转发与泛洪:查表决策
交换机收到帧后,会查目的MAC在不在表里。这里分三种情况:
| 场景 | 动作 | 解释 |
|---|---|---|
| 目的MAC已知,且端口不同 | 转发(Forward) | 直接扔到对应端口,别的口不打扰 |
| 目的MAC已知,且端口相同 | 丢弃(Filter) | 帧不该绕一圈回来,浪费带宽 |
| 目的MAC未知 | 泛洪(Flood) | 除了接收口,其他口都发一遍 |
我记得有一次做性能测试,发现某个端口流量异常高。抓包一看,全是泛洪的广播帧。原来是下联设备的MAC表被某种攻击流量冲爆了,交换机学不到新MAC,只能不断泛洪。所以啊,泛洪是个保险机制,但也是网络风暴的导火索。
2.3 老化机制:表项不是永久的
交换机的MAC表空间是有限的。一般来说,表项会保留300秒(5分钟)。如果5分钟内没再收到该源MAC的帧,交换机会把它删掉。为啥要这么做?
- 节省内存:设备拓扑在变,老的条目不删,新的学不进来
- 适应移动:笔记本换个端口,旧表项还留着,帧就转发错了
个人习惯:我在排查丢包时,经常先看一下交换机的MAC表老化时间。有些设备可以调,比如从300秒改成180秒。如果是无线接入场景,终端频繁漫游,老化时间短一点更合适。
2.4 VLAN隔离:让广播域变小
默认情况下,所有端口都在同一个广播域里。一台设备发ARP广播,所有人都会收到。16台设备还好,1600台呢?广播风暴就是这么来的。
VLAN的作用就是划分子网隔离。不同VLAN之间,二层是隔离的,帧不会跨VLAN泛洪。我早期做一个园区网项目,接入层全在一个VLAN里,一到上班时间网络就卡死。后来划分成了10个VLAN,广播报文减少了90%以上。
VLAN的二层隔离也意味着跨VLAN通信必须通过三层设备(路由器或三层交换机)。所以你会发现,同一台交换机上,VLAN 10和VLAN 20的PC之间ping不通——除非你配了VLAN间路由。
曾踩过的坑:我曾经给一台核心交换机配了VLAN 99,但忘了在Trunk口上放行这个VLAN。结果VLAN 99的设备能互通,但流量出不了本机。抓包看到的是网关MAC解析成功,网关却ping不通——就是Trunk没放通。
2.5 交换机转发全流程总结
拿一个实际帧的流转过程来串一下:
- 设备A发一个帧,目的MAC是设备B
- 交换机在端口1收到这个帧,先学源MAC(A)→端口1
- 查目的MAC(B):如果表里有,去端口2转发;如果没有,泛洪到其他所有端口(端口1除外)
- 设备B在端口2收到帧,回一个帧
- 交换机在端口2学到B的MAC→端口2
- 从此A→B的通信就是单播转发了
这个过程中,我建议你关注一个点:交换机不关心IP。它只认MAC。所以抓包排查二层问题时,盯住MAC地址就行了,不用去看三层IP。
下面这张图是我自己总结的交换机核心工作逻辑,你仔细看一遍,基本就能理解整个过程了:
2.6 学完这章,你能解决什么问题?
说白了,理解了交换机的工作原理,你在抓包时就能回答这几个问题:
- 这个帧为什么从多个口出去?——泛洪,因为MAC表里没找到目的
- 明明在同一个交换机,为什么A和B不通?——可能在不同VLAN,或者Trunk没放通
- 为什么过一会儿又突然通了?——MAC表学好了,从泛洪变成转发
我个人觉得,抓包排查二层问题,80%的线索都在MAC地址表里。先把这张表读明白,很多问题就迎刃而解。