ARP / ND:IP 地址如何变成「邻站门牌」MAC
专栏:《计算机网络基础》· 第五篇·链路 / 物理层
承接:《以太网:局域网如何用 MAC 与交换机转发帧》
讲解维度: 概念 → 原理 → 应用 → 问题定位
读完你能: 讲清 ARP 请求/应答;读懂 ip neigh;区分「同网段 ARP 失败」与「路由失败」;建立 ND 与 ARP 的对照直觉
导读:下一跳的 IP 有了,门牌号呢?
路由告诉你:去 10.0.5.20 要经网关 192.168.1.1,出口 eth0。
以太网却只认 MAC。缺口就是:
把「邻站 IP」翻译成「邻站 MAC」。
IPv4 世界里,主角是 ARP(Address Resolution Protocol);
IPv6 世界里,类似工作常由 ND(Neighbor Discovery)(基于 ICMPv6)完成。
上一篇交换机已经会按 MAC 转发了——可主机若填错目的 MAC,或根本解析不出网关 MAC,帧再漂亮也到不了该去的口。同网段 ping 不通时,第一件事常常不是改业务代码,而是看 邻居表有没有学到、是不是 FAILED。
已知:下一跳 IP = 192.168.1.1
未知:其 MAC = ?
ARP:喊一嗓子「谁是 192.168.1.1?」→ 对方应答自己的 MAC

一、概念:ARP / ND 各在认什么?
1.1 ARP 解决的问题
ARP:在局域网(同一广播域 / 通常即同一 VLAN)内,通过请求/应答,解析 IPv4 → MAC。
它跑在以太网之上时,EtherType 常见为 0x0806——你在上一篇 tcpdump -e 里已经见过这种帧。
|
报文 |
作用 |
|---|---|
|
ARP Request |
「谁是这个 IP?请告诉我 MAC」(通常广播) |
|
ARP Reply |
「是我,MAC 是 ……」(通常单播回请求者) |
解析结果缓存在 邻居表 / ARP 缓存,避免每次发包都广播扰民。缓存会过期、会探测、会失败——Linux 用一组状态把这些过程摊开,后面专节看。
1.2 它管什么 / 默认不管什么
|
它管 |
默认不管 |
|---|---|
|
邻站 IPv4 → MAC |
跨网段选路 |
|
本广播域内的请求/应答 |
「一定解析成功」(对端可关机、可被隔离) |
|
缓存与老化(实现相关) |
传输层端口、应用协议 |
|
(旁路能力)免费 ARP 宣告等 |
加密与认证(默认 ARP 不签) |
最容易说错的一句:
访问 8.8.8.8 时,ARP 解析的不是 8.8.8.8 的 MAC
而是「去 8.8.8.8 的下一跳」(通常是默认网关)的 MAC
远方主机没有、也不需要在你广播域里有一张以太网门牌。
1.3 ND(IPv6)对照:别换一套脑模型
|
IPv4 |
IPv6(直觉) |
|---|---|
|
ARP Request / Reply |
Neighbor Solicitation / Advertisement(NS / NA) |
|
以太网广播问「谁是此 IP」 |
常向被请求节点组播地址更定向地问 |
|
免费 ARP |
重复地址检测(DAD)等机制有重叠气质 |
|
|
|
|
EtherType |
承载在 ICMPv6 上(外层仍是 IPv6 / 以太网) |
本篇以 ARP 为主把排障肌肉练熟;见到 IPv6 同网段不通,就去看:
ip -6 neigh show
sudo tcpdump -ni eth0 icmp6
思路同构:邻居解析失败 vs 路由失败。不要因为换了地址族就先怀疑应用框架。
1.4 只解析「邻站」,不解析「远方」
目的 8.8.8.8
→ 路由说经 192.168.1.1
→ ARP 只问 192.168.1.1 的 MAC
→ 不会、也不能直接 ARP 出 8.8.8.8 的 MAC
和网络层边界一致:IP 头里写最终目的;每一跳链路封装只服务「此刻的邻站」。
掩码配错时,主机会误判「谁算邻站」——该 ARP 直达的去走了网关,或该走网关的却在本地广播瞎喊,表现会非常像鬼神
二、原理:报文、缓存、状态机与几种「变体」
2.1 ARP 报文:字段不必背全文,但要认得排障相关的
ARP 报文里有硬件类型、协议类型、操作码,以及两对「地址」:
Sender Hardware Address = 发送者 MAC
Sender Protocol Address = 发送者 IP
Target Hardware Address = 目标 MAC(请求里常为 0)
Target Protocol Address = 目标 IP(「谁是这个 IP?」里的那个)
操作码直觉:
|
op |
含义 |
|---|---|
|
1 |
request(请求) |
|
2 |
reply(应答) |
Request 常见形态:以太网目的 MAC 为全 F,里面问 Target Protocol Address = 网关或对端 IP,Sender 填自己。
Reply 常见形态:单播回到请求者,把「IP ↔ MAC」填实。
抓包时你不必对着 RFC 默写偏移;要能回答:
谁在问?问的是哪个 IP?
谁回答了?声称的 MAC 是什么?
回答是否出乎意料(例如多个不同 MAC 抢答)?
2.2 一次完整解析(主机侧剧本)
1) 查邻居表:已有可用条目?直接封装帧发送
2) 无:建 INCOMPLETE,发 ARP Request(广播)
3) 目标主机(或代理 ARP)回 Reply
4) 写入邻居表(如 REACHABLE),封装以太网帧发送
5) 之后一段时间内走缓存;过期后再探测或重新解析
交换机在这个过程中的角色:把广播 Request 扩散到广播域,把单播 Reply 送到请求者口——它通常不「替你生成 ARP 答案」(代理 ARP 是路由器/网关上的另一种故事)。
2.3 邻居表状态(Linux 够用版)
ip neigh show
ip neigh show dev eth0
|
状态 |
人话 |
|---|---|
|
REACHABLE |
最近确认过,可信,放心用 |
|
STALE |
过期了;再用时可能先确认一下 |
|
DELAY / PROBE |
正在确认对端是否还在 |
|
INCOMPLETE |
还在问、还没答上(常见于刚发起解析) |
|
FAILED |
解析失败——同网段故障强信号 |
|
PERMANENT 等 |
静态绑定(若有人配过) |
排障时重点看:网关 IP 是 REACHABLE、STALE,还是 FAILED / 长期 INCOMPLETE。
STALE 不一定是故障——很多系统里它只是「有一阵子没积极确认」。FAILED 才是「喊了没人理」或「路径上根本到不了应答」的强指纹。
示意:
$ ip neigh show
192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
192.168.1.20 dev eth0 lladdr 52:54:00:11:22:33 STALE
192.168.1.30 dev eth0 FAILED
第三条出现时,别先怀疑 TCP 参数——同网段三层都还没真正交出去。

2.4 免费 ARP(Gratuitous ARP):不是问答,是宣告
「免费」并不是不花钱,而是:不是为了问别人要答案,而是主动宣告自己的 IP↔MAC。常见触发:
网卡刚配置 / 刚 up 某地址
DHCP 客户端确认租约
高可用 VIP 漂移到新机器
某些栈的重复地址探测相关行为
交换机可能借此更新 MAC 地址表;其它主机可能更新邻居缓存。
若两台主机争同一 IP,你会看到冲突、间歇不通——邻居表在不同 MAC 间跳,业务像抽风。有一次双机热备脚本在切换时漏发了免费 ARP,结果半个机房还指着旧机器的 MAC,VIP「漂了」流量却没跟上;补宣告后才恢复。这类问题抓 ARP 比盯应用日志快。
2.5 代理 ARP(Proxy ARP):知道即可,疑难时想起来
某些网关会替「看起来在别处的 IP」回答 ARP,把流量吸到自己,再负责转发。旧网络、特殊迁移、错误子网设计里能见到。
后果直觉:
主机以为对端是二层邻居 → 实际流量进了网关
路径变长、排障变绕;有时和「掩码过大」叠加
现代干净的地址规划更少依赖代理 ARP;你不必把它当日常主菜,但当抓包显示「明明不是本机 IP,网关却抢着 Reply」时,别怀疑眼睛。
2.6 缓存过期与「突然 ping 一下又好了」
邻居条目会老化。过期后下一次发送可能触发探测:先单播问一声,不行再广播。
所以你能遇到这种工单:
业务超时报警 → 你一 ping 网关又好了
未必是你「治好了」;可能是探测唤醒了路径,或对端刚好从省电里回来,或中间设备 MAC 表重新学会了。真正排障仍要看:失败窗口里邻居状态是什么、有没有 Request 无 Reply、错包计数有没有在涨。
2.7 ARP 欺骗与安全直觉(不讲攻击教程)
默认 ARP 几乎是「谁喊一声都可以信」。广播域里若有人抢答,可能把自己插入路径(中间人)。工程师侧更实用的指纹:
ip neigh show to 192.168.1.1
# 记录正常网关 MAC;异常变化值得查
防御靠:静态绑定、动态 ARP 检查(DAI)、端口安全、网络隔离、把信任域切小等。
本专栏不展开如何攻击;只要求你在「网关 MAC 半夜变了、证书告警与流量异常同时出现」时,把二层邻居欺诈放进怀疑列表——而不是只重装客户端。
2.8 ND 再补半寸:和 ARP 同构的排查句式
IPv6 链路上常见还要打交道:
链路本地地址(fe80::/10)——同链路有效
路由器通告(RA)——前缀、默认路由从哪来
NS/NA —— 邻站解析与可达性确认
DAD —— 地址重复检测
同链路 ping 不通时:
ip -6 addr
ip -6 route
ip -6 neigh show
ping -6 fe80::xxxx%<iface> # 链路本地要带出口
RA 被关、被墙,或邻居 FAILED,都会让「IPv6 感觉时好时坏」。细节不必一次吞完;先把句式对齐 ARP:先链路,再邻居,再路由,再应用。
三、应用:哪些场景天天碰到 ARP / ND?
3.1 开机访问网关
笔记本拿到 192.168.1.23/24,默认路由是 192.168.1.1。打开浏览器的第一跳之前,几乎总会先解析网关 MAC。
网关宕机、口隔离、VLAN 错,表现都可能是:邻居 FAILED,外网全灭——但 ip link 仍显示 UP。
3.2 虚拟机热迁移 / 容器漂移
虚拟机搬到另一台宿主机后,MAC 可能仍在,但交换机旧口上的表项过期或指错。免费 ARP / RARP 一类宣告帮助路径收敛。
容器若共用或改写 MAC 的策略不同,云厂商还可能在虚拟交换机上做反欺骗——「我在虚拟机里改了 IP,ARP 却发不出去」并不罕见。
3.3 双机热备与 VIP
VIP 从主机 A 漂到主机 B 时,必须让周围设备更新「这个 IP 现在在新 MAC / 新口」。免费 ARP 是常见手段之一。漏宣告的故障前面提过:控制台显示切换成功,流量还在老路。
3.4 同网段主机互访
两台同前缀机器互访:ARP 直连目的 IP,不经网关。
若中间有「客户隔离」、交换机 ACL、云安全组对东向流量的隐式拒绝,你会看到 Request 出、Reply 无——和「对端关机」长得很像,要用对端是否存活、是否同 VLAN 交叉验证。
3.5 云上的广播与邻居
云环境里,虚拟交换机与安全策略可能限制广播;「ARP 行为与物理机房不完全一样」。
但 邻居表 FAILED 仍是好指纹:说明至少在你这台虚拟机看来,解析没有完成。下一步是区分:对端根本不在同一二层域、策略丢了 ARP、还是地址根本不存在。
四、问题定位:同网段不通时怎么证明?
4.1 先分层,避免把路由问题和 ARP 搅成一锅
ping 192.168.1.10(你认为的同网段)失败
│
├─ ip link 没有 LOWER_UP → 回物理/以太网专章
│
├─ 双方前缀/掩码不一致 → 假同网段(见 4.3)
│
├─ ip neigh 对端 FAILED / 一直 INCOMPLETE → ARP/过滤/隔离/关机/错 VLAN
│
├─ neigh 正常(REACHABLE)但仍不通 → 主机防火墙、对端服务、单边 ACL、策略路由
│
└─ 同网段通、仅跨网段不通 → 网关/路由(第四篇)
访问公网失败时,先看网关邻居,而不是先 ARP 1.1.1.1:
ip route get 1.1.1.1
ip neigh show to $(ip route show default | awk '/default/ {print $3; exit}')
4.2 故障速查
|
现象 |
ARP/ND 侧常见根因 |
先做什么 |
|---|---|---|
|
同网段 ping 不通,邻居 FAILED |
对端关机、错 VLAN、口隔离、IP 不存在、ARP 被过滤 |
|
|
只有 Request,没有 Reply |
同上;或对端防火墙静默丢 |
到对端口抓包看是否收到 Request |
|
有 Reply,MAC 合理,仍不通 |
上层过滤、非对称路径、策略 |
查防火墙 / 安全组;双向抓包 |
|
Reply 的 MAC 乱跳 |
IP 冲突、欺骗、错误代理 |
对比冲突双方;固化网关 MAC 观察 |
|
网关 FAILED,内网邻居却正常 |
网关口问题、网关宕、上行口隔离 |
单测网关;换口;查网关主机邻居 |
|
掩码不一致的「半边通」 |
假同网段 |
对齐双方 |
|
IPv6 同链路不通 |
ND 失败、RA 问题、需指定出口的链路本地 |
|
4.3 掩码配错:ARP 的「假同网段」
经典坑:
A: 192.168.1.10/24
B: 192.168.1.20/16 ← 掩码不同,双方对「是否同网段」理解不一致
可能出现:
A 认为 B 是邻居 → 直接 ARP 192.168.1.20
B 认为 A 在「别的地方」→ 把去 A 的包丢给自己的网关
结果是半边能通、回程怪、抓包只在一侧看见 ARP。
查通断时,双方掩码与地址规划一起看——只看「前两段长得像」不够。
4.4 抓包解读
sudo tcpdump -ni eth0 arp
sudo tcpdump -ni eth0 icmp6 # IPv6 / ND
|
抓包现象 |
可能含义 |
|---|---|
|
只有 Request,没有 Reply |
对端没开机、错 VLAN、口隔离、对端丢弃、IP 不在本网段 |
|
有 Reply,MAC 合理 |
ARP OK,问题在上层或过滤 |
|
多个不同 MAC 回答同一 IP |
冲突或欺骗嫌疑 |
|
Request 都发不出去 |
本机策略、网卡/驱动异常、错误出接口 |
|
云上 Request 无 Reply 但物理机房同配置正常 |
虚拟网络广播限制 / 安全策略 |
4.5 决策树

五、动手:把邻居解析摸实
在授权环境做。优先用两台同交换机(或同虚拟网)的机器。接口名、IP 请换成你的。生产上
ip neigh flush会导致短暂重新解析,选窗口。
实验 A:清空缓存 → ping → 看状态与 ARP 交互
主机 A 上(假设对端 B 为 192.168.1.20,网卡 eth0):
# 观察当前
ip neigh show to 192.168.1.20
# 授权环境下清空该接口邻居缓存(影响同口其它条目,谨慎)
sudo ip neigh flush dev eth0
# 另开一个终端抓 ARP
sudo tcpdump -ni eth0 arp -vv
# 原终端发起
ping -c 3 192.168.1.20
ip neigh show to 192.168.1.20
期望节奏:
1) flush 后条目消失或不再 REACHABLE
2) ping 触发 ARP Request(广播)
3) 见到 Reply
4) ip neigh 变为 REACHABLE(或很快经过 PROBE 类状态落到可用)
示意抓包:
12:10:01.100011 ARP, Request who-has 192.168.1.20 tell 192.168.1.10, length 28
12:10:01.100204 ARP, Reply 192.168.1.20 is-at 52:54:00:11:22:33, length 28
示意邻居表:
192.168.1.20 dev eth0 lladdr 52:54:00:11:22:33 REACHABLE
若只有 Request 重复出现、最终 FAILED,按第四节表格往 VLAN / 隔离 / 对端存活查,不要先调 tcp_tw 之类参数。
实验 B:公网目的 vs 网关邻居——证明「ARP 问的是谁」
ip route get 1.1.1.1
# 记下 via 与 dev,例如 via 192.168.1.1 dev eth0
sudo ip neigh flush dev eth0
sudo tcpdump -ni eth0 arp -c 20 &
ping -c 2 1.1.1.1
ip neigh show
期望:ARP 对话围绕 网关 IP(如 192.168.1.1),而不是 1.1.1.1。
邻居表里也不该出现「1.1.1.1 的以太网 MAC」这种正常条目(它不在你的广播域里)。
很多人第一次做这个实验会愣一下——这正是网络层与链路层边界上最值得留下肌肉记忆的画面。
实验 C:只看网关,对比 REACHABLE 与 FAILED
GW=$(ip route show default | awk '/default/ {print $3; exit}')
echo "default gateway: $GW"
ip neigh show to "$GW"
ping -c 2 "$GW"
ip neigh show to "$GW"
人为制造对照(思想实验或实验室):拔掉网关、或指到一个不存在的网关 IP,再:
sudo ip neigh flush dev eth0
ping -c 3 192.168.1.254 # 假设这是不存在的「假网关」
ip neigh show to 192.168.1.254
期望:假地址走向 INCOMPLETE → FAILED;真网关在通路正常时应能到 REACHABLE。
把这两种屏幕差记熟,以后看监控就不用猜。
实验 D(可选):IPv6 邻居对照
若环境有 IPv6 链路本地或同网段全球地址:
ip -6 neigh show
ping -6 -c 2 <对端地址>
sudo tcpdump -ni eth0 icmp6 -c 20
期望:能看到 Neighbor Solicitation / Advertisement 一类 ICMPv6 交互(具体显示名随 tcpdump 版本略异),且 ip -6 neigh 出现对端条目。链路本地记得带 %eth0 这类出口后缀。
本章小结
ARP/ND:邻站 IP → 邻站 MAC
只解析下一跳,不解析远方主机
邻居表 REACHABLE / FAILED 是同网段排障指纹
Request 无 Reply:关机、错 VLAN、隔离、过滤、地址错、冲突边缘
免费 ARP 用于宣告与漂移;代理 ARP 会把「假邻居」流量吸到网关
掩码不一致会造成假同网段
抓包 arp / icmp6 可一锤定音
默认 ARP 轻信——网关 MAC 异常变化值得警惕
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)