地址解析协议ARP

实际中,知道了一个主机或路由器的IP地址,需要找出其相应的硬件地址,怎么找?

地址解析协议ARP就是用来解决这个问题的。

ARP

ARP数据报格式

arp_format

以太网目的地址:全1,即广播报,发给局域网的所有主机一个ARP请求包。

以太网原地址:发送端主机的地址。

帧类型:链路层上层协议类型,0x0806表示APP。

硬件类型:链路层网络类型,0x0001表示以太网地址。

协议类型:0x0800表示IP协议。

OP操作:0x0001表示ARP请求,0x0002表示ARP应答,3表示RARP请求,4表示RARP应答。

发送端以太网地址:源主机MAC地址。

发送端IP地址:源主机IP地址。

目的端以太网地址:目标端MAC地址(若为请求报文,则全0)。

目的端IP地址:要接受主机的IP地址。

ARP要点

首先,IP协议使用了ARP协议,所以可将其划分在网络层。当然也可根据ARP的作用将其划分在数据链路层。

还有一个根据已知的硬件地址来找出IP地址的协议叫RARP协议,DHCP已经有了其功能,所以会在后续的DHCP协议介绍。

网络层使用的是IP地址,但在链路上传输数据帧时,最终还是要使用到硬件地址。又由于IP地址为32位,而局域网中硬件地址为48位,所以不能简单的认为IP与MAC地址之间只存在简单的映射关系。为了解决这个问题,ARP中在主机ARP高速缓存中存放了一个IP地址到硬件地址的映射表,并且映射表需要可以动态更新(新增或超时删除)。

下面的例子说明了,主机如何获取只写地址。

一个例子

当主机A向本局域网上的某台主机B发送数据报时,就会先在其ARP高速缓存中查看有无主机B的IP地址。

如果有,就将其硬件地址写入MAC帧,然后再发;

如果没有,即主机B有可能刚入网,也有可能主机A刚加电,其ARP cache还是空的。此时主机A就会运行ARP,按以下步骤找到主机B的硬件地址。

  1. ARP进程在本局域网广播发送一个ARP请求分组。如下图所示,其请求主要内容则是“我的IP是209.0.0.5,硬件地址为00-00-C0-15-AD-18,我想知道IP地址为209.0.0.6主机的硬件地址”。

    arp1

  2. 在本局域网上的所有主机上运行的ARP进程都会收到此ARP请求。

  3. 各主机检查IP后只有主机B收下此ARP请求,并向主机A发送ARP响应分组,同时在这个分组中写下自己的硬件地址。如下图,ARP响应分组的主要内容是“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。”注意:ARP请求分组是广播发送,ARP响应分组则是单播

    arp2

  4. 主机A收到主机B的ARP响应分组后,就在其高速缓存中写入主机B的IP地址到硬件地址的映射。

注意:为了减少通信量,主机A在发送其ARP请求分组时,已经把自己的IP地址到硬件地址的映射写入到了ARP请求分组了。当B收到其请求分组时就直接会把A的映射关系写进自己的缓存中。

由于ARP高速缓存要占用主机资源,所以不可能一直让一个映射一直存在,所以就有了生存时间(TTL),凡超过生存时间的一律删除。

以上谈到的ARP都是在同一局域网中,那要是不在呢?

arp4

如上图所示,主机$H_1$就无法解析出另一局域网中的主机$H_2$的硬件地址,主机$H_1$发送给$H_2$的数据报首先需要通过与主机$H_1$连接在同一局域网的$R_1$来转发。因此主机$H_1$需要把路由器$R_1$的IP地址$IP_3$解析为硬件地址$HA_3$。然后从$R_1$的转发表中找到下一跳路由器$R_2$,同时运行ARP找到其硬件地址$HA_5$,于是转发数据报到路由器$R_2$。路由器$R_2$也采用类似方法找到主机$H_2$的硬件地址,使得数据报最终到达目标主机$H_2$。

四种典型情况

有图如下:

arp3

对应四种情况:

  • 发送方是主机(如$H_1$),要把 IP 数据报发送到本网络上的另一个主机(如$H_2$)。这时($H_1$)用 ARP (在网1上广播)找到目的主机的硬件地址。
  • 发送方是主机(如$H_1$),要把 IP 数据报发送到另一个网络上的一个主机(如$H_3$)。这时 ($H_1$)用 ARP (在网1上广播)找到本网络上的一个路由器($R_1$)的硬件地址。剩下的工作由这个路由器($R_1$)来完成。
  • 发送方是路由器(如$R_1$),要把 IP 数据报转发到本网络上的一个主机(如$H_3$)。这时($R_1$)用 ARP(在网2上广播) 找到目的主机($H_3$)的硬件地址。
  • 发送方是路由器($R_1$),要把 IP 数据报转发到另一个网络上的一个主机($H_4$)。这时用 ARP 找到本网络上另一个路由器$R_2$的硬件地址。剩下的工作由这个路由器来完成。

注意

  • ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
  • 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
  • 从 IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
  • 只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。

一个实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
net='192.168.36.' #当前局域网的网络号
i=1 #表示主机号
count=0
while [ $i -le 254 ] #主机号0-255,去掉0x00和0xff剩下254个
do
if [ $count -eq 20 ];then #每 ping 20个ip,sleep 1秒
count=0
sleep 1
fi
ping -c1 $net$i &
let i++
let count++
done
wait
echo '##################################################################################'
arp | grep -v 'incomplete' #打印所有不包含incomplete的IP地址和对应MAC地址
echo '##################################################################################'

别忘了chmod u+x arp.sh以把其变为可执行文件。。