4、路由转发原理:二层交换与三层路由的区别,MAC地址表与ARP表,路由表结构与最长前缀匹配

4.1 二层交换 vs 三层路由:本质区别在哪?

说实话,很多刚接触车载以太网的工程师,最容易搞混的就是二层交换和三层路由。我当年刚入行时也踩过这个坑——以为网关就是个“高级交换机”。其实完全不是一回事。

二层交换,说白了就是基于MAC地址做转发。它工作在数据链路层,只认MAC地址,不认IP。交换机收到一个数据帧,查一下MAC地址表,知道这个MAC在哪个端口,就直接扔过去。如果不知道,就广播一下,让设备自己回应。

三层路由就不一样了。它工作在网络层,看的是IP地址。路由器收到一个IP包,查路由表,决定下一跳是谁,然后把包转发出去。它不关心MAC地址——至少转发决策时不关心。

我打个比方你就明白了:

  • 二层交换就像小区里的快递柜——快递员只看门牌号(MAC),把包裹塞进对应的柜子。
  • 三层路由就像城市里的物流分拣中心——包裹上写的是城市名(IP),分拣员根据城市名决定发往哪个转运中心。

在车载以太网里,这两者经常混用。比如一个域控制器内部,多个ECU之间通信用二层交换就够了。但跨域通信,比如从智能座舱域到自动驾驶域,就必须走三层路由。

关键区别总结:

  • 二层交换:基于MAC,工作在同一个广播域内,转发速度快
  • 三层路由:基于IP,可以跨越不同网段,支持复杂路径选择
  • 网关设备通常同时具备这两种能力——这叫“三层交换机”或“路由交换一体机”

4.2 MAC地址表:交换机的“通讯录”

MAC地址表是二层交换的核心。它长什么样?我直接给你看一个典型的表结构:

MAC地址              VLAN   端口    类型
00:1A:2B:3C:4D:5E   10     eth0    动态
00:1A:2B:3C:4D:5F   10     eth1    动态
00:1A:2B:3C:4D:60   20     eth2    静态
FF:FF:FF:FF:FF:FF    -      -       广播

这张表是怎么建立的?靠学习。交换机收到一个数据帧,会记录源MAC地址和入端口。下次再有人要找这个MAC,交换机就知道往哪个端口发了。

我在项目中遇到过一个问题:某款车载交换机在CAN唤醒后,MAC地址表是空的。第一个数据帧进来时,交换机不知道目标在哪,只能广播。结果广播风暴把总线干崩了。后来我们在初始化阶段预置了一些静态MAC表项,问题才解决。

避坑指南:车载环境里,ECU可能会频繁上下电。每次上电MAC地址表都要重新学习,这期间会有短暂的广播泛洪。我建议对关键通信路径做静态MAC绑定,避免丢包。

4.3 ARP表:IP到MAC的“翻译官”

三层路由要转发IP包,但最终在物理链路上传输时,还是得用MAC地址。这就需要一个翻译——ARP协议。

ARP表就是缓存这个翻译结果的。它的结构大致如下:

IP地址              MAC地址             接口    类型
192.168.1.10       00:1A:2B:3C:4D:5E   eth0    动态
192.168.1.20       00:1A:2B:3C:4D:5F   eth0    动态
192.168.2.10       00:1A:2B:3C:4D:60   eth1    静态

ARP的工作流程很简单:

  1. 主机A想发IP包给主机B,但不知道B的MAC地址
  2. A发送ARP请求广播:“谁的IP是192.168.1.20?请告诉我你的MAC”
  3. B收到后,单播回复ARP响应:“我是,我的MAC是00:1A:2B:3C:4D:5F”
  4. A把结果缓存到ARP表,然后正常通信

嗯,这里要注意:ARP表是有老化时间的。车载环境里,ECU可能长时间不通信,ARP表项就过期了。下次通信时又要重新ARP请求,这会引入延迟。我建议把关键ECU的ARP表项设为静态,或者至少把老化时间调长一些。

我曾经踩过的坑:某次调试中,网关频繁丢包。查了半天,发现是ARP表老化时间设置太短(默认30秒)。ECU每隔40秒才发一次心跳,结果每次心跳都要重新ARP。把老化时间改成120秒后,问题消失。

4.4 路由表结构:网关的“导航地图”

路由表是三层路由的核心。它告诉路由器:要去某个网络,该走哪条路。一个典型的路由表长这样:

目标网络           子网掩码          下一跳          接口    优先级   Metric
0.0.0.0            0.0.0.0          192.168.1.1     eth0    0        0
192.168.1.0        255.255.255.0    0.0.0.0         eth0    0        0
192.168.2.0        255.255.255.0    192.168.1.2     eth0    10       1
10.0.0.0           255.0.0.0        10.0.0.1        eth1    0        0

我来解释一下各列的含义:

  • 目标网络:要到达的IP网段
  • 子网掩码:和目标网络一起,确定一个IP范围
  • 下一跳:数据包要发给谁。如果是0.0.0.0,表示直连网络,不需要经过其他路由器
  • 接口:从哪个物理端口发出去
  • 优先级:路由的优先等级,数值越小越优先
  • Metric:路径开销,用于同优先级路由的选路

你想想看,路由表是怎么来的?主要有三种来源:

  1. 直连路由:路由器自己接口上的网络,自动生成
  2. 静态路由:管理员手动配置的,比如“去192.168.2.0网段,走192.168.1.2”
  3. 动态路由:通过OSPF、RIP等协议自动学习到的

在车载以太网里,我建议尽量用静态路由。为什么?因为车载网络拓扑相对固定,ECU数量有限,静态路由简单可靠,没有协议开销,也不会出现路由环路。动态路由协议在车载环境里反而容易出问题——我见过某项目用OSPF,结果ECU重启后路由收敛太慢,导致通信中断好几秒。

4.5 最长前缀匹配:路由查找的核心算法

路由器收到一个IP包,怎么决定用哪条路由?答案是:最长前缀匹配。

说白了就是:路由表里可能有多个条目都能匹配目标IP,路由器会选择子网掩码最长(也就是最精确)的那一条。

举个例子:

路由表:
192.168.1.0/24    下一跳 A
192.168.1.0/25    下一跳 B
192.168.1.128/25  下一跳 C

目标IP:192.168.1.130

匹配过程:

  • 192.168.1.0/24 匹配吗?匹配(192.168.1.130在192.168.1.0/24范围内)
  • 192.168.1.0/25 匹配吗?不匹配(/25的范围是192.168.1.0~192.168.1.127)
  • 192.168.1.128/25 匹配吗?匹配(范围是192.168.1.128~192.168.1.255)

最终选择192.168.1.128/25,因为它的掩码长度是25,比24更长,更精确。

为什么需要最长前缀匹配?

如果没有这个机制,路由器可能会选择一条“大而化之”的路由,把包发到错误的方向。最长前缀匹配保证了最精确的路径优先。这在车载网络里特别重要——比如你有一条默认路由(0.0.0.0/0)指向外部网络,同时有一条精确路由(192.168.1.0/24)指向内部ECU。如果没有最长前缀匹配,所有流量都会走默认路由,内部通信就断了。

我个人习惯在配置路由表时,把精确路由放在前面,默认路由放在最后。虽然路由查找算法会自动做最长匹配,但这样配置更清晰,也方便排查问题。

4.6 实战:车载网关的路由配置示例

最后,我给你看一个实际的车载网关路由配置。假设网关有三个接口:

  • eth0:连接智能座舱域,网段192.168.1.0/24
  • eth1:连接自动驾驶域,网段192.168.2.0/24
  • eth2:连接T-Box(外部网络),网段10.0.0.0/8
# 直连路由(自动生成)
192.168.1.0/24 dev eth0
192.168.2.0/24 dev eth1
10.0.0.0/8 dev eth2

# 静态路由
# 座舱域访问自动驾驶域
192.168.2.0/24 via 192.168.1.1 dev eth0
# 自动驾驶域访问座舱域
192.168.1.0/24 via 192.168.2.1 dev eth1
# 默认路由:所有其他流量走T-Box
0.0.0.0/0 via 10.0.0.1 dev eth2

这个配置看起来简单,但实际部署时有很多细节要注意。比如:

  • 192.168.1.1和192.168.2.1是谁?它们是网关设备上两个不同接口的IP地址
  • 为什么座舱域访问自动驾驶域要经过网关?因为它们是不同网段,必须路由
  • 默认路由指向T-Box,意味着所有非内部流量都会走外部网络——这在安全上要格外小心

我的建议:在车载网关里,尽量把路由表条目控制在20条以内。太多条目会增加查找延迟,而且容易配错。如果网络规模大,考虑用VLAN划分广播域,而不是堆路由条目。

好了,这一章的内容就到这里。二层交换和三层路由的区别,说白了就是“看MAC还是看IP”的问题。MAC地址表、ARP表、路由表,这三张表是网关的“三驾马车”,缺一不可。下一章我们会深入聊聊VLAN在车载以太网中的应用——那又是一个很有意思的话题。