当一台主机把以太网数据帧发送到另一台位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从来不检查IP数据报中的目的IP地址。ARP为不同的地址形式提供映射,说白了也就是ARP把IP地址转化成物理地址,上一节关于路由选路已经有一部分说明,IP数据报无论是在一个相同的网络中进行转发还是需要中间路由进行的转发,都要知道具体的主机或者路由的物理地址,,也就是将下一跳的IP地址转化成硬件地址。地址解析协议的地址转换如图1所示:
图 1 为ARP的地址转换
ARP的具体行为:首先ARP会发送一份称作ARP请求的以太网帧给以太网上的每个主机,该帧包括目的主机的IP地址,意思可以解读为:“如果你是这个IP地址的拥有者,就请回答你的硬件地址”,该过程为广播的模式。当目的主机ARP层收到这份广播的数据包后会发送一个ARP应答,改应答中包括目的主机的硬件地址和IP地址,图 2是当你输入:ftp 主机名 例如:ftp bsdi 时ARP接下来的行为。
图 2 输入ftp bsdi时ARP的行为
ARP的运行时非常高效的原因在于每个主机都有一个存放最近Internet地址到硬件地址之间的映射记录的ARP高速缓存。我们可以用arp -a 来检查ARP高速缓存。
ARP分组的格式如图3所示:
图 4 ARP 帧格式
1.以太网目的地址:目的主机的硬件地址。注意:当目的地址全为1时,表示广播地址。
2.以太网源地址:源主机硬件地址。
3.帧类型:表示后面的数据类型。对于ARP请求来说,该字段的值是:0x0806。对于RARP来说该字段为0x8035。
4.硬件类型:表示硬件地址的类型。值为1时表示以太网地址。言外之意就是ARP协议不仅支持以太网协议,还可以支持别的链路层协议。
5.协议类型:表示要映射的协议地址类型。值为0x0800时表示IP协议。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。
6.硬件地址长度:与硬件类型对应的硬件地址长度,以字节为单位。如果是以太网,则是6字节(MAC长度)。
7.协议地址长度:与协议类型对应的协议地址长度,一字节为单位。如果是IP协议,则是4字节(IP地址长度)。
8.操作类型(op):包括四种操作类型。ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。
9.发送端硬件地址:如果是以太网,则是源主机以太网地址,和以太网头的源地址对应。
10.发送端IP地址:如果是IP协议,则表示源主机的IP地址。
11.目的端硬件地址:如果是以太网,则是目的以太网地址,和以太网头的目的地址对应。
12.目的端IP地址:如果是IP协议,则表示源主机要请求硬件地址的IP地址。
注意:对于一个ARP请求来说,除目的端硬件地址外的所有其它字段都有填充值。当系统收到一份目的端为主机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段值为2,然后把它发送回去。
ARP代理:如果ARP请求是从一个网络上的主机发往另一个网络上的主机,那么连接这两个网络的路由就可以回答该请求 ,这个过程称作委托ARP或ARP代理(Proxy ARP)。让发起ARP请求的发送端误认为路由器就是目的主机,而事实上目的主机是在路由器的“另一端”。路由器的功能相当于目的主机的代理,发分组从其他主机准发给它。
图5 为以太协议对应的类型值:
图 5 以协议对应的类型值