网络基础12 分钟阅读更新于 2026-07-30

ARP、MAC 地址和路由转发:知道 IP 后,包怎么走到下一跳

围绕ARP、MAC 头、交换机和路由器转发章节,讲清 IP 地址与 MAC 地址如何配合完成一跳一跳的转发。

相关工具

知道 IP 还不够,还要知道下一跳的 MAC

上一篇讲 IP、CIDR 和 NAT 时,我们已经知道:IP 地址负责说明目标主机属于哪个网络,路由器会根据目标网络号把包往下一跳转发。问题是,到了真正发送这一刻,网卡和以太网并不是直接拿 IP 地址发包。它们要看 MAC 地址。

资料 在 ARP 章节里把这个关系讲得很清楚:传输一个 IP 数据报时,源 IP 和目标 IP 确定以后,主机会通过路由表确定 IP 数据包的下一跳。但网络层下面是数据链路层,所以还需要知道“下一跳”的 MAC 地址。ARP 协议就是用来根据 IP 地址求 MAC 地址的。

这句话很适合作为入口:IP 负责端到端的目标,MAC 负责同一链路上的下一站。数据包要跨很多网络时,目标 IP 通常不变,但每一跳要交给谁,都要靠当前链路里的 MAC 地址重新说明。

ARP 的基本动作:广播问,单播答

ARP 的过程不复杂。主机想知道某个 IP 对应的 MAC 地址,就先发一个 ARP 请求。这个请求会以广播形式发到同一链路里的设备,里面包含一句意思很直白的话:谁拥有这个 IP?请把你的 MAC 地址告诉我。

同一链路里的所有设备都会收到这个请求。设备拆开 ARP 请求后,会检查里面的目标 IP 是否等于自己的 IP。如果不是自己,就忽略;如果正好是自己,就把自己的 MAC 地址放进 ARP 响应包,返回给发起请求的主机。

响应通常是单播回去的。主机拿到响应以后,就知道这个 IP 对应的 MAC 地址了,后续真正发送以太网帧时,就可以把这个 MAC 填到接收方 MAC 字段里。

ARP 根据 IP 查询 MAC 地址流程图,展示广播请求、单播响应和 ARP 缓存写入过程
ARP 请求与响应

ARP 通过广播请求寻找目标 IP 对应的 MAC 地址,再由目标主机单播返回响应,并写入本机缓存。

ARP 缓存:不能每次都广播

如果每发一个包都要广播一次 ARP,请求量很快就会变得难看。后文也回答了这个疑问:操作系统会把第一次通过 ARP 获取到的 MAC 地址缓存起来,下次需要同一个 IP 的 MAC 地址时,先查 ARP 缓存。

缓存命中,就直接用缓存里的 MAC 地址,不再广播查询。缓存没有命中,或者缓存已经过期,才重新发送 ARP 请求。这个缓存通常有有效期,超过时间后会被清理,避免网络设备变化以后还一直使用旧映射。

排查局域网问题时,ARP 缓存很值得看。Linux 下可以用 `arp -a` 查看缓存内容。Windows 也有类似命令。遇到换网关、换服务器网卡、虚拟机迁移后访问异常,有时不是路由不通,而是本机或中间设备还拿着过期的 IP-MAC 映射。

跨网段时,ARP 查的是网关

ARP 只能在同一链路里工作。主机如果发现目标 IP 和自己不在同一网段,它不会在本地广播“谁是远端服务器”。这个广播出不了当前链路,问也没有意义。它会先查路由表,把包交给默认网关或某条更具体路由对应的下一跳。

这时 ARP 查询的目标,是网关接口的 IP 对应的 MAC 地址。拿到网关 MAC 后,主机把以太网帧发给网关。注意,IP 头里的目标 IP 仍然是远端服务器,MAC 头里的目标 MAC 才是本地网关。

这就是很多网络排障里容易混的地方:目标 IP 是最终目的地,目标 MAC 是这一跳要交给谁。它们不是同一个层面的地址。跨网段通信时,第一跳的目标 MAC 往往是默认网关,而不是远端服务器。

MAC 头部:以太网帧要写清这一跳的收件人

资料 在 MAC 发送方和接收方部分写到,发送方 MAC 地址比较简单,网卡生产时已经写入,只要读出来填进 MAC 头部就可以。接收方 MAC 地址麻烦一些,需要先知道包应该交给谁,再通过 ARP 拿到对方的 MAC。

在 TCP/IP 通信里,MAC 头部还有协议类型字段。文中提到常见值包括 `0800` 表示 IP 协议,`0806` 表示 ARP 协议。也就是说,数据链路层收到帧以后,可以根据这个字段知道上层该把内容交给 IP 处理,还是交给 ARP 处理。

当网卡驱动拿到要发送的包后,会在开头加报头和起始帧分界符,在末尾加 FCS 帧校验序列。FCS 用来检查包在传输中是否损坏。最后,网卡把这些二进制信息转换成电信号,真正发到网线或无线链路上。

交换机:按 MAC 地址表转发

数据帧离开主机后,局域网里经常先经过交换机。文中说,交换机工作在 MAC 层,也叫二层网络设备。它的设计目标是把网络包原样转发到目的地,不像路由器那样按 IP 网络做跨网段转发。

交换机收到电信号后,会转成数字信号,检查 FCS,没有问题就放进缓冲区。这里有一个细节:普通网卡会检查接收方 MAC 地址是不是自己,不是就丢掉;交换机端口不这么做,它会接收进入端口的包,再查自己的 MAC 地址表。

MAC 地址表记录两类信息:设备的 MAC 地址,以及这个设备连在哪个交换机端口上。交换机查到目标 MAC 在哪个端口,就把帧从对应端口发出去。这个过程不关心目标 IP 属于哪个网段,只看二层的 MAC 转发。

MAC 地址表没有记录怎么办

如果交换机的 MAC 地址表里找不到目标 MAC,它不能凭空知道该从哪个端口转发。文中说,这种情况下交换机会把包转发到除了源端口以外的所有端口。目标设备无论接在哪个端口,都有机会收到。

这听起来有点粗,但符合以太网的设计:包可以被发到网络里,真正的接收者会收下,其他设备会忽略。等目标设备返回响应后,交换机就能从响应包里学习到它的 MAC 地址和端口,下次再发就可以定向转发。

如果接收方 MAC 本身就是广播地址,比如 `FF:FF:FF:FF:FF:FF`,交换机也会把包发到除源端口之外的所有端口。ARP 请求就是典型例子。它一开始就是广播,所以交换机会帮它扩散到当前链路里。

路由器:收到给自己的帧,再看 IP 往哪转

路由器和交换机都查表转发,但查的表不同。文中把区别说得很明确:路由器基于 IP 设计,是三层网络设备;交换机基于以太网设计,是二层网络设备。路由器的各个端口都有 MAC 地址和 IP 地址,而交换机端口通常不具有 MAC 地址。

路由器收到帧时,会先检查 MAC 头里的接收方 MAC 地址是不是自己端口的 MAC。如果不是,就丢弃;如果是,说明这一跳已经送到路由器了。接下来,路由器会去掉旧的 MAC 头,因为这个 MAC 头的任务已经完成。

之后路由器看 IP 头,根据目标 IP 查询路由表,判断应该从哪个端口发出去、下一跳是谁。到了发送阶段,它又要为下一段链路重新封装 MAC 头:源 MAC 写输出端口的 MAC,目标 MAC 写下一跳设备的 MAC。

跨网段通信中 IP 地址不变 MAC 地址每一跳变化的路由转发示意图
跨网段转发时 IP 不变,MAC 每跳变化

路由器按 IP 路由表选择下一跳,并在每一跳重新封装 MAC 头;源 IP 和目标 IP 端到端保持不变。

源 IP 和目标 IP 为什么不变

资料 在路由转发部分有一句很关键:网络包传输过程中,源 IP 和目标 IP 始终不会变,一直变化的是 MAC 地址。原因在于 IP 地址描述的是端到端通信,MAC 地址描述的是以太网内两个相邻设备之间的传输。

可以把一次跨网段通信想成寄一封信。信封里的最终地址没有变,但每经过一个中转站,中转站会决定下一段交给谁送。MAC 头就像这一段路的交接单,到了下一站就完成任务;下一站继续转发时,会重新写一张新的交接单。

当然,遇到 NAT 时源 IP 可能会被改写,这是另一类机制,上一篇已经讲过。这里讨论的是普通路由转发:路由器根据目标 IP 选择下一跳,但不会把 IP 头里的源地址和目标地址随便改掉。

RARP:方向相反,但现在少见

文中还提到 RARP。ARP 是已知 IP 地址求 MAC 地址;RARP 正好相反,是已知 MAC 地址求 IP 地址。早期一些小型嵌入式设备、打印机服务器接入网络时,可能用这种方式获取自己的 IP。

RARP 通常需要一台服务器,提前登记设备的 MAC 地址和对应 IP。设备接入网络后,通过自己的 MAC 地址去查询应该使用哪个 IP。这个思路能解决无盘或轻量设备启动时“不知道自己 IP”的问题。

现在日常办公和服务器环境里,更常见的是 DHCP 自动分配 IP。RARP 作为概念仍然有用,因为它帮助你看清 ARP 家族在解决什么问题:地址体系之间需要互相映射,只是查询方向不同。

排查时按层次看

网络不通时,别一上来就怀疑所有东西。先看 IP 层:本机 IP、子网掩码、默认网关是否正确,目标地址是否在同一网段,路由表有没有合适的下一跳。IP 层判断错了,后面 ARP 再正常也没有用。

再看 ARP:同网段访问失败,可能是 ARP 没查到、缓存过期、缓存错误,或者目标设备根本不在当前链路。跨网段访问失败,则要看本机是否拿到了网关 MAC,而不是远端服务器 MAC。

最后看交换机和路由器:交换机主要查 MAC 地址表,路由器主要查路由表。交换机负责同一链路内把帧送到正确端口,路由器负责跨网段选择下一跳。把这几个角色分开,很多“能 ping 网关但不能访问外网”“同网段有的通有的不通”的问题会清楚很多。

面试里怎么讲

如果被问 ARP,可以这样答:ARP 用于根据 IP 地址查询同一链路内设备的 MAC 地址。主机先广播 ARP 请求,目标 IP 匹配的设备返回 ARP 响应,发起方拿到 MAC 后写入 ARP 缓存,后续通信可以直接使用缓存。

如果被问交换机和路由器的区别,可以抓住层次:交换机是二层设备,按 MAC 地址表转发帧;路由器是三层设备,按 IP 路由表选择下一跳,并在每一跳重新封装 MAC 头。

如果被问为什么跨网段传输时 MAC 会变,可以说:IP 地址描述端到端目标,源 IP 和目标 IP 通常保持不变;MAC 地址只在当前链路内有效,每经过一个路由器,旧 MAC 头完成任务,下一跳需要新的源 MAC 和目标 MAC。

常见问题

ARP 查询的是最终服务器的 MAC 吗?

不一定。同一网段内查询目标主机的 MAC;跨网段时,主机通常查询默认网关的 MAC,把包先交给网关。

交换机和路由器最核心的区别是什么?

交换机按 MAC 地址表在同一链路内转发帧;路由器按 IP 路由表在不同网络之间选择下一跳。

为什么源 IP 和目标 IP 通常不变,但 MAC 地址会变?

IP 地址用于端到端寻址,MAC 地址用于当前链路的一跳传输。每经过一个路由器,下一段链路的 MAC 头都要重新封装。

计算机网络

继续阅读

返回专题