ARP 协议

发布于:2025-09-10 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

APR 协议

ARP 报文结构

ARP 工作流程

ARP 缓存(ARP Cache)

ARP 请求

ARP 响应

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)负责",从而确保流量快速切换到新主机,避免通信中断


网站公告

今日签到

点亮在社区的每一天
去签到