ARP协议详解
文章目录
IP地址与MAC地址
在学习IP地址时,很重要的一点就是要弄懂主机的IP地址与硬件地址的区别。
从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址是逻辑地址是因为IP地址是用软件实现的)。
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数 据报一旦交给了数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。
连接在通信链路上的设备(主机或路由器)在接收MAC帧时,其根据是MAC帧首部 中的硬件地址。在数据链路层看不见隐藏在MAC帧的数据中的IP地址。只有在剥去MAC 帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。当IP数据报放入数据链路层的MAC帧中以后,整个的IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。
尽管互连在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信。
ARP协议
在实际应用中,我们经常会遇到这样的问题:己经知道了一个机器(主机或路由器) 的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。
还有一个旧的协议叫做逆地址解析协议RARP,它的作用是使只知道自己硬件地址的主机能够通过RARP协议找出其IP地址。现在的DHCP协议己经包含了RARP协议的功能。因此不再介绍RARP协议。
下面就介绍ARP协议的要点。
我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP地址有32位,而局域网的硬件地址是48位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬 件地址改变。地址解析协议ARP解决这个问题的方法是在主机ARP高速缓存中应存放一个 从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
每一个主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上的各主机和路由 器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。
当主机A要向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的硬件地址,再把这个 硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。 也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤 找出主机B的硬件地址。
(1) ARP进程在本局域网上广播发送一个ARP请求分组。图(a)是主机A广播发送ARP请求分组的示意图。ARP请求分组的主要内 容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址为 209.0.0.6的主机的硬件地址。”
(2) 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
(3) 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求 分组,并向主机A发送ARP响应分组,并在这个ARP响应分组中 写入自己的硬件地址。由于其余的所有主机的IP地址都与ARP请求分组中要查询的IP地 址不一致,因此都不理踩这个ARP请求分组,见图(b)。ARP响应分组的主要内容是表明:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。”请注意:虽然ARP 请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
(3) 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP 地址到硬件地址的映射。
当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机 B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的 ARP请求分组时,就把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后 主机B向A发送数据报时就很方便了。
可见ARP高速缓存非常有用。如果不使用ARP高速缓存,那么任何一个主机只要进行一次通信,就必须在网络上用广播方式发送ARP请求分组,这就使网络上的通信量大大增 加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样 目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送ARP请求分组。
ARP把保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10 ~ 20分 钟)。凡超过生存时间的项目就从高速缓存中删除掉。设置这种地址映射项目的生存时间是 很重要的。设想有一种情况。主机A和B通信。A的ARP高速缓存里保存有B的硬件地址。但B的网络适配器突然坏了,B立即更换了一块,因此B的硬件地址就改变了。假定 A还要和B继续通信。A在其ARP高速缓存中查找到B原先的硬件地址,并使用该硬件地 址向B发送数据帧。但B原先的硬件地址已经失效了,因此A无法找到主机B。但是过了 一段不长的生存时间,A的ARP高速缓存中己经删除了 B原先的硬件地址,于是A重新广播发送ARP请求分组,又找到了B.
请注意,ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问 题。如果所要找的主机和源主机不在同一个局域网上,主机H1就无法解析出另一个局域网上主机H2的硬件地址(实际上主机也不需要知道远程主机 H2的硬件地址)。主机H1发送给H2的IP数据报首先需要通过与主机H1连接在同一个局域网上的路由器R1,来转发。因此主机H1这时需要把路由器R1的IP地址IP3解析为硬件地址HA3,以便能够把IP数据报传送到路由器R1。
以后R1从转发表找出了下一跳路由器R2,同时使用ARP解析出R2的硬件地址HA5。于是IP数据报按照硬件地址HA5转发到路由器R2。路由器R2在转发这个IP数据报时用类似方法解析出目的主机H2的硬件地址HA2,使 IP数据报最终交付主机H2。
从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道 的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信,ARP 协议就会自动地把这个IP地址解析为链路层所需要的硬件地址。 下面我们归纳出使用ARP的四种典型情况(图4-12)。
既然在网络链路上传送的帧最终是按照硬件地址找 到目的主机的,那么为什么我们不直接使用硬件地址进行通信,而是要使用抽象的IP地址 并调用ARP来寻找出相应的硬件地址呢?
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能 够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但统一的IP地址把这个复杂问题解决了。连接到因特网的主机只需拥有统一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的 调用ARP的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
文章作者 Forz
上次更新 2017-07-30