干网络这行久了,最常被新人追问的一个问题是:交换机把一个帧从某个端口收进来之后,它凭什么决定从哪个端口送出去?教科书上会讲查MAC地址表、泛洪、丢弃,但真到排障时,大家还是容易懵。后来我发现,把帧按“广播帧、未知帧、同网帧、异网帧”这四种去看,反而比死记定义更能快速上手。
这四种帧并不是教科书里的标准分类,更像是一个工程视角的拆分。它把“二层交换机如何转发”和“三层通信如何跨越网段”这两件事缝在了一起,覆盖了从局域网内部通信到跨网段访问的完整链路。这篇文章就把每种帧的底层逻辑、交换机动作、常见误区和排查思路挨个拆开讲,适合刚接触交换机的同学、准备网络认证的朋友,也包括那些天天被突发故障折腾的运维同行。
1. 为什么交换机要区分这“四种帧”?——一张转发表引发的核心问题
1.1 交换机收到帧后只做四件事:学、查、转、弃
要理解四种帧,先得回到交换机的本职工作。交换机的核心是MAC地址表,这张表长得很朴素:左边是MAC地址,中间是VLAN编号,右边是出端口,外加一个老化时间。一个帧从端口进来,交换机会先学习源MAC,把它记录到表里,然后拿着目的MAC加VLAN去查表,查完之后做出决策。
整个决策逻辑可以压缩成三个分支。如果目的地址是广播地址,直接泛洪;如果目的MAC在表里查不到,也就是未知单播,同样泛洪;如果查到了,就只从对应端口送出去。那个所谓的“同网帧”和“异网帧”,在交换机眼里其实是同一件事——都是查得到目的MAC的已知单播,至于IP层是不是同一个网段,交换机根本不关心。
这也是我强调“别死记定义”的原因。四种帧里,广播帧和未知帧是交换机的转发表行为分类,同网帧和异网帧是IP层的通信分类。它们描述的是两个层面的东西,但因为最终都要落到“这个帧怎么走”上,所以工程上习惯把它们放在一起理解。
1.2 四种帧不是平行关系,而是三个决策分支
很多新人容易犯的错,是试图给四种帧各找一套完全独立的处理规则。其实把它们对应到交换机的三个决策分支会更清晰:
- 广播帧:目的MAC是FF:FF:FF:FF:FF:FF,交换机不看表,直接泛洪。
- 未知帧:目的MAC是普通单播地址,但MAC表里查不到,交换机拿它当广播处理,同样泛洪。
- 同网帧:目的MAC查到了,出端口唯一,精准转发,整条链路不经过任何网关。
- 异网帧:目的MAC也查到了,但查到的其实是网关的MAC地址。交换机完成的是“把帧送到网关”这一步,真正的跨网段转发由路由器或三层交换机完成。
所以你看,前两种帧的本质问题是“不知道该发给谁,只能所有人都问一遍”,后两种帧的本质问题是“目的MAC背后藏着的人是邻居还是远方亲戚”。
1.3 理解四种帧前,先弄懂两个基础概念
第一个是ARP。交换机不认识IP,它只认MAC。主机要和别人通信,必须先通过ARP协议把对方的IP解析成MAC地址。IPv4环境里,ARP请求就是广播帧最典型的例子。
第二个是网关。主机判断目的IP和自己不在同一个网段之后,就知道“此人不在本楼”,不能靠二层直接找到对方,需要把帧先送给网关,让网关去做三层路由。这时候帧头里写的目的MAC就变成了网关的MAC,IP头里的目的IP却依然是那台远方的服务器。
这两个概念心里有数之后,下面四种帧的拆解就好读很多。
2. 广播帧:全网敲门声——泛洪逻辑与ARP的黄金搭档
2.1 先从字节级看看广播帧长什么样
以太网帧的标准格式并不复杂,真正决定“这是不是广播帧”的,就是目的MAC那6个字节。广播帧的目的MAC是FF:FF:FF:FF:FF:FF,源MAC是发送设备的真实MAC,类型字段如果是0x0800说明里面装的是IPv4报文。
可以类比成敲单元门:广播帧不是写给某个人的信,而是“全楼广播通知”。以太网在设计时就用全F这个特殊地址表明“所有端口上的设备都必须听一听”。IP协议里的ARP请求、DHCP客户端寻找服务器,全是靠这个全楼广播才能跑起来的。
抓包的时候,眼睛盯着目的MAC那一栏,只要看到六个FF,就能立刻判定这是广播帧,不用去管后续的IP层内容。
2.2 交换机收到广播帧后的动作:泛洪,但只在VLAN内
交换机一旦认出广播帧,会把它复制到除接收端口以外的所有同VLAN端口。注意两个限定词:除接收端口、同VLAN。
先说“除接收端口”。帧不会从进来那个口再出去,这不是规则,而是物理上没必要。再说“同VLAN”。VLAN把一台物理交换机切成多个逻辑交换机,广播帧只在它所属的那个广播域里传。假设交换机上划分了VLAN 10和VLAN 20,VLAN 10里的广播帧绝对不会跑到VLAN 20的端口上。
这也是为什么VLAN常被叫做“广播域隔离”手段。没有VLAN时,一台交换机接200台设备,任何一台设备发出广播帧,其余199台都得听一下;划分VLAN后,广播影响范围立刻缩小。
2.3 ARP请求是广播帧的最佳例子
主机A想知道主机B的MAC地址,会发出一个广播帧,里面写着“我是192.168.1.10,MAC是AA:BB:CC:DD:EE:01,请问192.168.1.20的MAC地址是多少”。这个帧被交换机泛洪到所有端口,所有设备都会收到,但只有IP地址匹配的B会回应一个单播帧。
这里有一个特别值得注意的细节:ARP广播请求的目的MAC虽然是全F,但目的IP是单播地址。这造成了一个常见误解,很多人以为ARP请求是“问所有人”,其实它是在全局域网上喊“请指定IP地址的人回答”。Linux下抓包时,如果看到“Who has 192.168.1.20? Tell 192.168.1.10”,那就是ARP广播帧。
2.4 广播风暴为什么可怕
广播帧本身并不可怕,可怕的是数量失控。交换机对广播帧是无条件泛洪的,如果网络出现二层环路,又没跑生成树协议,广播帧就会被交换机反复转发,形成指数级增长的风暴,最终占满所有带宽。
即便是正常的网络,ARP请求也不会太少。Windows设备默认每过一段时间就会刷新ARP表项,加上各种协议发现报文,一个没有划VLAN的大二层网络,广播帧占比通常能达到5%到10%。我曾经见过一台交换机底下挂了几百台设备的场景,广播帧一多,正常业务流量反而被挤得卡顿。
针对广播风暴,简单的防护思路有两个:一是用VLAN把广播域变小,二是开启风暴控制。主流的交换机都支持广播抑制,可以设置一个阈值,比如端口的广播流量超过带宽的5%就丢弃多余部分。
2.5 实操:怎么看广播帧
抓包是最直观的。在Linux主机上运行:
tcpdump -nn -e icmp其中-e参数能显示以太网帧头,能看到目的MAC和源MAC。如果看ARP:
tcpdump -nn -e arp抓包时顺便留意一下广播帧占总流量的比例,通常超过10%就属于偏高,该考虑优化VLAN划分或检查环路问题了。
3. 未知帧:半路杀出的“没登记”MAC,交换机把广播帧的处理方式抄了一遍
3.1 未知单播帧的准确定义
未知帧的全名叫“未知单播帧”,意思是目的MAC是一个真实存在的单播MAC地址,但交换机的MAC地址表里此时查不到对应表项。比如目的MAC是AA:BB:CC:DD:EE:02,交换机翻遍整张表也没找到这个地址是从哪个端口学来的。
这时交换机会采取和广播帧完全一样的动作:泛洪。原因也很好理解,交换机不知道目的主机身在何处,但它不能直接把帧丢掉,丢了就代表通信必然失败。泛洪至少还能搏一把“说不定对方能从某个端口收到”。
这个设计是早年以太网从共享型网络演进时留下的基因:早期用集线器时,所有端口本来就要收所有帧;后来改成交换式网络,这个保守泛洪行为被保留了下来。
3.2 为什么会出现未知帧:MAC表老化、新设备、表项被顶掉
MAC表不是永久的,主流交换机的动态表项老化时间默认在300秒左右。一个设备5分钟没发流量,它的MAC表项就会被删除。此时别人给它发数据,交换机查不到表项,就会触发未知帧泛洪。
最典型的是笔记本休眠唤醒。电脑休眠期间不发包,交换机老化掉了它的MAC表项;唤醒后别人ping它,前几个探测包大概率要以未知帧的方式泛洪出去,等电脑回复之后,MAC表才重新学到。所以故障现象常常是“刚开始ping不通,多ping几下就通了”,这背后就是未知帧在擦边开路。
还有一种被顶掉的情况。MAC地址表的容量是有限的,当网络里终端数量特别多,或者有人伪造了大量不同MAC地址时,老设备的MAC表项被挤出表外,也会变成未知帧。
3.3 泛洪未知帧的代价:带宽浪费与监听风险
未知帧泛洪和广播泛洪有一个关键区别。广播帧是所有主机都要接收并处理,因为帧头里的目的MAC是FF,网卡不会拦截;未知单播帧则不同,其他主机的网卡看到目的MAC不是自己,会直接静默丢弃。所以双方的CPU负担差异很大。
但这不代表未知帧泛洪没风险。第一,带宽被白白占用了。假设一台接入交换机泛洪一个未知帧,帧会同时被复制到所有同VLAN端口,如果网络里出现大量未知帧,效果和广播风暴类似。第二,如果有人在网上开启了混杂模式抓包,那些本不该被它收到的未知单播帧也能被完整抓下来,这就是所谓的信息泄露隐患。
3.4 减少未知帧泛洪的几种手段
最直接的办法是给重要设备做静态MAC绑定。把“服务器A的MAC地址”和“接服务器的那个端口”固定写进MAC表,表项永不过期。配置命令各家略有差异,思路都一样:在指定端口下绑定MAC地址,并关闭该端口动态学习功能。
也可以适当调长MAC表老化时间。比如把服务器网段的老化时间从300秒调到600秒甚至更长,能减少因为表项超时造成的频繁泛洪。
3.5 排查未知帧泛滥的实操方法
遇到网络整体变慢,怀疑未知帧泛滥时,先登录交换机查MAC表项数量:
show mac address-table count如果表项数接近设备规格上限,说明表容量已经吃紧。再看端口流量统计,检查每个端口的单播泛洪计数。部分品牌交换机会单独统计“Unknown Unicast Packets”这一项,数值异常增大就说明大量未知帧在从该端口泛洪出去。
抓包时有个小技巧:抓包工具设为混杂模式,如果看到大量目的MAC并不是本机网卡MAC的单播帧,而这些帧的目的IP又各不相同,那基本可以断定是未知帧泛洪在捣乱。排障完成后建议立刻关掉混杂模式,避免不必要的隐私风险。
4. 同网帧:MAC表命中后的精准投递,为什么速度最快
4.1 谁来判断“同网”?答案是主机,不是交换机
这里要澄清一个高频误区:所谓的“同网帧”,实际上是源主机自己断定目标主机和它处于同一IP网段后,直接发起二层通信的结果。判断动作是主机完成的,交换机只负责查MAC表。
主机怎么判断?拿自己的IP和子网掩码做与运算,得出自己所在的网络号。比如主机A是192.168.1.10/24,掩码255.255.255.0,与运算得到网络号192.168.1.0。目标B是192.168.1.20/24,网络号同样是192.168.1.0,那就属于同网段,A会直接发ARP请求问B的MAC。
只有当ARP解析成功、拿到B的MAC地址之后,A才会构造一个目的MAC等于B的单播帧。这个帧进入交换机,交换机查表命中,从对应端口精确转发出去。
4.2 同网帧的完整转发链路
拿一个最简单的例子:PC1192.168.1.10ping PC2192.168.1.20,两台电脑接在同一台交换机上。
- PC1检查ARP缓存,发现没有PC2的MAC地址,于是发出ARP广播请求。
- 交换机泛洪这个ARP广播帧,PC2收到后回应一个ARP单播帧。
- PC1拿到PC2的MAC,构造ICMP请求帧,目的MAC填PC2的MAC。
- 交换机收到这个帧,查MAC表,发现该MAC对应端口是GigabitEthernet0/0/2,于是只把这帧从0/0/2送出去。
- PC2收到后,反向重复这个流程回复ICMP。
整个过程中,交换机执行的是一次纯粹的硬件查表转发,没有路由器的参与,也没有TTL变化,IP头和MAC头从头到尾都不变。
4.3 为什么同网帧快:全程硬件转发
同网帧的转发速度接近交换机的线速能力,因为硬件芯片直接查表,不需要CPU参与。一台普通的接入交换机,转发时延通常在微秒级别;相比之下,路由器每处理一个报文,要解封装、查路由、改TTL、重新封装,环节多,开销大。
不少人对“同网快”的感知不准,其实可以做一个简单实验。在同一台交换机下ping网关的延迟通常在0.2到0.5毫秒,而ping同网段另一台主机可能只有0.1毫秒出头。数字看似微小,但放到大规模数据中心环境里,二层转发和三层转发的性能差距会被放大得很明显。
4.4 同网帧也有例外:同VLAN不同网段、跨交换机同网段
第一种例外是“同VLAN但不同IP网段”。假设两台主机都在VLAN 10,但一个配192.168.1.0/24,另一个配192.168.2.0/24,主机判断出不同网段,就会把帧交给各自的网关,而不是直接二层通信。这种情况下,即使它们通过二层网络物理连通,走的依然是三层路径。
第二种例外是“同网段但跨交换机”。PC1接交换机A,PC2接交换机B,两台交换机之间用Trunk口相连。只要两台主机同VLAN、同网段,PC1发往PC2的帧一样会在交换机A里查表命中,从Trunk口送往交换机B,再由B精确转发。这在中小型园区网络里非常常见。
4.5 如何在交换机上确认“同网帧命中”
登录交换机查看MAC表是基本功:
show mac address-table重点看目标MAC对应的出端口是否是PC2实际接入的端口。如果出端口显示为Trunk口,说明交换机的表项已经把目标定位到远端交换机了,这种也属于正常情况。敲完命令还应该顺手用arp -a确认本机ARP缓存是否完整,防止出现“主机ARP缓存错误导致帧头MAC填错”的一类低级故障。
5. 异网帧:为什么源和目的不在一个网段,交换机还是能“转发”——网关在背后替它换了壳
5.1 异网帧的“骗局”:目的MAC其实是网关
跨网段通信是整个四种帧里最容易被误解的部分。许多新人以为,PC1访问PC2时,帧头的目的MAC会直接填PC2的MAC。这是个明显的错误想法,因为交换机根本不认识IP地址,它无法在二层直接定位跨网段主机。
实际上,PC1和PC2不在同一网段时,PC1会先把帧发给网关。帧的IP头里,源IP是192.168.1.10,目的IP是192.168.2.20,但以太网头里,源MAC是PC1的MAC,目的MAC却是网关在192.168.1.0/24网段接口的MAC。
这个帧在交换机眼里,和同网帧没有任何区别:查表,命中网关MAC,精确转发到连接网关的那个端口。交换机根本不知道这帧背后装着一段“要出远门”的跨网段流量。
5.2 异网通信完整拆解:两段MAC,一路IP
完整流程如下:
- PC1用掩码算出PC2在另一网段,决定把包交给网关。
- PC1检查ARP缓存,没有网关MAC,发出ARP广播请求“谁是192.168.1.1”。
- 交换机泛洪该广播帧,网关回应自己的MAC。
- PC1封装帧:源MAC=PC1的MAC,目的MAC=网关的MAC,源IP=192.168.1.10,目的IP=192.168.2.20。
- 交换机查MAC表,命中网关MAC对应的端口,把帧送到网关。
- 网关检查目的IP,查路由表,发现下一跳通向192.168.2.0/24网段,于是把帧头的源MAC改成自己的出接口MAC,目的MAC改成PC2的MAC,TTL减1,再查二层表转发出去。
- PC2收到帧,回包时反向执行同样的流程。
整个过程里IP头保持不变,变化的只有每一跳的MAC地址。这也是抓包时辨认异网流量的核心标志:在两个网段分别抓包,源MAC和目的MAC会换一轮,但IP层的源和目的始终不变。
5.3 三层交换机干了什么:一次路由,多次交换
很多人知道三层交换机比路由器快,但说不上来快在哪。三层交换机的理念是“一次路由,多次交换”。第一个去往某个目标网段的报文,由CPU走完整的三层路由流程;之后它会缓存一条“流表项”或“硬件路由表项”,让后续的报文直接在硬件里完成MAC改写和转发。
放到异网帧的场景里解释就是:第一个异网帧要经历完整的路由决策,后续同一条流的异网帧则基本按二层交换的速度在转发。所以三层交换机非常适合做VLAN间路由——在交换机内部划分多个VLAN,再接一个VLAN接口做网关,异网帧从VLAN 10进来,被三层转发到VLAN 20出去,全程不出设备。
5.4 VLAN间路由为什么也属于异网帧
VLAN划分之后,交换机天然隔离广播域,VLAN 10的广播帧到不了VLAN 20。但如果VLAN 10和VLAN 20的主机想通信,因为网络号不同,主机判断出不在同一网段,就会去寻找网关。
网关通常是交换机上配置的VLANIF地址,或者路由器上的子接口。无论如何,这个帧必然经历“二层送到网关端口→三层路由→二层从目标VLAN端口出去”的过程。所以在概念上,VLAN间路由和异网帧是一回事,区别只是网关设备形态不同。
5.5 同网帧与异网帧的核心差异
用一张表直接对比:
| 对比项 | 同网帧 | 异网帧 |
|---|---|---|
| 谁判断网段关系 | 源主机 | 源主机 |
| 目的MAC是谁 | 对端主机的MAC | 网关的MAC |
| ARP请求对象 | 对端主机 | 网关 |
| IP地址是否变化 | 不变 | 不变,全程保留源和目的IP |
| MAC地址是否变化 | 全程不变 | 每过一个三层设备都改写 |
| TTL是否变化 | 不变 | 每过一个三层设备减1 |
| 交换机的作用 | 精确单播到目标端口 | 精确单播到网关端口 |
| 三层设备是否参与 | 不参与 | 必须参与 |
这张表建议截图留存,排障时拿它对照抓包信息,基本能一眼看出问题出在二层还是三层。
5.6 小实验:抓包看MAC的变化
如果手头有两台电脑和一台家用路由器,可以做一个验证。电脑A接路由器LAN口,电脑B也接路由器LAN口,但把自己改成不同网段。A ping B,在A上抓包能看到目的MAC是路由器的LAN口MAC,而不是B的MAC;再到B上抓包,看到的源MAC同样是路由器LAN口MAC,而不是A的MAC。两个抓包文件一对比,异网帧“换壳不换芯”的特征就非常直观了。
6. 用一个ping不通现象,把四种帧串起来排查
6.1 场景设定
假设一个典型故障:PC1网段192.168.1.0/24,网关192.168.1.1;PC2网段192.168.2.0/24,网关192.168.2.1。路由器串接两个网段,交换机只是普通二层接入设备。PC1执行ping 192.168.2.20,结果不通。
拿到这种现场,首先要把四种帧的知识转化成排查问题清单:广播帧通不通?MAC表查到没?帧是送到网关还是送到PC2?网关有没有做三层转发?
6.2 分步排查:先看ARP,再看MAC表,最后看抓包
第一步,在PC1上执行arp -a,看看网关192.168.1.1的MAC是否已经解析成功。如果ARP缓存里压根没有网关MAC,说明PC1发出的ARP广播帧没被正确响应,问题在二层:可能是交换机端口没有加入正确的VLAN,也可能是交换机启用了端口隔离,或者网关接口下层物理链路异常。
第二步,如果网关MAC已经在了,继续ping,并在交换机上查看MAC表:
show mac address-table | include 192.168.1.1不过MAC表里存的是MAC,不是IP,所以更准确的做法是先执行arp -a拿到网关MAC,再拿这个MAC去交换机里查。如果MAC表里能看到网关MAC对应Trunk口或上联口,说明PC1发出的帧已经成功被交换机送到网关端口,二层链路是好的。
第三步,就要判断三层了。登录路由器,看路由表里有没有去往192.168.2.0/24的路由。如果没有,要么是网关接口没配置,要么是路由缺失。如果路由表正常,再在路由器上执行ping 192.168.2.20。设备自己ping通,说明路由器到PC2链路没问题;ping不通,问题就在PC2那一侧的二层网络或PC2自身的防火墙配置。
这套排查思路,本质上是顺着异网帧的完整路径把四种帧挨个检查了一遍:广播帧决定ARP能不能学到,同网帧决定二层投递是否精确,异网帧决定三层转发链路是否完整。
6.3 四种帧对应的故障特征
平时排障多了之后,可以形成一套条件反射式的特征对应关系:
| 故障现象 | 最可能的帧类型 | 重点检查方向 |
|---|---|---|
| ARP学不到,ping网关都不通 | 广播帧 | VLAN配置、端口隔离、物理链路 |
| 网络慢,抓包有大量无关单播帧 | 未知帧 | MAC表容量、老化时间、静态绑定 |
| ping不通但ARP能学到对端MAC | 同网帧 | 交换机MAC表出端口是否正确、端口是否up |
| 同网段正常,跨网段全部不通 | 异网帧 | 网关MAC、路由表、三层接口状态 |
这里面有个值得记住的经验:大部分“时通时断”“第一个包不通第二个包通”的问题,十有八九和未知帧有关。原因要么是MAC表老化,要么是ARP缓存过期后重新广播,碰到这类现象,不要猜链路质量,先查表项。
6.4 一张“背下来就够用”的顺口溜
我后来带别人排障时,总会把四种帧归纳成一句话:广播靠泛洪,未知靠泛洪,已知靠单播,跨网靠网关。十六个字,基本覆盖了二层转发和三层路由的分界线。
遇到任何二层网络故障,先问自己三个问题:这个帧该不该泛洪?如果该泛洪,为什么没有到达目标?如果不该泛洪,MAC表项到底有没有、对不对?三个问题问完,绝大多数故障都能定位到具体端口或具体配置上。
到这里,四种帧就不再是课本上四个孤立的名词,而是一套完整的定位工具:广播帧决定基础通信能不能建立,未知帧决定偶发故障为什么出现,同网帧决定局域网内的精确投递,异网帧决定跨网段通信到底绕了几道弯。把这个逻辑理清楚,交换机给你很多配置概念也就自然串起来了。