ARP 协议详情

文章目录

  • [1 ARP概要](#1 ARP概要)
  • [2 ARP的工作机制](#2 ARP的工作机制)
  • [3 ARP报文格式](#3 ARP报文格式)
  • [4 IP地址和MAC地址缺一不可](#4 IP地址和MAC地址缺一不可)
  • [5 RARP](#5 RARP)
  • [6 Gratuitous ARP (GARP)](#6 Gratuitous ARP (GARP))
  • [7 代理ARP](#7 代理ARP)

只要确定了 IP 地址,就可以向目标地址发送 IP 包。

然而,在数据链路层中,进行实际通信时有必要了解每个 IP 地址所对应的 MAC 地址。

1 ARP概要

ARP 是一种地址解析协议。

以目标 IP 地址为线索,ARP 用来定位应该接收数据包的网络设备对应的 MAC 地址。

如果目标主机不在同一数据链路上,可以通过 ARP 查找下一跳路由器的 MAC 地址。

不过,ARP 只适用于 IPv4,不适用于 IPv6。

IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息。

2 ARP的工作机制

ARP 是如何知道 MAC 地址的呢?

简单来说,ARP 是借助 ARP 请求与 ARP 响应这两种类型的数据包确定 MAC 地址的。

假设主机 A 向同一数据链路上的主机 B 发送 IP 包,主机 A 的 IP 地址为 172.20.1.1,主机 B 的 IP 地址为 172.20.1.2,它们并不知道对方的 MAC 地址。

主机 A 为了获得主机 B 的 MAC 地址,起初要通过广播发送一个 ARP 请求包。

ARP 请求包中包含想了解 MAC 地址的主机的 IP 地址。

也就是说,ARP 请求包中已经包含主机 B 的 IP 地址 172.20.1.2。

由于广播的数据包可以被同一数据链路上所有的主机或路由器接收,因此 ARP 请求包会被这一数据链路上所有的主机和路由器进行解析。

如果 ARP 请求包中的目标 IP 地址与主机的 IP 地址一致,那么主机就将自己的 MAC 地址塞入 ARP 响应包返回给主机 A。

总之,发送 ARP 请求包是为了从 IP 地址获得 MAC 地址,回复 ARP 响应包是为了将自己的 MAC 地址告知对方。

由此,可以通过 ARP 从 IP 地址获得 MAC 地址,实现链路内的 IP 通信。

ARP 可以动态地进行地址解析,因此在 TCP/IP 的网络结构和网络通信中无须事先知道 MAC 地址究竟是什么,只要有 IP 地址即可。

如果每发送一个 IP 数据报都要进行一次 ARP 请求以此来确定 MAC 地址,那将会造成不必要的网络流量。

因此,通常的做法是将获取到的 MAC 地址缓存一段时间,即把第一次通过 ARP 获取到的 MAC 地址作为 IP 对 MAC 的映射关系记录到 ARP 缓存表中。

下一次再向这个 IP 地址发送 IP 数据报时不需要再重新发送 ARP 请求,而是直接使用缓存表当中的 MAC 地址进行 IP 数据报的发送。

每执行一次 ARP,其对应的缓存内容就会被清除。

不过,在清除之前可以不执行 ARP 就获取想要的 MAC 地址。

这样,在一定程度上防止了 ARP 数据包在网络上被大量广播的可能性。

一般来说,只要向某台主机发送过 IP 数据报,接下来继续向这台主机发送 IP 数据报的可能性会很高。

因此,这种缓存能够有效减少 ARP 数据包的发送,接收 ARP 请求的主机可以从 ARP 请求包中获取发送端主机的 IP 地址及其 MAC 地址。

这时它可以将 MAC 地址的信息缓存起来,从而根据发送端主机的 MAC 地址发送 ARP 响应包给发送端主机。

与之类似,接收到 IP 数据报的主机往往会继续返回 IP 数据报给发送端主机,以作为响应。

因此,在接收端主机缓存 MAC 地址是一种提高效率的方法。

不过,MAC 地址的缓存是有一定期限的。

超过这个期限,缓存的内容将被清除。

这使得 MAC 地址与 IP 地址的对应关系即使发生了变化,也依然能够将数据包正确地发送给目标地址。

3 ARP报文格式

ARP 数据包报文格式如下

Hardware Type:

  • 表示二层地址的类型,值 1 表示 MAC 地址是 48-bit 以太网地址。
  • 理论上支持 Token Ring、FDDI 等,现代网络中已经全部消亡。
  • 现代网络中 HTYPE 只能是 1,其他值在工程上直接判异常或忽略。

Protocol Type:

  • 表示要解析的三层协议类型。
  • 理论上可以是其他 L3 协议。
  • 现实中 ARP = IPv4 专用(PTYPE = 0x0800 → IPv4)。

HLEN:

  • 表示硬件地址长度(字节)。
  • Ethernet MAC 地址长度 = 6 字节 。
  • 与 HTYPE=1 强绑定。

PLEN:

  • 标识三层协议地址长度(字节)。
  • IPv4 地址 = 4 字节。
  • 与 PTYPE = 0x0800 强绑定。

Opcode:

含义 当前状态
1 ARP Request,ARP 请求 广泛使用
2 ARP Reply,ARP 响应 广泛使用

Sender Hardware Address(Sender MAC Address)

  • 表示发送方的物理地址(现在都是指 MAC 地址)。
  • 长度 HLEN(6 字节)。
  • 对于 Request / Reply 都必须填。
  • 是 ARP 学习表(ARP Cache)更新的核心依据。

Sender Protocol Address(Sender IP Address)

  • 表示发送方的三层协议地址(现在都是 IPv4 地址)。
  • 长度 PLEN(4 字节)。
  • 与 SHA 一起构成:IP → MAC 映射关系。

Target Hardware Address(Target MAC Address)

  • 不同报文中的含义存在差异。
  • ARP Request 中:THA = 00:00:00:00:00:00(因为还不知道目标 MAC)。
  • ARP Reply 中:THA = 请求方的 MAC, 明确指定接收者。

Target Protocol Address(Target IP Address)

  • 表示要查询的 IPv4 地址。
  • Request:"谁是这个 IP?"。
  • Reply:"这个 IP 是我"。

请求报文抓包:

响应报文抓包:

4 IP地址和MAC地址缺一不可

有些人可能会提出这样的疑问:"数据链路上只要知道接收端的 MAC 地址不就知道数据准备发送给哪台主机了吗,还需要知道它的 IP 地址干嘛"。

乍听起来确实让人觉得好像是在做多余的事。

此外,还有些人可能会质疑:"只要知道 IP 地址,即使不做 ARP,只要在数据链路上做一个广播不就能将数据发送给主机了吗?"为什么既需要 IP 地址又需要 MAC 地址呢?

如果考虑发送给另一个数据链路中某台主机的情况,这件事就不难理解了。

如下图所示,当主机 A 想发送 IP 数据报给主机 B 时,必须经过路由器 C。

即使知道了主机 B 的 MAC 地址,由于路由器 C 会隔断两个网络,因此也无法实现直接从主机 A 发送 IP 数据报给主机 B。

此时,主机 A 需要将 IP 数据报发送给路由器 C 的 MAC 地址 C1。

此外,如果 MAC 地址就用广播地址,那么路由器 D 将会收到该广播消息。

于是,路由器 D 将该消息转发给路由器 C,导致 IP 数据报被重复发送两次

为了防止这种现象的发生,目前路由器可以做到不再转发 MAC 地址变成广播地址的 IP 数据报。

在以太网中发送 IP 数据报时,"下次要经由哪个路由器发送 IP 数据报"这一信息非常重要。

这里的 "下一个路由器" 就是相应的 MAC 地址。

如此看来,IP 地址和 MAC 地址缺一不可,于是就有将这两个地址相关联的 ARP。

最后再试想一下,不使用 IP 地址,而是通过 MAC 地址连接世界上所有网络中的所有主机和节点。

仅凭一个 MAC 地址,我们是无法知道这台设备所处的位置的。

如果全世界的设备都使用 MAC 地址相连,那么网桥在习得之前就得向全世界发送 IP 数据报,那将会造成巨大的网络流量。

而且,由于没有任何集中管理机制,因此网桥不得不通过维护一张巨大的表格来维护所学到的所有 MAC 地址。

一旦这些信息超过网桥所能承受的极限,将会导致网桥无法正常工作,也就无法实现通信了。

5 RARP

RARP(Reverse Address Resolution Protocol)是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议。

智能手机和个人计算机通常都是通过 DHCP 自动获取 IP 地址的,服务器的 IP 地址多由管理员手动输入。

但对于嵌入式设备而言,会遇到没有 IP 地址的输入界面、不支持 DHCP 或无法通过 DHCP 动态获取 IP 地址的情况。

在类似情况下,我们可以使用 RARP。

为此,需要架设一台 RARP 服务器从而在 RARP 服务器上注册设备的 MAC 地址及其 IP 地址。

然后再将这台设备接入网络,插电启动设备时,该设备会发送一条"我的MAC地址是***,请告诉我,我的 IP 地址应该是什么"的请求信息。

RARP 服务器接到消息后返回类似于"MAC 地址为的设备,IP 地址为"的信息给这台设备。

设备根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。

6 Gratuitous ARP (GARP)

Gratuitous 一词有"无理由的"、"没必要的"的意思,GARP 是主机为了查询自己的 IP 地址对应的 MAC 地址而发送的 ARP 数据包。

也就是说,在发送 ARP 请求包时,主机将自己的 IP 地址设置为目标 IP 地址,向其他设备询问该 IP 地址对应的 MAC 地址。

为什么明明知道自己的 MAC 地址是什么,还要特意去询问呢?

其实,GARP 的用途之一是检查是否有重复的 IP 地址。

向自己的 IP 地址发送 ARP 请求包是收不到响应的,一旦收到响应,那就说明该 IP 地址已被其他主机使用了。

GARP 还具有更新沿途交换机 MAC 地址学习表的功能,也可在主机需要更新自己的 IP 地址和 MAC 地址的对应关系时使用。

7 代理ARP

同一网段(子网)内的主机在传送 IP 数据报时,使用的是普通的 ARP。

代理 ARP(Proxy ARP)适用于在不使用路由控制表的情况下,将 IP 数据报发送到另一个网段。

此时,采用代理 ARP 的路由器可以将 ARP 请求包转发给邻近的网段(子网)。

作为响应,路由器将返回自身的 MAC 地址给发送端主机。

于是,发送端主机将 IP 数据报发送给路由器。

路由器再将接收到的 IP 数据报转发给目标节点。

这样一来,多个网段中的节点就好像是在同一个网段中进行通信一样。

通过路由器连接多个网段时,现在的 TCP/IP 网络通常会在每个网段上定义子网,并根据路由控制表进行路由控制。

然而,对于那些不支持设置子网掩码或路由控制表的老设备,或在多个子网有所重叠的 VPN 环境中,有时还是要使用代理 ARP。

相关推荐
嵌入式×边缘AI:打怪升级日志8 小时前
[特殊字符] USBX 学习笔记(基于 Azure® RTOS)
网络
米羊1219 小时前
Linux 内核漏洞提权
网络·安全·web安全
运维行者_9 小时前
2026 技术升级,OpManager 新增 AI 网络拓扑与带宽预测功能
运维·网络·数据库·人工智能·安全·web安全·自动化
Ar呐10 小时前
软考网规篇之局域网——网关冗余技术VRRP
网络·计算机网络
头发还没掉光光10 小时前
HTTP协议从基础到实战全解析
linux·服务器·网络·c++·网络协议·http
漂洋过海的鱼儿10 小时前
设计模式——EIT构型(三)
java·网络·设计模式
数通工程师11 小时前
企业级硬件防火墙基础配置实战:从初始化到规则上线全流程
运维·网络·网络协议·tcp/ip·华为
血色橄榄枝11 小时前
03 基于Flutter集成网络请求On OpenHarmony
网络·flutter
Godspeed Zhao11 小时前
现代智能汽车中的无线技术41——BT与BLE(0)
网络·汽车
那就回到过去12 小时前
PIM-DM断言机制和剪枝否决机制
网络·tcp/ip·智能路由器·ensp