目的

  1. 学习 ARP 协议原理,掌握 ARP 请求数据报以及响应数据包的各自特点
  2. 学会使用 Wireshark 分析 ARP 数据报,掌握请求以及响应数据报的分析方法以及各自的特点。
  3. 分析免费 ARP 的特点,并与正常 ARP 请求的数据报作对比

ARP(Address Resolution Protocol)

简介

ARP 的全称是 Address Resolution Protocol,直译过来是 地址解析协议。对应的 RFC 文档是 RFC826。它的作用是把 IP 地址转换为 MAC 地址。为什么需要做这件事呢?

这是因为 TCP/IP 网络协议栈是分层的,每层负责不同的功能。IP 层(layer 3)负责路由寻路,换句话说,如果目的机器和客户端不在同一个网络,IP 层会穿过错综复杂的中间网络(互联网)找到目的机器所在的网络。

当报文在某一个网络中传播时(可能源机器和目的机器本来就在同一个网络,也可能报文在路由过程中执行下一跳步骤),IP 层的功能就没有用了,这时候起作用的是 2 层网络(链路层),大多数情况下就是以太网。以太网负责把多个机器连到一起,组成一个最小单位的局域网。在以太网中,不同机器的标识是 MAC 地址,MAC 地址是机器在生产的时候厂商为机器设定的。

有了 MAC 地址,同一个以太网络上的两台机器才能够通信。机器 A 需要知道机器 B 的 MAC 地址,才能发送以太网帧;交换机收到报文之后,根据目的 MAC 地址决定应该从哪个端口发送出去;目的机器读取报文的 MAC 地址才能知道报文是不是要发给自己的。

最开始的时候,机器 A 只知道目的地址的 IP(用户用某种方式输入 IP 地址,或者通过 DNS 解析出来 IP 地址),不知道对方的 MAC 地址。这时候,机器 A 会发送 ARP 报文,去查询机器 B 的 MAC 地址,拿到 MAC 地址,就能完成通信的过程。

ARP 协议的内容,以及怎么拿到 MAC 地址就是这篇文章接下来要讲解的。

原理

  1. 机器 A 想和同一个以太网络的机器 B 通信,A 会现在自己的 ARP 表中查找 B 的 MAC 地址,如果能找到就直接发送以太网帧;如果没有找到,就跳到第二步
  2. 机器 A 发送 ARP 请求报文去查询机器 B 的 MAC 地址,这是个以太网广播报文,因此交换机会广播到网络中所有的机器
  3. 各个主机接收到 ARP 请求报文,如果发现 ARP 报文中询问的 IP 地址和自己不同,则直接丢弃;机器 B 发现 ARP 报文中询问的 IP 地址是自己的主机地址,则生成一个 ARP 应答报文,把自己的 MAC 地址填到报文中,发送给机器 A,这个报文是单播报文,不会发送给其他主机;同时机器 B 也会把机器 A 的 ARP 记录缓存起来
  4. 机器 A 接收到 B 发来的 ARP 应答,读取报文中 B 的 MAC 地址,使用这个 MAC 地址和机器 B 进行后续的通信,同时把它缓存到系统中

协议格式

ARP 报文格式如下图所示,对于 IP 地址转换为 MAC 地址来说,ARP 报文长度为 28 字节。

ARP Format

各个字段的含义为:

  • Hardware Type:传输 ARP 报文的物理网络类型,最常见的是以太网类型,对应的值是 1。这个字段的长度是 2 字节
  • Protocol Type:网络报文类型,字段长度是 2 字节。最常用的是 IPv4 报文,对应的值是 2048(十六进制为 0x0800,这和以太网帧中帧类型字段使用的 IP 报文类型相同,这是有意设计的)
  • Hardware Address Length(Hardware size):物理地址长度,字段长度是 1 比特。ARP 协议报文中物理地址(MAC 地址)有多少比特,对于大部分网络来说,这个值是 6(因为 MAC 地址是 6 个字节,48 比特长)
  • Protocol Address Length(Protocol size):网络地址长度,字段长度是 1 比特。表示 ARP 协议报文中网络地址(IP 地址)有多少比特,对于大部分网络来说,这个值是 4(因为 IPv4 地址是 4 个字节,32 比特)
  • Opcode:ARP 报文的类型,接下来我们会看到几种不同的 ARP 报文。这个字段占用 2 个比特,值为 1 代表 ARP 请求报文,值为 2 代表 ARP 应答报文,3 代表 RARP 请求报文,4 代表 RARP 应答报文
  • Sender Hardware Address:当前 ARP 报文的发送方的物理地址(MAC 地址)
  • Send Protocol Address:当前 ARP 报文发送发的网络地址(IPv4 地址)
  • Target Hardware Address:当前 ARP 报文接收方的物理地址(MAC 地址),如果是 ARP 情况,这个字段为空(因为发送方正是因为不知道对方的 MAC 地址,才会使用 ARP 来解析)
  • Target Protocol Address:当前 ARP 报文接收方的网络地址(IPv4 地址)

需要注意的是,虽然 ARP 协议目前最常用的场景是把 IP 地址转换为 MAC 地址,但是它设计之初却是为了更一般的场景。它的硬件类型、协议类型就是为了指明要转换地址的双方;而硬件地址长度和协议地址长度指定双方的地址长度(每种协议的地址长度可以会发生变化),其对应的就是头部最后面四个地址长度。

也就是说,ARP 本身可以转换其他硬件地址和网络地址,而且允许它们的地址长度是可变的。这导致 ARP 协议现在看来是有点冗余的,毕竟 IPv4 和 MAC 地址长度都是固定的,没有必要在协议中指定。

ARP 发送出去会被封装在以太网帧里,ARP 报文中有发送端的 MAC 地址,而以太网帧的报文头部也包含了发送端的 MAC 地址,也就是说报文中有完全重复的信息。

抓包分析

下面是一对 ARP 请求与响应包

Packets

报文列表的 Info 字段,对应的内容是:

Who has 10.0.0.254? Tell 10.0.0.6

10.0.0.254 is at 00:00:39:cf:d9:cd

这是 wireshark 帮我们解析 ARP 报文,并用英语表达出来。这句话生动地概括了 ARP 请求的意思:谁知道 10.0.0.254 的物理地址?告诉 10.0.0.6. ARP 响应的意思:10.0.0.254 的物理地址是 00:00:39:cf:d9:cd.

第一个包(请求包):

First
  1. 数据帧大小 42 字节,全部被捕获
  2. 以太网源地址为本地 MAC 地址,目的地址为 全 1 的广播地址,类型为 ARP
  3. 此报文为 ARP request,物理网络类型:以太网,请求 IP: 10.0.0.254 的 MAC 地址

第二个包(响应包):

Second
  1. 数据帧大小 60 字节,全部被捕获
  2. 以太网目的地址为本机地址,源地址即为所查询 IP 的主机的 MAC 地址
  3. 此报文为 ARP 响应报文,物理网络类型:以太网,目的 IP 及 MAC 均对应我的主机,源 IP 为我主机请求 IP,源 MAC 即为 该 IP 对应 MAC 地址。

cache validation 报文

抓包的时候还看到了有一对 ARP 报文,它们是从机器 B 发来查询机器 A MAC 地址的。但 ARP 请求报文以太网帧的目的地址不是广播,而是机器 A 的 MAC 地址,原因是为了验证缓存的有效性!具体可查看下面的参考链接,

Gratuitous ARP

除了标准的 ARP 之外,还有一种特殊的 ARP 报文,称为 Gratuitous ARP(免费 ARP)。这个报文也是广播报文,它的特殊性在于,它的报文中发送端 IP 地址和接收端 IP 地址都被设置为发送该报文的主机 IP。为什么要有这样一个特殊的报文呢?因为它有用,比如:

  • 检测 IP 冲突。如果免费 ARP 请求接收到应答,说明当前网络上有另外一个和发送机器有相同 IP 的主机
  • 可以用来更新网络中当前机器的 ARP 缓存。如果机器重新配置了 IP 地址,那么免费 ARP 报文能够把新的 IP-MAC 匹配关系广播到网络中,接收到报文的机器更新自己的 ARP 缓存记录,这样就不会有因为 ARP 缓存失效导致的网络问题

如果机器 A 重新配置了 IP 地址,那么 MAC 与 IP 的对应关系就发生了变化,网络中保存的旧 ARP 表项都失效,无法继续使用,会导致 ping 错误。Linux 系统中可以使用 arping 命令行来发送 Gratuitous ARP,让网络中所有主机更新当前机器的 ARP 记录。

RARP

在抓包测试 ARP 协议时,抓到了 RARP 的包,于是经过一番查阅后,简要介绍一一下 RARP 协议(首先你要知道,它已经过时了)。

RARP(Reverse Address Resolution Protocol)是一个过时的被局域网中的客户机用来向网关路由器的 ARP 表请求自己的 IPv4 地址的网络协议。网络管理员在网关路由器上创建了 ARP 表,用来映射 MAC 地址与 IP 地址。

当一台新的机器被创建或任何没有内存存储自己的 IP 地址的机器需要一个 IP 地址供自己使用时,这台机器(称其为 A)发送 RARP 广播包,其中发送方和接收方的 MAC 都是它自己的 MAC 地址。

在局域网中,有一台主机被单独配置为 RARP 服务器,它负责回应这种广播包。RARP 服务器收到广播包之后,在 ARP 表中查找,如果有匹配的表项,则将 IP 地址放在返回包中,返回给 A。

RARP 在如今的网络中已经不被使用,因为有更加高效的协议比如: BOOTP(Boostrap Protocol) 和 DHCP。 RARP 可以满足主机 IP 地址配置的部分要求,但是不能完全满足包括但不限于以下配置:网络掩码,网关地址,静态路由,DNS 服务器,以及私有的,公有的 option 功能。 RARP 是二层协议,无法穿透子网,DHCP 可以穿透子网。

参考资料