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 获取到的 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 和目标 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 头都要重新封装。