目录
[APR 协议](#APR 协议)
[ARP 报文结构](#ARP 报文结构)
[ARP 工作流程](#ARP 工作流程)
[ARP 缓存(ARP Cache)](#ARP 缓存(ARP Cache))
[ARP 请求](#ARP 请求)
[ARP 响应](#ARP 响应)
[ARP 请求后未收到响应](#ARP 请求后未收到响应)
[免费 ARP(Gratuitous ARP)](#免费 ARP(Gratuitous ARP))
APR 协议
ARP(Address Resolution Protocol,地址解析协议) :是一种用于将 IP 地址 解析为对应的 MAC 地址 的网络协议,主要用于局域网(LAN)内部通信
在局域网 中,数据帧的传输 依赖与MAC 地址,而网络层 使用的是 IP 地址 ,ARP 的作用就是在已知目标 IP 地址 的前提下,获取其对应的 MAC 地址,从而完成数据帧的封装和发送
例如:主机 A(IP: 192.168.1.10)想向主机 B(IP: 192.168.1.20)发送数据,但不知道 B 的 MAC 地址 → A 发送 ARP 请求 → B 回复 ARP 响应 → A 得到 B 的 MAC 地址 → 开始通信
ARP 报文结构
|-----------------|--------|-------------------|
| 字段名 | 长度(字节) | 说明 |
| 硬件类型 | 2 | 如以太网=1 |
| 协议类型 | 2 | 如IPv4=0x0800 |
| 硬件地址长度 | 1 | MAC 地址长度,通常为 6 |
| 协议地址长度 | 1 | IP 地址长度,通常为 4 |
| 操作码(OpCode) | 2 | 1=请求,2=应答 |
| 发送方 MAC 地址 | 6 | 发送者的物理地址 |
| 发送方 IP 地址 | 4 | 发送者的 IP 地址 |
| 目标 MAC 地址 | 6 | 请求时为全0,应答时为目标 MAC |
| 目标 IP 地址 | 4 | 要查询的 IP 地址 |
ARP 工作流程
当 主机 A 想要向同一局域网内的 主机 B 发送数据时:
- 主机 A 查看自己的ARP 缓存表,看是否有主机 B 的 IP 对应的 MAC 地址。
- 如果没有,则广播发送一个 ARP 请求报文 (目标 MAC 为FF:FF:FF:FF:FF:FF)。
- 局域网内所有主机收到该请求,只有目标 IP 匹配的主机 B 会响应。
- 主机 B 回复一个 ARP 应答报文(单播),包含自己的 MAC 地址。
- 主机 A 收到应答后,更新 ARP 缓存,并用该 MAC 地址封装数据帧发送给主机 B。

ARP 缓存(ARP Cache)
操作系统维护了一个 ARP 缓存表 ,记录 IP 地址与 MAC 地址的映射关系,避免频繁广播
查看:
windows:arp -a
Linux:arp -n 或 ip neigh
例如:

其中:
dynamic :表示该条目通过 ARP 协议动态学习到
static :表示是系统预设,不需要学习
其中,动态 ARP 条目有超时时间(TTL),而静态 ARP 条目没有
ARP 缓存中的 动态条目 采用 "空闲超时"机制(idle timeout) ,即只要在 TTL 时间内,主机与目标 IP 之间有数据通信(发送或接收),系统就会重置该 ARP 条目的计时器,重新开始倒计时
例如:
假设当前操作系统的 TTL 设置为15min
在 10:00:00 通过 ARP 获取了 192.168.173.176 的 MAC 地址 → 动态条目创建,TTL=15分钟
在 10:05:00 时,ping 了一次 192.168.173.176 → 系统发现已有缓存,直接使用,同时重置 TTL 为 15 分钟(新到期时间:10:20:00)
在 10:18:00 又发了一次 HTTP 请求给该 IP → 再次重置 TTL(新到期时间:10:33:00)
从 10:33:00 开始,不再与该 IP 通信,则 条目将在 10:48:00 被系统自动删除
接下来,我们通过 wireshark抓包分析 ARP 请求与响应:

我们先来看ARP 请求
ARP 请求

thernet II 层(数据链路层):
源 MAC 地址:e0:0a:f6:a7:c5:37,即 发送方的物理地址
目的 MAC 地址 :ff:ff:ff:ff:ff:ff,广播地址,表示"发送给局域网内所有设备"
Type 字段:0x0806,表示上层是 ARP 协议
ARP 协议头:
字段 | 值 | 说明 |
---|---|---|
Hardware type | Ethernet (1) | 网络类型为以太网 |
Protocol type | IPv4 (0x0800) | 上层协议是 IPv4 |
Hardware size | 6 | MAC 地址长度为 6 字节 |
Protocol size | 4 | IP 地址长度为 4 字节 |
Opcode | request (1) | 类型为 ARP 请求 |
Sender MAC address | e0:0a:f6:a7:c5:37 |
发送者的 MAC 地址 |
Sender IP address | 192.168.173.131 |
发送者的 IP 地址 |
Target MAC address | 00:00:00:00:00:00 |
目标 MAC 未知,用全 0 表示 |
Target IP address | 192.168.173.225 |
要查询的目标 IP 地址 |
也就是说主机A 构造了一个 ARP 请求报文,主要包括:
源 IP:192.168.173.131
源 MAC:e0:0a:f6:a7:c5:37
目标 IP:192.168.173.225
目标 MAC:00:00:00:00:00:00(未知)
并将该报文封装在以太网帧 中,目标 MAC 设置为广播地址ff:ff:ff:ff:ff:ff,并将其广播到整个局域网,所有主机收到后会检查 目标 IP 是否是自己的 IP,若是,则回复 ARP 响应
接下来,我们继续来看 ARP 响应
ARP 响应

Ethernet II 层(数据链路层):
**源 MAC 地址:**b6:81:51:eb:37:37,回应方的物理地址
**目的 MAC 地址:**e0:0a:f6:a7:c5:37,之前发送 ARP 请求的主机 MAC地址
Type 字段:0x0806,表示上层是 ARP 协议
ARP 协议头:
|------------------------|---------------------|----------------------|
| 字段 | 值 | 说明 |
| Opcode | reply (2) | 类型为ARP 响应(不是请求) |
| Sender MAC address | b6:81:51:eb:37:37
| 发送者的 MAC 地址(即目标主机) |
| Sender IP address | 192.168.173.225
| 发送者的 IP 地址(即被查询的目标) |
| Target MAC address | e0:0a:f6:a7:c5:37
| 接收者的 MAC 地址(即请求者) |
| Target IP address | 192.168.173.131
| 接收者的 IP 地址(即发起请求的主机) |
即,主机 B 收到 ARP 请求,发现目标 IP 是自己,发送 ARP 响应:我是 192.168.173.225
,我的 MAC 是 b6:81:51:eb:37:37
,请用这个地址与我通信
主机 A 收到响应后,会将 192.168.173.225 → b6:81:51:eb:37:37 存入 ARP 缓存,后续通信可以直接使用该 MAC 地址封装数据帧
查看缓存是否更新:

ARP 缓存已成功添加
上述是 ARP 成功响应的情况,那若一段时间内 主机 A 未收到 ARP 响应,该如何处理呢?
ARP 请求后未收到响应
常见原因
首先,我们来分析什么情况下可能会出现收不到 ARP 响应:
|------------------|-----------------------------|
| 原因 | 说明 |
| 目标主机不存在或关机 | IP 地址无人使用 |
| 目标主机禁用了 ARP 响应 | 如防火墙、安全策略阻止 |
| 网络物理不通 | 网线断、交换机端口 down、VLAN 隔离等 |
| 广播被阻断 | 如无线 AP 隔离、路由器不转发广播、防火墙丢弃广播包 |
| 目标主机 ARP 缓存已满或异常 | 无法处理新请求 |
| 网络中存在 ARP 攻击或干扰 | 如泛洪导致包被丢弃 |
如何处理
ARP 请求会进行重传 ,操作系统不会只发一次 ARP 请求就放弃。通常会 重试多次 ,每次间隔递增
例如:
默认重试次数:3 次
默认超时间隔:约 1 秒 → 2 秒 → 4 秒(指数退避)
总等待时间 ≈ 7~8 秒
若此时仍无响应 ---> 返回 "目标主机不可达"
此时,操作系统会在 邻居表(Neighbor Table) 中将该 IP 标记为 FAILED,表示 该 IP 的 MAC 地址解析失败,暂时无法通信
并通知上层协议 "目标不可达":
TCP协议:
若是 TCP 连接(如访问网页、SSH)
→ TCP 层会持续重传 SYN 包,但因为底层 ARP 失败,数据帧无法发出
→ 最终 TCP 超时(通常几十秒后报错),此时应用层看到:"连接超时"、"No route to host"
UDP协议:
由于 UDP 无连接,因此会直接丢弃数据包,不通知应用层(除非应用自己实现超时)
后续恢复
即使 ARP 失败,系统也不会永久放弃:
再次重试:当应用再次尝试访问该 IP 时 → 触发新的 ARP 请求
收到 "免费 ARP" 或 "对方主动通信" 时恢复:如果目标主机之后上线并发送了免费 ARP 或任何数据包 → 本机自动更新邻居表,通信恢复正常
其中,免费 ARP(Gratuitous ARP) 是一种特殊的ARP 报文
免费 ARP(Gratuitous ARP)
免费 ARP(Gratuitous ARP) 是一种特殊的 ARP 报文,它不是为了 "请求解析" 某个 IP 的 MAC 地址,而是主动广播"自我声明" ,它的 "目标 IP" 与 "发送者 IP" 相同,主动宣告自己的 IP-MAC 映射关系,通常用于通知或刷新局域网内其他主机的 ARP 缓存
其报文格式如下示例:
Frame 100: Gratuitous ARP for 192.168.1.100
Ethernet II:
Src: aa:bb:cc:dd:ee:ff
Dst: ff:ff:ff:ff:ff:ff (广播)
ARP:
Opcode: request (1)
Sender IP: 192.168.1.100
Target IP: 192.168.1.100 ← 目标 IP = 自己 IP
Sender MAC: aa:bb:cc:dd:ee:ff
Target MAC: 00:00:00:00:00:00
表示:我是 192.168.1.100,MAC 是 aa:bb:cc:dd:ee:ff
其主要作用为:
检测 IP 地址冲突:
当主机开机或配置 IP 后,就会立即发送免费 ARP,如果局域网内已有主机使用相同 IP,此时可能会弹出警告或记录日志
主动刷新其他主机的 ARP 缓存:
当主机 MAC 地址变更(如更换网卡、虚拟机迁移、HSRP/VRRP 主备切换),就会发送免费 ARP → 告诉大家:"我的 IP 对应的 MAC 变了!"
接收方收到后,即使 ARP 缓存中已有该 IP 的条目,也会更新为新的 MAC
预热 ARP 缓存(提前注册):
服务器启动后立即广播免费 ARP → 让交换机和邻居提前学习 MAC 地址,从而减少后续通信的 ARP 延迟(首包不卡顿)
用于高可用协议(如 VRRP、HSRP、Keepalived):
虚拟路由器主备切换时,新主机会发送免费 ARP:"虚拟 IP 192.168.1.1 现在由我(新 MAC)负责",从而确保流量快速切换到新主机,避免通信中断