专栏:《计算机网络基础》· 第五篇·链路 / 物理层
承接:《以太网:局域网如何用 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)等机制有重叠气质

ip neigh

ip -6 neigh(同一套邻居表基础设施的不同地址族)

EtherType 0x0806

承载在 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 = 网关或对端 IPSender 填自己。
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 被过滤

tcpdump arp;核对 VLAN/隔离

只有 Request,没有 Reply

同上;或对端防火墙静默丢

到对端口抓包看是否收到 Request

有 Reply,MAC 合理,仍不通

上层过滤、非对称路径、策略

查防火墙 / 安全组;双向抓包

Reply 的 MAC 乱跳

IP 冲突、欺骗、错误代理

对比冲突双方;固化网关 MAC 观察

网关 FAILED,内网邻居却正常

网关口问题、网关宕、上行口隔离

单测网关;换口;查网关主机邻居

掩码不一致的「半边通」

假同网段

对齐双方 ip addr 前缀

IPv6 同链路不通

ND 失败、RA 问题、需指定出口的链路本地

ip -6 neightcpdump icmp6

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

期望:假地址走向 INCOMPLETEFAILED;真网关在通路正常时应能到 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 异常变化值得警惕
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐