• (八)网络层地址解析协议ARP


    地址解析协议ARP

    前文提到了这个问题:主机或路由器怎样知道应当在MAC帧的首部填入什么样的硬件地址?地址解析协议ARP就是用来解决这个问题的。

    ARP协议

    通过前面几篇文章,我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧,最终还是必须使用该网络的硬件地址。IP地址和硬件地址由于格式不同,所以不存在简单的映射关系(IP地址32位,硬件地址48位)。地址解析协议ARP解决这个问题的方法是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表。一起看下面这个例子。

    当主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址,如果有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。如果没有,可能是因为主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址:

    (1)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请求的分组。ARP响应分组的主要内容是:我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。虽然ARP请求的分组是广播发送的,但ARP响应的分组是普通的单播,即从一个源地址发送到一个目的地址。

    (4)主机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对保存在高速缓存中的每一个映射都设置生存时间(如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的硬件地址(实际上,主机H1也不需要知道远程主机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的四种典型情况:

    (1)发送方是主机(H1),要把IP数据报发送到同一个网络上的另一台主机(H2),这时H1发送ARP请求的分组,在网1上广播,找到目的主机H2的硬件地址。

    (2)发送方是主机(H1),要把IP数据报发送到另一个网络上的一台主机(H3或H4),这时H1发送ARP请求的分组,在网1上广播,找到网1上的一个路由器R1的硬件地址。剩下的工作由路由器R1来完成,R1要做的就是下面的3和4。

    (3)发送方是路由器(R1),要把IP数据报转发到与R1连接在同一个网络上的主机H3,这时R1发送ARP请求的分组,在网2上广播,找到目的主机H3的硬件地址。

    (4)发送方是路由器(R1),要把IP数据报转发到网3上的一台主机(H4),H4与R1未连接在同一个网络上。这时R1发送ARP请求的分组,在网2上广播,找到连接在网2上的一个路由器R2的硬件地址,剩下的工作由路由器R2来完成。

    在许多情况下,需要多次使用ARP,但这只是以下几种情况的反复使用而已。

    思考这个问题:既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们还要使用抽象的IP地址,而不直接使用硬件地址进行通信?因为全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,在这种情况下,由用户或用户主机来完成这项工作几乎不可能。但IP编址把这个复杂问题解决了,连接到互联网的主机只需各自拥有一个唯一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为调用ARP的复杂过程都是由计算机自动进行的,对用户来说是看不见这种调用过程的。所以,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来很大的便利。

  • 相关阅读:
    网络编程
    网络参考模型
    面向对象中类的成员
    Forward(请求转发)和Redirect(重定向)的比较
    AOP详解
    JDK动态代理和CGLib代理对比
    内存可见性问题分析
    Java中创建对象的5种方式
    基于Spring的动态路由AbstractRoutingDataSource实现动态分库
    在java中String类为什么要设计成final?
  • 原文地址:https://www.cnblogs.com/cone/p/14882182.html
Copyright © 2020-2023  润新知