在介绍ARP协议之前,我们先来区分一下IP地址和网络地址。
IP地址:是网络层及以上各层使用的地址,是一种逻辑地址,IP地址是使用软件实现的。
MAC地址:是数据链路层和物理层使用的地址。
发送数据时,数据从高层到底层,通过每一层时则加上该层对应的协议报头,直到最底层(链路层),才发送到通信链路上进行传输。使用IP地址的IP数据报一旦交给数据链路层,就被封装成MAC帧,MAC帧在传送的使用使用的源地址和目的地址都是MAC地址。连接在链路上的设备(主机或路由器)依据MAC首部中的硬件地址来接收MAC帧数据。
在链路层是看不到IP地址的,只有在剥去MAC帧的头部和尾部,并发送给网络层,网络层才可以看见IP数据报中的IP地址。
ARP地址协议功能
其基本功能是通过目标设备的IP地址,查询目标设备的MAC地址,以此保证MAC帧在链路上进行传输。不过该协议只适用于IPv4.在以太网协议中规定,同一局域网中的一台设备要想和另外一台设备通信,必须知道对方的MAC地址。而TCP/IP协议中,网络层和传输层只关心IP地址,这就导致数据传输到链路层只有IP地址。于是就需要通过IP地址获得MAC地址,这就是ARP协议所作的事情。
ARP首部
以太网传输
目标以太网地址:目标MAC地址。当MAC地址为二进制全1时表示广播地址。
源以太网地址:发送方MAC地址。
在每一台装有TCP/IP协议的主机或者路由器都有一个ARP缓存表。表里有IP地址与MAC的映射。如下:
当主机A向本局域网中的主机B发送数据报时,首先会查询本主机的ARP缓存表,看是否存在目标IP的映射,如果有,将目标主机的IP地址写入MAC帧,然后发送出去。
如果在ARP缓存表中没有找到目标IP的映射,则按照下述步骤进行。
1、ARP进程在本局域网上广播发送一个ARP请求分组,如下:
2、本局域网上所有的主机上运行的ARP进程都收到了该请求
3、主机B收到该请求之后发现其中的IP地址正好是自己的IP地址,因此向A主机发送ARP响应分组。并将自己的MAC地址写入响应分组。
4、主机A收到主机B的请求之后,就将主机B的IP地址映射写入它主机中的ARP缓存表。
注意:如果目标主机不再本局域网内,ARP协议是无法解析出目标主机的MAC地址的。必须经过路由转发,所以此时通过ARP协议获得的将不是目标主机的MAC地址,而是一个可以通往局域网外的路由器MAC地址。要向局域网外的主机B发送数据就先交给该路由器,经过路由器发送出去。
讲到这里其实可以发现使用ARP协议主要有以下4中情况:
- 发送方是主机(如H1),要把IP数据报发送到同一网络上的另一台主机(如H2),这时H1发送ARP请求分组(在网1上广播),找到目的主机H2的硬件地址
- 发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3或H4).这时H1发送ARP请求分组(在网1上光播),找到一个网1上的路由器R1的硬件地址。剩下的工作有R1完成。R1要做的就是下边的3或者4
- 发送方是路由器(如R1),要把数据报转发到与R1连接在同一个网络(如网2)上的主机(如H3).这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址
- 发送方是路由器(如R1),要把IP数据报转发到网3上的一台主机(如H4).H4与R1不是连接在同一个网络。这时R1发送ARP请求分组(在网2上广播),找到连接在网2上的一个路由器R2的硬件地址。剩下的工作有这个路由器R2完成。
ARP采用老化机制,如果ARP缓存表中的某些映射在一段时间内没有被使用,就将这些映射删除,缩小缓存表的长度,提高查找的效率。