ARP 协议

目录

[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 发送数据时:

  1. 主机 A 查看自己的ARP 缓存表,看是否有主机 B 的 IP 对应的 MAC 地址。
  2. 如果没有,则广播发送一个 ARP 请求报文 (目标 MAC 为FF:FF:FF:FF:FF:FF)。
  3. 局域网内所有主机收到该请求,只有目标 IP 匹配的主机 B 会响应。
  4. 主机 B 回复一个 ARP 应答报文(单播),包含自己的 MAC 地址。
  5. 主机 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)负责",从而确保流量快速切换到新主机,避免通信中断

相关推荐
wanhengidc4 小时前
云手机就是虚拟机吗?
运维·网络·安全·智能手机
疾风铸境4 小时前
项目研发实录:电子称SDK封装dll给到QT和C#调用
linux·服务器·网络
wanhengidc5 小时前
使用云手机能否给企业降本增效
运维·网络·科技·游戏·智能手机
roshy5 小时前
SSE与Websocket、Http的关系
websocket·网络协议·http
2301_803554525 小时前
实习项目包装--HTTP 协议和 Web API
前端·网络协议·http
华强笔记5 小时前
KGDB(Kernel GNU Debugger)工具使用方法详解
网络·安全·gnu
自强的小白5 小时前
vlan(局部虚拟网)
网络·学习
徐子元竟然被占了!!6 小时前
RIP协议
网络·网络协议
Yuki’6 小时前
网络编程---TCP
服务器·网络·tcp/ip