0%

三层交换机二层转发与三层转发的判定机制

三层交换机二层转发与三层转发的判定机制

同一台三层交换机,同一个端口收进来的报文,有的被原封不动地从另一个端口转出去,有的却被”改头换面”送到了另一个网段。

交换机到底凭什么决定:这个包该二层转发,还是三层转发?

很多人的第一反应是:”看目的 IP 呗,同网段就二层,跨网段就三层。”

听起来很合理,但其实不对。今天我们就把这个问题彻底聊透。

一、判定依据:目的 MAC 是否为本机三层接口 MAC

三层交换机判断二层还是三层转发,最核心的依据是:

看报文的目的 MAC 地址,是不是本机三层接口的 MAC 地址。

  • 是:说明这个包是”交给我处理”的,进入三层转发流程,查路由表。
  • 不是:说明这个包只是”路过”,在 VLAN 内按 MAC 地址表做二层转发。

就这么简单。交换机做这个判断时,根本不需要先去看 IP 地址。

那问题来了:凭什么看一个 MAC 地址就能决定要不要路由?

二、目的 MAC 的来源:主机的网段判断与 ARP 解析

下面用一个简单的环境来说明。

环境说明如下:

三层交换机 SW 上创建了 VLAN 10 和 VLAN 20,并分别配置三层接口 VLANIF10(192.168.10.1/24)和 VLANIF20(192.168.20.1/24)。两个 VLANIF 使用同一个设备系统 MAC:5c:dd:70:aa:bb:cc。

PC1、PC2 接入 VLAN 10,网关为 192.168.10.1。

PC3 接入 VLAN 20,网关为 192.168.20.1。

在这个环境中,PC1 分别访问 PC2 和 PC3,两个报文都从 PC1 所连的同一个端口进入 SW。

访问 PC2 时,SW 做的是二层转发;访问 PC3 时,SW 做的是三层转发。

SW 能区分这两种情况,前提是这两个报文的目的 MAC 不一样。而目的 MAC 填什么,是由 PC1 在发包之前决定的。

主机发送 IP 报文前,必须先确定以太网帧头中的目的 MAC。

确定的方法是:用本机 IP 和子网掩码算出自己所在的网段,再判断目的 IP 是否属于这个网段。

  • 目的 IP 与本机在同一网段:目的主机可以直接到达,主机通过 ARP 解析目的主机的 MAC,作为目的 MAC。
  • 目的 IP 与本机不在同一网段:报文需要交给网关转发,主机通过 ARP 解析网关的 MAC,作为目的 MAC。

下面分别看这两种场景下 PC1 的处理过程。

2.1 同网段通信:PC1 访问 PC2

PC1 计算后发现 192.168.10.20 和自己在同一个网段,于是:

  1. 直接发 ARP 请求:”谁是 192.168.10.20?”
  2. PC2 回复自己的 MAC。
  3. PC1 发出的报文:目的 IP = PC2,目的 MAC = PC2 的 MAC。

2.2 跨网段通信:PC1 访问 PC3

PC1 发现 192.168.20.30 不在自己网段,于是决定把包交给网关:

  1. 发 ARP 请求:”谁是 192.168.10.1(我的网关)?”
  2. 交换机的 VLANIF10 回复自己的 MAC:5c:dd:70:aa:bb:cc。
  3. PC1 发出的报文:目的 IP = PC3,目的 MAC = 交换机的 MAC。

看出门道了吗?

场景 目的 IP 目的 MAC
PC1 → PC2 192.168.10.20 PC2 的 MAC
PC1 → PC3 192.168.20.30 交换机的 MAC

“这个包需不需要路由”,主机已经通过目的 MAC 告诉交换机了。

交换机只需要看一眼目的 MAC:是我的,那就是让我路由;不是我的,那我就当一台普通二层交换机,帮你转过去就好。

这就是”看目的 MAC 判定转发方式”成立的根本原因。

三、二层转发流程

当目的 MAC 不是本机 MAC 时,交换机走二层转发流程,和普通二层交换机完全一样:

  1. 学习源 MAC:把”源 MAC + VLAN + 入端口”记录到 MAC 地址表。
  2. 查目的 MAC:在该 VLAN 内查 MAC 地址表。
  3. 根据查表结果处理:
    • 已知单播:查到了,从对应端口发出去。
    • 未知单播:没查到,在本 VLAN 内泛洪(除入端口外的所有端口)。
    • 广播 / 未知组播:在本 VLAN 内泛洪。

整个过程中,报文内容一个字节都不改,二层头、IP 头、TTL 统统原样保留。

四、三层转发流程

当目的 MAC 是本机 MAC 时,交换机就要真正干路由器的活了:

  1. 剥掉二层头,取出 IP 报文。
  2. 查路由表(FIB):根据目的 IP 192.168.20.30,匹配到直连路由 192.168.20.0/24,出接口 VLANIF20。
  3. 查 ARP 表:找到 192.168.20.30 对应的 MAC(PC3 的 MAC)。如果还没有 ARP 表项,就先在 VLAN20 里发 ARP 请求去解析。
  4. 重写报文:
    • 源 MAC → 改成交换机 VLANIF20 的 MAC
    • 目的 MAC → 改成 PC3 的 MAC
    • VLAN → 从 10 改成 20
    • TTL → 减 1
    • IP 头校验和 → 重新计算
  5. 从出接口发出:在 VLAN20 内查 MAC 表,找到 PC3 所在端口发出。

我们对比一下报文进出交换机前后的变化:

规律:IP 地址端到端不变,MAC 地址逐跳改变。 这也是路由转发最本质的特征。

五、判定流程汇总

注意这里还有一个细节:目的 MAC 是我的,并且目的 IP 也是我的(比如 PC 去 ping 网关、SSH 登录交换机),那就不是”转发”,而是上送 CPU 由交换机自己处理。

六、特殊报文的处理

基本逻辑讲完了,但真实网络里总有一些特殊情况,值得单独拎出来说说。

6.1 广播报文

PC1 发 ARP 请求问”谁是 192.168.10.1”时,目的 MAC 是广播地址 ff:ff:ff:ff:ff:ff,显然不是本机 MAC。

但交换机此时既会在 VLAN10 内泛洪,也会复制一份上送 CPU,因为 VLANIF10 本身也是这个广播域的成员,它需要看看这个 ARP 是不是在问自己。如果是,就回复 ARP 应答。

6.2 二层协议报文

STP 的 BPDU、LACP、LLDP 等协议报文使用 01:80:C2:00:00:xx 这类保留组播 MAC。它们的目的 MAC 不是本机接口 MAC,但交换机芯片会专门识别这些地址并上送 CPU 处理,而不是简单泛洪。

所以严格来说,”目的 MAC 不是本机就二层转发”是针对普通数据报文而言的。

6.3 VRRP 虚拟 MAC

配置了 VRRP 之后,主机的网关是虚拟 IP,ARP 解析到的是虚拟 MAC(如 00:00:5e:00:01:xx)。

处于 Master 状态的交换机,会把这个虚拟 MAC 也加入”本机 MAC”的判定范围。目的 MAC 命中虚拟 MAC 的报文,同样会进入三层转发。而 Backup 设备不会响应这个虚拟 MAC,确保同一时刻只有一台设备在做网关。

6.4 多个 VLANIF 共用系统 MAC

细心的同学会发现,很多交换机上 display interface Vlanif 或 show interface vlan 看到的 MAC 地址都一样,都是设备的系统 MAC。

这并不冲突,因为判定时匹配的是 “VLAN + MAC” 的组合。不同 VLAN 本来就是不同的广播域,用同一个 MAC 不会造成混乱。

6.5 主机掩码配置错误导致跨网段通信失败

理解了”主机决定目的 MAC”,很多故障就好排查了。

假设 PC1 的掩码被误配成了 255.255.0.0,它会认为 192.168.20.30 和自己在同一网段,于是直接 ARP 请求 192.168.20.30,而不是请求网关。

这个 ARP 广播只在 VLAN10 内传播,PC3 在 VLAN20 根本收不到,结果就是解析失败、无法通信。除非网关开启了代理 ARP 替 PC3 应答,否则这个问题会一直存在。

交换机配置完全正确,问题却出在主机的判断上。

七、硬件实现:ASIC 流水线中的本机 MAC 匹配

传统路由器早期依赖 CPU 做路由查表,性能有限。而三层交换机之所以能做到”线速路由”,关键在于整个判定和转发流程都在交换芯片(ASIC)里完成。

报文进入芯片后,会经过一条处理流水线(Pipeline),大致是:

其中”本机 MAC 匹配”这一步,在芯片中通常由一张专门的表来实现。不同厂商和芯片的叫法不同,比如 Broadcom 芯片中的 My Station TCAM,有的设备则是在 MAC 表项上打一个”三层标志位”。

当我们创建一个 VLANIF 并配置 IP 时,设备软件就会把”VLAN + 接口 MAC”下发到这张表里。从这以后,所有匹配这个组合的报文,都会被芯片直接送入三层处理流程,全程不需要 CPU 参与。

只有少数情况需要 CPU 介入:

  • 目的 IP 是本机(管理流量、ping 网关)
  • 协议报文(ARP、OSPF、BPDU 等)
  • 三层转发时找不到下一跳的 ARP 表项,需要 CPU 触发 ARP 解析
  • TTL 超时等需要回送 ICMP 的情况

判定和转发交给硬件,”异常”交给 CPU,这就是三层交换机高性能的秘密。

八、总结

回到开头的问题:

三层交换机凭什么决定一个包是二层转发还是三层转发?

答案是:看目的 MAC 是不是自己的。

而这个判据之所以可靠,是因为真正的”决策”早在主机发包时就已经做出了:主机用子网掩码判断目的 IP 是否同网段,再通过 ARP 决定目的 MAC 填谁。交换机只是读懂了主机留在报文里的这个”暗号”。

理解了这一点,你再看 ARP、网关、VRRP、掩码配置这些知识点,会发现它们其实都串在同一条逻辑线上。

网络的很多”神奇”之处,拆开来看,往往就是一个简单而巧妙的约定。