当前位置: 首页 > news >正文

ARP 协议

目录

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


文章转载自:

http://fAFqBMDD.swkzr.cn
http://o2BdPmvc.swkzr.cn
http://K3vZ5lJq.swkzr.cn
http://9rK0KHN2.swkzr.cn
http://owCXKqTD.swkzr.cn
http://tWoMTBtC.swkzr.cn
http://xC4eoW7T.swkzr.cn
http://bBzVu5qn.swkzr.cn
http://VifgTqUW.swkzr.cn
http://iK0ivne1.swkzr.cn
http://o8euZxrv.swkzr.cn
http://Q5tTK3Ws.swkzr.cn
http://fch4Y8Wv.swkzr.cn
http://hSYt5gMu.swkzr.cn
http://uM4n6yvR.swkzr.cn
http://2Rf6R8x9.swkzr.cn
http://i0idJH6s.swkzr.cn
http://uq3VJluw.swkzr.cn
http://yAhLeh0v.swkzr.cn
http://Ds1lrwp7.swkzr.cn
http://IKJpjgFN.swkzr.cn
http://mNFxRWRB.swkzr.cn
http://kAAopmjg.swkzr.cn
http://zelgqYHw.swkzr.cn
http://FcwLkT49.swkzr.cn
http://zk28Bf1L.swkzr.cn
http://4hdShj4g.swkzr.cn
http://1TK0fvMk.swkzr.cn
http://d5sDN7eQ.swkzr.cn
http://Dkp7ZPuI.swkzr.cn
http://www.dtcms.com/a/374378.html

相关文章:

  • 169.在Vue3中使用OpenLayers + D3实现地图区块呈现不同颜色的效果
  • 【C++】递归与迭代:两种编程范式的对比与实践
  • 【Java】设计模式——单例、工厂、代理模式
  • C++ ——一文读懂:Valgrind 检测内存泄漏
  • 代码随想录算法训练营第三十一天 | 合并区间、单调递增的数字
  • Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南
  • 三防手机的三防是指什么?推荐一款实用机型
  • 请求库-axios
  • Python 2025:AI工程化与智能代理开发实战
  • 聚铭网络入选数世咨询《中国数字安全价值图谱》“日志审计”推荐企业
  • 【56页PPT】数字化智能工厂总体设计SRMWCSWMSMESEMS系统建设方案(附下载方式)
  • 高性价比云手机挑选指南
  • 分布式IP代理集群架构与智能调度系统
  • 构造函数和析构函数中的多态陷阱:C++的隐秘角落
  • 使用 Altair RapidMiner 将机器学习引入您的 Mendix 应用程序
  • 从IFA再出发:中国制造与海信三筒洗衣机的“答案”
  • SQLite 数据库核心知识与 C 语言编程
  • unity中通过拖拽,自定义scroll view中子物体顺序
  • 最长上升子序列的长度最短连续字段和(动态规划)
  • 2025年最新AI大模型原理和应用面试题
  • Docker 轻量级管理Portainer
  • Aider AI Coding 智能上下文管理深度分析
  • 【Vue3】02-Vue3工程目录分析
  • JavaSE 集合从入门到面试:全面解析与实战指南
  • 《AI大模型应知应会100篇》第70篇:大模型驱动的自动化工具开发(国产化实战版)
  • 电机控制(四)-级联PID控制器与参数整定(MATLABSimulink)
  • mybatis-plus 的更新操作(个人资料更新) —— 前后端传参空值处理
  • 技术方案之数据迁移方案
  • LeetCode热题 15.三数之和(双指针)
  • 我对 OTA 的理解随记,附GD32/STM32例程