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的工作流程很简单:
- 主机A想发IP包给主机B,但不知道B的MAC地址
- A发送ARP请求广播:“谁的IP是192.168.1.20?请告诉我你的MAC”
- B收到后,单播回复ARP响应:“我是,我的MAC是00:1A:2B:3C:4D:5F”
- 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:路径开销,用于同优先级路由的选路
你想想看,路由表是怎么来的?主要有三种来源:
- 直连路由:路由器自己接口上的网络,自动生成
- 静态路由:管理员手动配置的,比如“去192.168.2.0网段,走192.168.1.2”
- 动态路由:通过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在车载以太网中的应用——那又是一个很有意思的话题。