ARP和RARP协议的作用
ARP
我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP和下面的网络的硬件地址以为格式不同而不存在简单的映射关系。(IP是32位,而局域网硬件地址是48位。)更换网络适配器还可能改换硬件地址。
地址解析协议ARP就是解决这个问题的方法是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表经常动态更新(动态这个词是因为整个过程是软件自动完成的,一般应用程序和用户不必关心)
每一个主机都设有一个APR高速缓存(ARP
cache)。里面有本局域网上各个主机和路由器的IP地址到硬件地址的映射表。
使用ARP的四种情况
1. 发送方式主机,要把IP数据报发送到本网络上的另一个主机。这时ARP找到目的主机的硬件地址。
2. 发送方是主机,要把IP数据报发送到另一个网络上的主机,这时ARP找到本网络上的一个路由器的硬件地址,剩下的工作由这个路由器完成。
3. 发送方式路由器,要把IP数据报转发到本网络上的一个主机。这时ARP找到目的主机的硬件地址
4. 发送方式路由器,要把IP数据报转发到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
那么主机是怎么知道这些地址的呢?
ARP的运行过程
如果主机B刚入网,或者主机A刚启动,高速缓存还是空的,这时A是没有B的地址的
在这种情况下,主机A就自动运行ARP,按照下面步骤找到B的地址:
1.ARP进程在本局域网上广播发送一个ARP请求分组,其中广播内容如下图(或者理解为如果你是这个IP地址的所有者,请回答你的硬件地址):
2.本局域网上的所有主机运行的ARP进程都收到此ARP请求分组。
3.主机B在ARP请求中看到自己的IP地址,就向主机A发送ARP相应分组,应写入自己的硬件地址。其余所有的主机都不理睬这个A的ARP请求分组。ARP请求分组是广播的,但是ARP相应分组是普通的单播
4.主机A收到B的相应分组后,就在其ARP高速缓存中写入B的从IP到硬件地址的映射。
5.主机A在向主机B发送ARP请求时,也把自己的IP到硬件地址的映射写入了ARP请求分组中。当B接收到时,就写入到自己的ARP高速缓存中。
可见ARP高速缓存非常有用。如果不使用ARP高速缓存,任何一个主机只要进行一次通信,就要在网络上以广播的形式发送ARP请求分组,这样就使得网络上的通信量大大增加。
ARP把保存在高速缓存中的每一个映射地址都设置生存时间(例如20分钟)。凡超过生存时间的项目就从高速缓存中删除掉。这种生存时间是很重要的。设想如果A和B通信,如果B的网络适配器突然坏掉了,A还按照原来的硬件地址发送,肯定就不能成功了、A在删掉后,又重新广播ARP请求分组,又找到了B
可能我们会有疑问,既然在网络链路上传送的帧最终是按硬件地址找到目的主机的,那么为什么不直接使用硬件地址进行通信呢?
因为全世界存在各式各样的网络,它们使用不同的硬件地址,要使得这些异构网络能够通信就必须进行非常复杂的硬件地址转换工作。但是统一的IP地址把这个复杂的问题解决了。
ARP的分组格式
在以太网上解析IP地址时, ARP请求和应答分组的格式如图3所示(
ARP可以用于其他类型的网络,可以解析IP地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)。
以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。
两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。
形容词hardware (硬件)和protocol
(协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。
硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同,这是有意设计的。
接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。
OP
操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和R
ARP应答(值为4)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。
接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。
对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把op操作字段置为2,最后把它发送回去。