打通局域网“最后一公里”:ARP协议原理、流程与安全解析

目录

[一、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 的局限性与安全风险)

局限性:

安全风险:

7、总结

[二、ARP 数据包格式(ARP Packet Format)](#二、ARP 数据包格式(ARP Packet Format))

[1、ARP 报文结构(共 28 字节)](#1、ARP 报文结构(共 28 字节))

[2、ARP 报文如何封装进以太网帧?](#2、ARP 报文如何封装进以太网帧?)

3、关于"填充"(Padding)的正确理解

[4、ARP 帧示例(十六进制)](#4、ARP 帧示例(十六进制))

[ARP 请求(广播):](#ARP 请求(广播):)

[ARP 应答(单播):](#ARP 应答(单播):)

[5、总结:ARP 与以太网帧的关系](#5、总结:ARP 与以太网帧的关系)

6、结语

[三、ARP 请求的完整过程](#三、ARP 请求的完整过程)

1、触发条件

[2、构建 ARP 请求报文](#2、构建 ARP 请求报文)

背景说明:

举例:

[3、封装为以太网帧(MAC 帧)](#3、封装为以太网帧(MAC 帧))

正确理解如下:

总结对比:

举例:

4、广播发送与接收处理

(1)发送

(2)接收方处理流程(每台主机执行)

[5、为什么目标 MAC 在 ARP 报文中是全 0?](#5、为什么目标 MAC 在 ARP 报文中是全 0?)

6、完整流程图(简化版)

7、常见误区澄清

[8、总结:ARP 请求的核心特点](#8、总结:ARP 请求的核心特点)

[四、ARP 应答的完整过程](#四、ARP 应答的完整过程)

1、触发条件

[2、构建 ARP 应答报文](#2、构建 ARP 应答报文)

[3、封装为以太网帧(MAC 帧)](#3、封装为以太网帧(MAC 帧))

4、发送与接收处理

(1)发送

(2)接收方处理

[5、ARP 应答 vs ARP 请求:关键对比](#5、ARP 应答 vs ARP 请求:关键对比)

6、常见误区澄清

[7、总结:ARP 应答的核心特点](#7、总结:ARP 应答的核心特点)

8、延伸思考

[五、ARP 缓存表(ARP Cache)](#五、ARP 缓存表(ARP Cache))

[1、什么是 ARP 缓存表?](#1、什么是 ARP 缓存表?)

[2、为什么 ARP 报文中要包含源/目的 MAC 和 IP 字段?](#2、为什么 ARP 报文中要包含源/目的 MAC 和 IP 字段?)

[常见误解:"因为 MAC 帧已经有这些地址,ARP 不需要再带。"](#常见误解:“因为 MAC 帧已经有这些地址,ARP 不需要再带。”)

正确解释:

3、为什么不直接用广播发送普通数据包?

如果所有通信都用广播:

正确做法:

[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 的局限性)

6、为什么要有缓存表?为什么表项要有过期时间?

[为什么要有 ARP 缓存表?](#为什么要有 ARP 缓存表?)

为什么表项要有过期时间(TTL)?

[7、ARP 数据报的格式(结合工作流程)](#7、ARP 数据报的格式(结合工作流程))

工作流程中的关键点:

8、总结对比

结语


一、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 地址 • 请求时填全 000: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 校验值 由网卡硬件计算

此时完整的以太网帧构建完成,准备发送。

正确理解如下:

  1. ARP 请求报文(网络层)内容中:目标硬件地址(Target Hardware Address)字段 :设为 00:00:00:00:00:00 → 表示"我还不知道这个 MAC 地址,正在查询"。

  2. 以太网帧(数据链路层)封装时:目的 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)接收方处理流程(每台主机执行)

  1. 链路层

    • 检查目的 MAC:若为 FF:FF:FF:FF:FF:FF(广播)或本机 MAC → 接收并向上交付

    • 否则丢弃(但广播帧会被所有主机接收)。

  2. 检查帧类型 :若 Type = 0x0806 → 将有效载荷 (28 字节 ARP 报文)交给 ARP 协议模块

  3. 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 的语义映射;

根本原因

  1. 协议解耦 :ARP 是独立于底层链路技术的协议。虽然在以太网中 MAC 地址出现在帧头,但在其他网络(如令牌环、FDDI)中,硬件地址格式不同。ARP 报文内部必须显式携带地址信息,才能在各种链路类型上通用。

  2. 应答构造需要 :主机 B 在收到 ARP 请求后,必须知道"是谁在问我",才能正确填写应答中的"目标 MAC/IP"。这些信息只能来自 ARP 报文内部,不能依赖帧头(因为帧头在跨设备时会被剥离)。

  3. 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 流量触发过程。

相关推荐
网硕互联的小客服17 小时前
服务器 CPU 温度过高需要进行的物理处理和软件处理有哪些?
运维·服务器
北辰当尹17 小时前
【实习之旅】Kali虚拟机桥接模式ping通百度
java·服务器·桥接模式
阿巴~阿巴~17 小时前
从不可靠到100%可靠:TCP与网络设计的工程智慧全景解析
运维·服务器·网络·网络协议·tcp/ip·智能路由器
飞翔的小->子>弹->18 小时前
CMK、CEK
服务器·数据库·oracle
持续升级打怪中18 小时前
WebSocket:从“写信”到“打电话”的实时通信革命
网络·websocket·网络协议
learning-striving18 小时前
eNSP中OSPF协议多区域的配置实验
网络·智能路由器·ensp·通信
三两肉18 小时前
深入理解 HTTPS RSA 握手:从原理到流程的完整解析
网络协议·http·https·rsa·tls四次握手
食咗未18 小时前
Linux iptables工具的使用
linux·运维·服务器·驱动开发·网络协议·信息与通信
阿巴~阿巴~18 小时前
从IP到MAC,从内网到公网:解密局域网通信与互联网连接的完整路径
服务器·网络·网络协议·架构·智能路由器·tcp·arp