目录
[一、ARP 协议(Address Resolution Protocol)](#一、ARP 协议(Address Resolution Protocol))
[1、ARP 的作用:IP 地址 → MAC 地址的映射](#1、ARP 的作用:IP 地址 → MAC 地址的映射)
[2、ARP 的工作流程](#2、ARP 的工作流程)
[3、ARP 报文格式(以太网环境)](#3、ARP 报文格式(以太网环境))
[4、ARP 在协议栈中的定位(关键澄清)](#4、ARP 在协议栈中的定位(关键澄清))
[常见误解:"ARP 属于数据链路层协议。"](#常见误解:“ARP 属于数据链路层协议。”)
[正确理解(依据 RFC 826 和 TCP/IP 模型):](#正确理解(依据 RFC 826 和 TCP/IP 模型):)
[5、RARP 简介(历史背景)](#5、RARP 简介(历史背景))
[6、ARP 的局限性与安全风险](#6、ARP 的局限性与安全风险)
[二、ARP 数据包格式(ARP Packet Format)](#二、ARP 数据包格式(ARP Packet Format))
[1、ARP 报文结构(共 28 字节)](#1、ARP 报文结构(共 28 字节))
[2、ARP 报文如何封装进以太网帧?](#2、ARP 报文如何封装进以太网帧?)
[4、ARP 帧示例(十六进制)](#4、ARP 帧示例(十六进制))
[ARP 请求(广播):](#ARP 请求(广播):)
[ARP 应答(单播):](#ARP 应答(单播):)
[5、总结:ARP 与以太网帧的关系](#5、总结:ARP 与以太网帧的关系)
[三、ARP 请求的完整过程](#三、ARP 请求的完整过程)
[2、构建 ARP 请求报文](#2、构建 ARP 请求报文)
[3、封装为以太网帧(MAC 帧)](#3、封装为以太网帧(MAC 帧))
[5、为什么目标 MAC 在 ARP 报文中是全 0?](#5、为什么目标 MAC 在 ARP 报文中是全 0?)
[8、总结:ARP 请求的核心特点](#8、总结:ARP 请求的核心特点)
[四、ARP 应答的完整过程](#四、ARP 应答的完整过程)
[2、构建 ARP 应答报文](#2、构建 ARP 应答报文)
[3、封装为以太网帧(MAC 帧)](#3、封装为以太网帧(MAC 帧))
[5、ARP 应答 vs ARP 请求:关键对比](#5、ARP 应答 vs ARP 请求:关键对比)
[7、总结:ARP 应答的核心特点](#7、总结:ARP 应答的核心特点)
[五、ARP 缓存表(ARP Cache)](#五、ARP 缓存表(ARP Cache))
[1、什么是 ARP 缓存表?](#1、什么是 ARP 缓存表?)
[2、为什么 ARP 报文中要包含源/目的 MAC 和 IP 字段?](#2、为什么 ARP 报文中要包含源/目的 MAC 和 IP 字段?)
[常见误解:"因为 MAC 帧已经有这些地址,ARP 不需要再带。"](#常见误解:“因为 MAC 帧已经有这些地址,ARP 不需要再带。”)
[4、什么时候需要发起 ARP 请求?](#4、什么时候需要发起 ARP 请求?)
[5、RARP 协议(Reverse ARP)------历史回顾](#5、RARP 协议(Reverse ARP)——历史回顾)
[(1)RARP 的作用](#(1)RARP 的作用)
[(2)为什么 RARP 比 ARP 复杂?(纠正误区)](#(2)为什么 RARP 比 ARP 复杂?(纠正误区))
[(3)RARP 的局限性](#(3)RARP 的局限性)
[为什么要有 ARP 缓存表?](#为什么要有 ARP 缓存表?)
[7、ARP 数据报的格式(结合工作流程)](#7、ARP 数据报的格式(结合工作流程))
一、ARP 协议(Address Resolution Protocol)
1、ARP 的作用:IP 地址 → MAC 地址的映射
ARP (Address Resolution Protocol)是一种用于将 IPv4 地址解析为对应链路层硬件地址 (如以太网中的 MAC 地址)的协议。尽管我们在此讨论ARP协议,但需要明确指出:ARP并非纯粹的数据链路层协议,而是介于数据链路层和网络层之间的协议。
核心问题:
-
在同一个局域网(广播域)中,要发送数据帧,必须知道目标设备的 MAC 地址;
-
但应用程序和网络层通常只知道目标的 IP 地址;
因此需要一种机制,根据 IP 地址动态查询对应的 MAC 地址 ------ 这就是 ARP 的使命。
ARP协议建立了主机IP地址与MAC地址的映射关系。在网络通信过程中存在以下关键点:
-
源主机应用程序虽然知道目标主机的IP地址和端口号,但无法直接获取其硬件地址;
-
网络数据包首先由网卡接收,若数据包的目标MAC地址与本机不匹配,网卡会直接丢弃该数据包;
-
因此,通信前必须通过ARP协议获取目标主机的MAC地址。
示例场景:
-
路由器 D 需要将数据包发送给同网段的主机 B(IP: 192.168.1.100);
-
路由器 D 知道 B 的 IP,但不知道其 MAC;
-
路由器 D 发起 ARP 请求:"谁拥有 192.168.1.100?请回复你的 MAC!";
-
主机 B 收到后,单播回复自己的 MAC 地址;
-
路由器 D 将该映射缓存起来,并用它封装以太网帧。

2、ARP 的工作流程

关于这个过程,下面面会详细讲解:
-
源主机通过广播方式发送ARP请求,询问"IP地址192.168.0.1对应的MAC地址是什么"。该请求以广播帧形式发送至本地网段(以太网帧头部的目标MAC地址设置为全F的广播地址FF:FF:FF:FF:FF:FF)。
-
当目标主机收到该ARP请求后,会检查请求中的IP地址是否与自身匹配。若匹配成功,则向源主机返回ARP应答包,其中包含本机的MAC地址信息。
-
所有主机都会维护一个ARP缓存表(可通过arp -a命令查看)。缓存表中的条目通常具有20分钟的有效期,若在此期间未被使用,该条目将自动失效,需要重新发起ARP请求获取目标主机的MAC地址。
ARP 使用 广播请求 + 单播应答 的方式工作:
| 步骤 | 操作 | 帧类型 |
|---|---|---|
| 1 | 主机 A 想发数据给 IP=X,查本地 ARP 缓存无记录 | --- |
| 2 | A 构造 ARP 请求帧 : • 发送端 IP/MAC = A 的 IP/MAC • 目标 IP = X,目标 MAC = 00:00:00:00:00:00 |
广播帧(目的 MAC = FF:FF:FF:FF:FF:FF) |
| 3 | 局域网所有主机收到请求,只有 IP=X 的主机 B 响应 | --- |
| 4 | B 构造 ARP 应答帧 : • 发送端 IP/MAC = B 的 IP/MAC • 目标 IP/MAC = A 的 IP/MAC | 单播帧(目的 MAC = A 的 MAC)(因为此时的主机B它是收到主机A的IP/MAC地址,是已知量) |
| 5 | A 收到应答,将 (X, B's MAC) 存入 ARP 缓存(通常 20--120 秒) | --- |
优化机制:
-
免费 ARP(Gratuitous ARP):主机主动广播自己的 IP/MAC,用于检测 IP 冲突或更新邻居缓存;
-
ARP 缓存:避免频繁广播,提升效率。
3、ARP 报文格式(以太网环境)
ARP 报文作为以太网帧的有效载荷传输,其结构如下:
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型 | 2 字节 | 如 0x0001 表示以太网 |
| 协议类型 | 2 字节 | 如 0x0800 表示 IPv4 |
| 硬件地址长度 | 1 字节 | MAC 地址长度 = 6 |
| 协议地址长度 | 1 字节 | IP 地址长度 = 4 |
| 操作码(Opcode) | 2 字节 | 1=请求,2=应答 |
| 发送端 MAC | 6 字节 | --- |
| 发送端 IP | 4 字节 | --- |
| 目标 MAC | 6 字节 | 请求时为全 0 |
| 目标 IP | 4 字节 | 要解析的 IP |
注意: ARP 报文本身不包含 IP 头部 ,而是直接封装在以太网帧中,类型字段为 0x0806。
4、ARP 在协议栈中的定位(关键澄清)
这是最容易混淆的部分。我们来正本清源:
常见误解:"ARP 属于数据链路层协议。"
正确理解(依据 RFC 826 和 TCP/IP 模型):
-
ARP 是网络层的辅助协议 ,服务于 IP 协议;
-
它运行在数据链路层之上、IP 层之下 ,属于 "介于网络层与链路层之间的 glue protocol(粘合协议);
-
在 TCP/IP 四层模型 中,ARP 通常被归类为 网络层的一部分(尽管它不携带用户数据);
-
在 OSI 七层模型 中,ARP 被视为 Layer 2.5(介于数据链路层与网络层之间)。
协议栈关系图(自顶向下):
-
应用层 → HTTP, DNS
-
传输层 → TCP, UDP
-
网络层 → IP, ICMP, IGMP, ARP, RARP
-
数据链路层 → Ethernet (MAC 帧), Wi-Fi, PPP
-
物理层 → 电缆、光信号、无线电波

关键点:
-
ICMP/IGMP 是 IP 的上层协议(同属网络层,但依赖 IP 传输);
-
ARP/RARP 是 IP 的下层支撑协议(为 IP 提供链路层地址解析);
-
MAC 帧是链路层载体 ,其"上层协议"由以太网帧的 Type 字段 决定:
0x0800→ IPv4、0x0806→ ARP、0x8035→ RARP、0x86DD→ IPv6
因此,ARP 报文是以太网帧的"有效载荷" ,但它不属于链路层功能本身,而是为网络层服务的。
5、RARP 简介(历史背景)
-
RARP(Reverse ARP):根据 MAC 地址查询 IP 地址;
-
曾用于无盘工作站启动时获取 IP;
-
已被 DHCP 取代,现代网络中基本不再使用。
6、ARP 的局限性与安全风险
局限性:
-
仅适用于 IPv4 + 广播型链路(如以太网);
-
IPv6 使用 NDP(Neighbor Discovery Protocol,基于 ICMPv6)替代 ARP。
安全风险:
-
ARP 欺骗(ARP Spoofing):攻击者伪造 ARP 应答,劫持流量(中间人攻击);
-
防御措施:
-
静态 ARP 绑定(不推荐,难维护);
-
动态 ARP 检测(DAI);
-
使用 DHCP Snooping + 端口安全;
-
上层加密(如 HTTPS)可缓解危害。
-
7、总结
| 项目 | 说明 |
|---|---|
| 目的 | 将 IPv4 地址解析为 MAC 地址 |
| 工作范围 | 同一广播域(局域网)内 |
| 传输方式 | 以太网广播请求 + 单播应答 |
| 帧类型值 | 0x0806 |
| 协议层级 | 网络层的支撑协议(非纯链路层) |
| 缓存机制 | ARP 表(可通过 arp -a 查看) |
| 现代替代 | IPv6 使用 NDP(ICMPv6) |
一句话记住 ARP :"我知道你要去哪(IP),但快递员需要知道你家门口的门牌号(MAC)------ARP 就是那个上门问路的人。"
二、ARP 数据包格式(ARP Packet Format)
ARP(Address Resolution Protocol)报文是独立于以太网帧头的数据单元 ,它作为以太网帧的有效载荷 (Payload)进行传输。其格式由 RFC 826 定义,如下所示:
1、ARP 报文结构(共 28 字节)

在以太网首部和ARP请求中,源MAC地址和目的MAC地址会重复出现。
这种设计在以太网链路层环境下略显冗余,但对于其他类型的网络链路层可能是必要的。
关键字段说明:
-
硬件类型:标识链路层网络类型,1代表以太网
-
协议类型:指明待转换的地址类型,0x0800表示IP地址
-
硬件地址长度:以太网地址为6字节
-
协议地址长度:IP地址为4字节
-
op字段:1表示ARP请求,2表示ARP应答
各字段详解如下:
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型(Hardware Type) | 2 字节 | 指链路层网络类型 • 0x0001 = 以太网(Ethernet) • 其他值用于令牌环、FDDI 等(现已罕见) |
| 协议类型(Protocol Type) | 2 字节 | 指要解析的网络层协议地址类型 • 0x0800 = IPv4 地址 |
| 硬件地址长度(HLEN) | 1 字节 | 链路层地址长度(字节) • 以太网 MAC 地址 = 6 字节 |
| 协议地址长度(PLEN) | 1 字节 | 网络层地址长度(字节) • IPv4 地址 = 4 字节 |
| 操作码(Opcode, OP) | 2 字节 | 操作类型 • 1 = ARP 请求(Request) • 2 = ARP 应答(Reply) |
| 发送端硬件地址(Sender HA) | 6 字节 | 发送方 MAC 地址 |
| 发送端协议地址(Sender PA) | 4 字节 | 发送方 IP 地址 |
| 目标硬件地址(Target HA) | 6 字节 | 目标 MAC 地址 • 请求时填全 0 (00:00:00:00:00:00) • 应答时填真实 MAC |
| 目标协议地址(Target PA) | 4 字节 | 目标 IP 地址(即要解析的 IP) |
总长度 :2 + 2 + 1 + 1 + 2 + 6 + 4 + 6 + 4 = 28 字节
2、ARP 报文如何封装进以太网帧?
ARP 报文本身不包含以太网帧头 !它是被封装在以太网帧的"数据"部分中的。
完整的以太网帧结构如下:
| 字段 | 长度 | 内容 |
|---|---|---|
| 目的 MAC 地址 | 6 字节 | 广播(请求)或单播(应答) |
| 源 MAC 地址 | 6 字节 | 发送方 MAC |
| 类型字段(Type) | 2 字节 | 0x0806(表示上层是 ARP 协议) |
| ARP 报文 | 28 字节 | 如上所述 |
| 填充(Padding) | 0--18 字节 | 使整个帧 ≥ 64 字节(含头部) |
| FCS(CRC) | 4 字节 | 帧校验序列 |
关键澄清:
-
ARP 报文 ≠ 包含以太网首部;
-
以太网首部(目的/源 MAC + Type)是由链路层在封装时添加的;
-
ARP 报文只是"有效载荷",和 IP 包、UDP 数据一样,是 Type 字段指向的内容。
3、关于"填充"(Padding)的正确理解
-
以太网规定:MAC 帧总长度(不含前导码/SFD)最小为 64 字节;
-
以太网帧头(14 字节)+ ARP 报文(28 字节)= 42 字节;
-
42 < 64 → 需要 填充 18 字节(64 − 42 − 4[FCS] = 18);
-
填充由链路层自动添加,不属于 ARP 协议本身;
-
接收方在解析时会忽略填充部分,只提取前 28 字节作为 ARP 报文。
因此,正确的说法是:"ARP 报文长度为 28 字节,小于以太网最小载荷要求(46 字节),因此在封装为 MAC 帧时,链路层会自动添加填充字节,使帧总长达到 64 字节。"
错误说法纠正:
-
"ARP 数据格式中的前3个字段和最后一个字段对应的就是以太网首部" ------ 这是不正确的。
-
ARP 报文内部没有以太网首部字段 ,那些地址是协议解析所需的逻辑地址,不是帧头。
4、ARP 帧示例(十六进制)
ARP 请求(广播):
-
目的 MAC:FF:FF:FF:FF:FF:FF
-
源 MAC:08:00:27:03:fb:19
-
Type:0x0806
-
ARP 报文:
-
HTYPE=0001, PTYPE=0800, HLEN=06, PLEN=04, OP=0001
-
发送端 MAC:08:00:27:03:fb:19
-
发送端 IP:192.168.1.10
-
目标 MAC:00:00:00:00:00:00
-
目标 IP:192.168.1.20
-
-
Padding:18 字节(任意值)
-
FCS:...
ARP 应答(单播):
-
目的 MAC:08:00:27:03:fb:19 ← 请求方的 MAC
-
源 MAC:00:11:22:33:44:55 ← 应答方的 MAC
-
Type:0x0806
-
ARP 报文:
-
OP=0002
-
发送端 MAC:00:11:22:33:44:55
-
发送端 IP:192.168.1.20
-
目标 MAC:08:00:27:03:fb:19
-
目标 IP:192.168.1.10
-
-
Padding:18 字节
5、总结:ARP 与以太网帧的关系
| 概念 | 说明 |
|---|---|
| ARP 报文 | 28 字节,纯协议数据,无以太网头 |
| 以太网帧 | 封装 ARP 报文的载体,包含 MAC 头 + Type + Padding + FCS |
| Type 字段 | 0x0806 表示载荷是 ARP 报文 |
| 填充 | 由链路层添加,确保帧长 ≥ 64 字节,非 ARP 协议内容 |
| 协议层级 | ARP 是网络层辅助协议,通过以太网帧传输 |
6、结语
理解 ARP 报文格式及其与以太网帧的封装关系,是掌握局域网通信底层机制的关键一步。务必区分清楚:
-
协议数据 (ARP 报文) vs 传输载体(以太网帧);
-
逻辑地址 (ARP 中的 IP/MAC) vs 物理帧头(以太网 MAC 头)。
学习动手建议:使用 Wireshark 抓取 ARP 请求/应答包,观察:
-
以太网帧的 Type = 0x0806;
-
ARP 报文内部字段;
-
是否有 Padding(通常显示为
[Padding: ...])。
后面的知识点讲解将从:以路由器D向局域网内主机B转发数据为例:首先,路由器D需要获取主机B的MAC地址。虽然已知主机B的IP地址,但MAC地址未知。此时,路由器D会发送ARP请求,待收到主机B的ARP应答后,即可获得其MAC地址。
三、ARP 请求的完整过程
1、触发条件
当路由器 D(或任何主机)需要向同一局域网内的目标主机 B 发送数据,但本地 ARP 缓存中没有 B 的 MAC 地址时,就会触发 ARP 请求。示例:
-
路由器 D 的 IP:
192.168.1.1,MAC:AA:AA:AA:AA:AA:AA -
主机 B 的 IP:
192.168.1.100,MAC:未知
2、构建 ARP 请求报文
路由器 D 在 网络层/ARP 模块 中构造一个 28 字节的 ARP 请求报文,字段如下:
| 字段 | 值 | 说明 |
|---|---|---|
| 硬件类型(HTYPE) | 0x0001 |
表示以太网 |
| 协议类型(PTYPE) | 0x0800 |
表示 IPv4 |
| 硬件地址长度(HLEN) | 6 |
MAC 地址为 6 字节 |
| 协议地址长度(PLEN) | 4 |
IPv4 地址为 4 字节 |
| 操作码(OP) | 1 |
表示 ARP 请求 |
| 发送端硬件地址 | AA:AA:AA:AA:AA:AA |
路由器 D 的 MAC |
| 发送端协议地址 | 192.168.1.1 |
路由器 D 的 IP |
| 目标硬件地址 | 00:00:00:00:00:00 |
全 0(因为未知)⚠️ |
| 目标协议地址 | 192.168.1.100 |
要解析的 IP |
重要纠正 :目标硬件地址应设为全 0(00:00:00:00:00:00),不是全 1!
-
全 1(
FF:FF:FF:FF:FF:FF)是 以太网广播 MAC 地址 ,用于帧头; -
ARP 报文内部的"目标 MAC"字段在请求时必须为全 0(RFC 826 明确规定)。
"目标硬件地址应设为全 0(00:00:00:00:00:00)"通常出现在 ARP 请求(Address Resolution Protocol)中,意思是:
当主机还不知道目标 IP 地址对应的 MAC 地址时,在发送 ARP 请求帧时,将目标硬件地址(即目标 MAC 地址)字段填为全 0,表示"这个地址我还不知道,正在请求"。
背景说明:
-
ARP 协议用于根据已知的 IP 地址 查询对应的 MAC 地址。
-
在构造 ARP 请求报文时:
-
发送方硬件地址:本机的 MAC 地址(已知)。
-
发送方协议地址:本机的 IP 地址。
-
目标硬件地址 :未知,因此填为
00:00:00:00:00:00。 -
目标协议地址:要查询的目标 IP 地址。
-
举例:
若主机 A 想向 IP 为 192.168.1.10 的主机 B 发送数据,但不知道其 MAC 地址,则会广播一个 ARP 请求,其中:
-
目标硬件地址 =
00:00:00:00:00:00 -
目标协议地址 =
192.168.1.10
主机 B 收到后会回复自己的 MAC 地址,完成地址解析。所以,"目标硬件地址设为全 0" 是 ARP 协议中的标准做法,表示"待查询"。
3、封装为以太网帧(MAC 帧)
ARP 报文需作为有效载荷,交由数据链路层封装成以太网帧:
| 帧字段 | 值 | 说明 |
|---|---|---|
| 目的 MAC 地址(帧头) | FF:FF:FF:FF:FF:FF |
广播地址,确保局域网所有设备接收 |
| 源 MAC 地址(帧头) | AA:AA:AA:AA:AA:AA |
路由器 D 的 MAC |
| 类型字段(Type) | 0x0806 |
表示上层是 ARP 协议 |
| 有效载荷 | 上述 28 字节 ARP 请求 | --- |
| 填充(Padding) | 18 字节 | 使总帧长 ≥ 64 字节(14 + 28 + 18 + 4 = 64) |
| FCS | CRC-32 校验值 | 由网卡硬件计算 |
此时完整的以太网帧构建完成,准备发送。
正确理解如下:
-
ARP 请求报文(网络层)内容中:目标硬件地址(Target Hardware Address)字段 :设为
00:00:00:00:00:00→ 表示"我还不知道这个 MAC 地址,正在查询"。 -
以太网帧(数据链路层)封装时:目的 MAC 地址(帧头中的 Destination MAC) :设为 广播地址
FF:FF:FF:FF:FF:FF(全 1),不是全 0。→ 因为 ARP 请求要发送给局域网内所有主机,让拥有目标 IP 的设备响应。
总结对比:
| 层级 | 字段 | 值 | 含义 |
|---|---|---|---|
| 以太网帧头(数据链路层) | 目的 MAC 地址 | FF:FF:FF:FF:FF:FF |
广播,确保所有主机收到 ARP 请求 |
| ARP 报文内部(网络层) | 目标硬件地址 | 00:00:00:00:00:00 |
表示"待解析的 MAC 地址未知" |
举例:
当主机 A 发送 ARP 请求查询 192.168.1.10 的 MAC 地址时:
-
以太网帧头:
-
源 MAC:A 的 MAC
-
目的 MAC:
FF:FF:FF:FF:FF:FF(广播)
-
-
ARP 报文内容:
-
发送方 MAC/IP:A 的信息
-
目标 MAC:
00:00:00:00:00:00 -
目标 IP:
192.168.1.10
-
所以是因为 ARP 请求必须广播,所以数据链路层用广播地址封装。而 ARP 报文内部的目标硬件地址仍为全 0。
4、广播发送与接收处理
(1)发送
-
路由器 D 将该帧以广播方式发送到局域网;
-
所有连接到该广播域的设备(包括主机 B 和其他无关主机)都会收到此帧。
(2)接收方处理流程(每台主机执行)
-
链路层:
-
检查目的 MAC:若为
FF:FF:FF:FF:FF:FF(广播)或本机 MAC → 接收并向上交付; -
否则丢弃(但广播帧会被所有主机接收)。
-
-
检查帧类型 :若 Type =
0x0806→ 将有效载荷 (28 字节 ARP 报文)交给 ARP 协议模块。 -
ARP 层处理:
-
解析 ARP 报文,读取 目标协议地址 (即
192.168.1.100); -
对比本机 IP:
-
若匹配 → 构造 ARP 应答;
-
若不匹配 → 静默丢弃该 ARP 请求(不通知上层,无日志)。
-
-
关键点强调 :丢弃动作发生在 ARP 层,而非 MAC 帧层。所有主机都"看到"了这个广播帧,但只有目标主机会"响应"。
5、为什么目标 MAC 在 ARP 报文中是全 0?
这是 RFC 826 的设计规范:
-
ARP 请求的语义是:"谁拥有这个 IP?请告诉我你的 MAC";
-
因此,"目标 MAC"字段在请求时没有意义,必须置 0;
-
接收方在构造应答时,会用自己的 MAC 填入"发送端硬件地址",并将请求方的 MAC 填入"目标硬件地址"。
6、完整流程图(简化版)

7、常见误区澄清
| 误区 | 正确理解 |
|---|---|
| "ARP 请求中目标 MAC 设为全 1" | 应为全 0 ;全 1 是以太网帧头的广播地址 |
| "其他主机会在 MAC 层丢弃 ARP 请求" | 广播帧被所有主机接收,丢弃发生在 ARP 层 |
| "ARP 是链路层协议,所以由网卡处理" | ARP 由操作系统协议栈处理(软件实现),网卡只负责收发帧 |
8、总结:ARP 请求的核心特点
-
广播发送:确保目标主机一定能收到;
-
目标 MAC 字段为 0:表示"待查询";
-
全网接收,单点响应:效率高,开销可控;
-
依赖 IP 地址匹配:安全性和正确性由 IP 层保证;
-
自动缓存结果:后续通信无需重复请求。
实践建议:在 Linux 中可通过以下命令观察 ARP 行为:
bash
arp -a # 查看 ARP 缓存
tcpdump -i eth0 arp # 抓取 ARP 流量

四、ARP 应答的完整过程
1、触发条件
当主机 B 收到一个 ARP 请求 ,且发现其中的 目标 IP 地址与自己的 IP 地址匹配 时,就会构造并发送 ARP 应答(ARP Reply)。
示例回顾:
-
路由器 D 发出 ARP 请求:"谁有
192.168.1.100?我是192.168.1.1(MAC: AA:AA...)" -
主机 B 的 IP 正是
192.168.1.100→ 触发应答。
2、构建 ARP 应答报文
主机 B 根据收到的 ARP 请求内容,构造一个 28 字节的 ARP 应答报文,字段如下:
| 字段 | 值 | 来源说明 |
|---|---|---|
| 硬件类型(HTYPE) | 0x0001 |
与请求一致(以太网) |
| 协议类型(PTYPE) | 0x0800 |
与请求一致(IPv4) |
| 硬件地址长度(HLEN) | 6 |
MAC 地址长度 |
| 协议地址长度(PLEN) | 4 |
IPv4 地址长度 |
| 操作码(OP) | 2 |
表示 ARP 应答 ✅ |
| 发送端硬件地址 | BB:BB:BB:BB:BB:BB |
主机 B 自己的 MAC |
| 发送端协议地址 | 192.168.1.100 |
主机 B 自己的 IP |
| 目标硬件地址 | AA:AA:AA:AA:AA:AA |
来自 ARP 请求的"发送端 MAC" |
| 目标协议地址 | 192.168.1.1 |
来自 ARP 请求的"发送端 IP" |
关键点 :ARP 应答中的"目标地址"字段,直接复制自 ARP 请求中的"发送端地址",这是实现"点对点回复"的基础。

3、封装为以太网帧(MAC 帧)
ARP 应答报文被交由数据链路层封装成以太网帧:
| 帧字段 | 值 | 说明 |
|---|---|---|
| 目的 MAC 地址(帧头) | AA:AA:AA:AA:AA:AA |
路由器 D 的 MAC(单播) |
| 源 MAC 地址(帧头) | BB:BB:BB:BB:BB:BB |
主机 B 的 MAC |
| 类型字段(Type) | 0x0806 |
表示载荷为 ARP 报文 |
| 有效载荷 | 上述 28 字节 ARP 应答 | --- |
| 填充(Padding) | 18 字节 | 使帧总长 ≥ 64 字节(14 + 28 + 18 + 4 = 64) |
| FCS | CRC-32 校验值 | 由网卡计算 |
注意:
-
ARP 应答是单播帧,不是广播!
-
填充字节由链路层自动添加,不属于 ARP 协议内容,接收方会忽略。

4、发送与接收处理
(1)发送
-
主机 B 将该单播帧发送到局域网;
-
交换机会根据目的 MAC 地址,仅转发给路由器 D 所在端口(若使用交换机);
-
若使用集线器(Hub),则所有主机仍会收到,但处理方式不同(见下文)。
(2)接收方处理
-
路由器 D:
-
链路层检查目的 MAC → 匹配本机 → 接收;
-
检查 Type =
0x0806→ 将有效载荷交给 ARP 模块; -
ARP 层解析:OP=2 → 应答;
-
提取 发送端 MAC/IP → 得到
(192.168.1.100, BB:BB:...); -
更新本地 ARP 缓存,后续可直接通信。
-
-
其他主机(如主机 X):
-
链路层检查目的 MAC → 不匹配本机 MAC;
-
直接丢弃该帧,不向上交付;
-
不会进入 ARP 层,也不会产生任何日志或处理开销。
-
正确指出:"无关主机在 MAC 帧层就丢弃了,并没有将其交付给自己的 ARP 层。",这是单播通信高效性的体现。
5、ARP 应答 vs ARP 请求:关键对比
| 特性 | ARP 请求 | ARP 应答 |
|---|---|---|
| 操作码(OP) | 1 | 2 |
| 帧类型 | 广播(目的 MAC = FF:FF:FF:FF:FF:FF) | 单播(目的 MAC = 请求方 MAC) |
| 目标硬件地址(ARP 内部) | 全 0(00:00:00:00:00:00) |
请求方的 MAC |
| 接收范围 | 全局域网主机 | 仅目标主机(理论上) |
| 处理开销 | 所有主机需进入 ARP 层判断 | 仅目标主机处理,其余在 MAC 层丢弃 |
6、常见误区澄清
| 误区 | 正确理解 |
|---|---|
| "ARP 应答也需要广播" | 应答是单播,效率更高 |
| "填充字段是 ARP 协议的一部分" | 填充由以太网链路层添加,用于满足最小帧长要求 |
| "所有主机都会处理 ARP 应答" | 只有目的 MAC 匹配的主机会接收,其他在硬件/驱动层丢弃 |
7、总结:ARP 应答的核心特点
-
单播回复:精准送达请求方,减少网络干扰;
-
信息回填:将自身 MAC/IP 告知请求者;
-
高效处理:无关主机零开销;
-
缓存更新:请求方获得映射后可长期使用(受 ARP 缓存超时限制)。
实践验证:在 Linux 中执行:
bash
# 清除 ARP 缓存
sudo ip neigh flush all
# ping 一个新主机,触发 ARP
ping 192.168.1.100
# 查看 ARP 表,确认学到 MAC
arp -n
同时用 tcpdump -i eth0 arp 可观察到:请求是广播,应答是单播。
8、延伸思考
-
免费 ARP(Gratuitous ARP):主机主动发送"自己问自己"的 ARP 请求(目标 IP = 自己 IP),用于:
-
检测 IP 冲突;
-
更新交换机 MAC 表;
-
通知网络 MAC 地址变更。
-
-
代理 ARP(Proxy ARP):路由器代答非本地主机的 ARP 请求,用于透明子网扩展(现已少用)。
通过理解 ARP 请求与应答的完整交互,我们就能明白:局域网通信的"最后一公里",正是由 ARP 这一简单而精巧的协议打通的。
五、ARP 缓存表(ARP Cache)
1、什么是 ARP 缓存表?
每台支持 IPv4 的主机或路由器都会维护一个 ARP 缓存表 (也称邻居表),用于存储 IP 地址 ↔ MAC 地址 的映射关系,避免频繁发送 ARP 请求。
查看命令(Linux/macOS):
bash
arp -a # 传统命令

bash
ip neigh show # 现代推荐(显示更详细状态)

表项生命周期:
-
默认超时时间通常为 15--20 分钟(Linux 默认约 60 秒未使用即标记为 stale,最长可达数分钟);
-
若在超时前有通信,则表项被刷新;
-
超时后再次通信需重新发起 ARP 请求。
目的:减少广播流量,提升局域网效率。
2、为什么 ARP 报文中要包含源/目的 MAC 和 IP 字段?
常见误解:"因为 MAC 帧已经有这些地址,ARP 不需要再带。"
正确解释:
| 层级 | 职责 |
|---|---|
| 以太网帧(链路层) | 负责本跳传输:把数据从 A 的网卡送到 B 的网卡; |
| ARP 报文(网络辅助协议) | 负责逻辑地址解析:建立 IP 与 MAC 的语义映射; |
根本原因:
-
协议解耦 :ARP 是独立于底层链路技术的协议。虽然在以太网中 MAC 地址出现在帧头,但在其他网络(如令牌环、FDDI)中,硬件地址格式不同。ARP 报文内部必须显式携带地址信息,才能在各种链路类型上通用。
-
应答构造需要 :主机 B 在收到 ARP 请求后,必须知道"是谁在问我",才能正确填写应答中的"目标 MAC/IP"。这些信息只能来自 ARP 报文内部,不能依赖帧头(因为帧头在跨设备时会被剥离)。
-
RFC 826 设计要求 :ARP 报文是一个自包含的协议数据单元(PDU),必须包含完整的请求/应答上下文。
类比:就像快递包裹外有运单(相当于 MAC 帧头),但包裹里还有一张"收件人确认卡"(相当于 ARP 报文),上面写着"请张三签收"。即使运单写了张三,确认卡仍需重复信息,以便张三知道"这张卡是给我的"。
3、为什么不直接用广播发送普通数据包?
核心问题:资源浪费。我们来系统化分析:
如果所有通信都用广播:
-
带宽浪费:每台主机都要接收并处理本不属于自己的数据;
-
CPU 开销:即使 MAC 匹配,若用广播,所有主机都会将帧交给 IP 层;
-
安全风险:任何主机都能嗅探到他人通信(即使不处理);
-
违背分层原则:链路层应负责"本地投递",而不是把过滤责任推给网络层。
正确做法:
-
单播通信:通过 ARP 获取目标 MAC 后,直接点对点发送;
-
链路层过滤:网卡/驱动在硬件或驱动层丢弃非本机 MAC 的帧(除广播/多播外);
-
高效且安全。
关键原则 :"在尽可能低的层级丢弃无关数据" ------ 这是高性能网络系统的设计基石。
4、什么时候需要发起 ARP 请求?
-
每次需要向同一局域网内的 IP 发送数据,但 ARP 缓存中无对应表项时;
-
典型场景:
-
首次通信;
-
ARP 表项过期;
-
目标主机更换了网卡(MAC 变更);
-
使用
ip neigh flush手动清除缓存。
-
重要限制 :ARP 仅适用于同一广播域(即同一子网)。
-
主机 A(192.168.1.10)不能直接对主机 C(10.0.0.20)发起 ARP 请求;
-
必须先将数据发给默认网关(路由器),由路由器在其所在子网内发起 ARP。
5、RARP 协议(Reverse ARP)------历史回顾
(1)RARP 的作用
-
根据 MAC 地址查询 IP 地址;
-
主要用于 无盘工作站(Diskless Workstation)启动时获取自己的 IP。
(2)为什么 RARP 比 ARP 复杂?(纠正误区)
"RARP 一定比 ARP 简单" ------ 实际上恰恰相反!
原因:
-
ARP:任何主机都能响应(目标 IP = 自己);
-
RARP:只有配置了 RARP 服务器的主机才能响应;
-
普通主机无法回答"你的 IP 是多少",因为它不知道对方的 IP;
-
因此需要专门的 RARP 服务器维护 MAC → IP 的映射数据库。
(3)RARP 的局限性
-
仅支持 IPv4;
-
无法穿越路由器(与 ARP 一样,限于局域网);
-
无扩展性(需手动配置服务器);
-
已被 DHCP 完全取代。
现代替代方案 :无盘设备现在使用 DHCP(可分配 IP、网关、DNS 等),功能远超 RARP。
6、为什么要有缓存表?为什么表项要有过期时间?
为什么要有 ARP 缓存表?
-
提高效率:每次通信都发 ARP 请求会带来大量广播和延迟。通过缓存已解析的 IP-MAC 映射,后续通信可直接使用,避免重复查询。
-
减少网络开销:ARP 请求是广播帧,频繁广播会占用带宽、增加主机处理负担。缓存可显著降低广播频率。
为什么表项要有过期时间(TTL)?
-
应对网络变化:主机可能更换网卡(MAC 地址变)、IP 被重新分配、设备下线等。若缓存永久有效,会导致发送数据到错误或无效的 MAC 地址,造成通信失败。
-
保证准确性与安全性:防止因 stale(陈旧)条目导致的数据错发,也减少 ARP 欺骗等攻击的持久影响。
-
符合动态网络特性:局域网是动态环境,缓存应具备"时效性",过期后重新验证目标可达性。
通常 ARP 缓存项默认存活几分钟(如 Linux 默认约 60 秒未使用则过期)。
7、ARP 数据报的格式(结合工作流程)
ARP 报文封装在以太网帧中,其 ARP 协议数据单元(PDU)格式如下(以 IPv4 over Ethernet 为例):
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型(Hardware Type) | 2 字节 | 如 0x0001 表示以太网 |
| 协议类型(Protocol Type) | 2 字节 | 如 0x0800 表示 IPv4 |
| 硬件地址长度(HLEN) | 1 字节 | MAC 地址长度,通常为 6 |
| 协议地址长度(PLEN) | 1 字节 | IP 地址长度,IPv4 为 4 |
| 操作码(Opcode) | 2 字节 | 1 = ARP 请求,2 = ARP 应答 |
| 发送方硬件地址(Sender HA) | 6 字节 | 发送方 MAC 地址 |
| 发送方协议地址(Sender PA) | 4 字节 | 发送方 IP 地址 |
| 目标硬件地址(Target HA) | 6 字节 | 请求时为全 0,应答时为目标 MAC |
| 目标协议地址(Target PA) | 4 字节 | 要查询或响应的 IP 地址 |
工作流程中的关键点:
-
ARP 请求:
-
Opcode = 1
-
Target HA =
00:00:00:00:00:00 -
以太网帧目的地址 =
FF:FF:FF:FF:FF:FF(广播)
-
-
ARP 应答:
-
Opcode = 2
-
Target HA = 实际 MAC 地址
-
以太网帧目的地址 = 请求方的 MAC(单播)
-
8、总结对比
| 项目 | ARP | RARP |
|---|---|---|
| 方向 | IP → MAC | MAC → IP |
| 谁响应 | 目标主机自己 | 专用 RARP 服务器 |
| 是否需要服务器 | 否 | 是 |
| 现代使用情况 | 广泛使用(IPv4 必需) | 已废弃 |
| 替代协议 | IPv6 用 NDP | DHCP |
结语
ARP 缓存机制是局域网高效通信的"润滑剂",而对其设计原理的理解(如字段冗余、分层职责、广播代价)是掌握网络底层逻辑的关键。RARP 虽已退出历史舞台,但其存在揭示了早期网络自动配置的挑战,也反衬出 DHCP 和 IPv6 NDP 的优越性。
建议实践:
-
用
ip neigh观察 ARP 表项状态(reachable/stale/delay/probe);
-
用 Wireshark 抓包对比 ARP 请求/应答/免费 ARP;
-
尝试 ping 一个新 IP,观察 ARP 流量触发过程。