ARP地址解析过程(同一子网和不同子网)
ARP地址解析过程(同一子网和不同子网)
人们最熟悉的网络可以说是以太网,而且人们都知道,每块网卡都有一个编号,也就是网卡地址(称为MAC地址),代表计算机的物理地址。另外,网络中的每一台计算机都分配了一个IP地址,这样,每台计算机上都有两个地址,IP地址和MAC地址。
IP地址并不能代替MAC地址,前者是在大网中为了方便定位主机所采用的方式,如果网络规模不大,完全可以不使用IP地址。但是,无论什么网络环境物理地址都是要使用的。因为物理地址对应于网卡的接口,只有找到它才算真正到达了目的地。而IP地址是为了方便寻址人为划分的地址格式,因此IP地址也被称为逻辑地址,又因为这种结构化地址是在OSI的第3层定义的,也被称为3层地址。相应地,物理地址是在第2层定义的,被称为2层地址。IP地址是一种通用格式,无论其下一层的物理地址是什么类型,都可以被统一到一致的IP地址形式上,因此IP地址屏蔽了下层物理地址的差异。
既然IP地址并不能代替物理地址,它只是在逻辑上表示一台主机,物理地址才对应于网卡的接口,只有找到它才能将数据送达到目的地。那么如何把二者对应起来就是要解决的首要问题,因为二者代表的是同一台机器。为此人们开发了地址解析协议(Address Revolution Protocol,ARP),地址解析协议负责把IP地址映射到物理地址。
下面分两种情况解释ARP的工作过程:同一子网内的arp和不同子网间的arp。
(1)同一子网内的ARP
主机A (172.16.20.20/24)与主机B通信。假设在A上Ping主机B的IP地址172.16.20.5/24。
为了把测试信息发送到主机B和A,将构造关于Ping的IP数据包。可以确定,这个包头中的源IP地址是172.16.20.20,目的地址172.16.20.5。IP数据包构造完成以后,需要将它从网卡发送出去,在这之前必须要封装2层的帧头,本例中2层是以太网环境,因此需要构建以太网帧头。分析帧头中的MAC地址情况,它的源地址应该是00-0C-04-18-19-aa,这个地址很容易获得,主机A直接从自己的网卡中获取即可,帧头中的目的MAC地址应该是00-0C-04-38-39-bb,它对应于主机B的MAC地址。主机A如何得知主机B的MAC地址呢?这是主机A在封装2层帧头时必须解决的问题,否则无法发送这个帧出去。主机A唯一的办法是向主机B发出询问,请主机B回答它自己的MAC地址是什么。ARP协议正是负责完成这一工作的,即已知目的节点的IP地址来获取它相应的物理地址。
ARP的操作过程如下。
① 主机A发出ARP请求,请求帧中的数据部分包括发送者MAC地址00-0C-04-18-19-aa、发送者IP地址172.16.20.20和目标MAC地址,这里全部填充0,因为它未知(这正是ARP要询问的),目标IP地址是172.16.20.5。
② 在请求帧的帧头部分,目的MAC地址是广播地址,因此所有收到的站点(其中就包括主机B)都打开这个帧查看其数据部分的内容。
③ 只有符合目标IP地址172.16.20.5的主机(主机B)回答这个ARP请求,其他站点则忽略这个请求。
④ 主机B把自己的MAC地址写入“目标地址”字段中,送给主机A。
主机A通过ARP的操作得到了主机B的MAC地址,可以继续完成它的封装过程,从而最终执行了Ping的操作。
ARP请求者收到应答后,会在自己的缓存中构建一个ARP表,将得到的地址信息缓存起来,以备将来和同一目的节点通信时直接在ARP表中查找,避免了多次的广播请求。
实际上,完整的操作过程是:主机A在准备构造2层帧头时,首先根据目的IP去查找ARP表,如果找到对应项,则直接得到目的MAC地址,如果没有查到才执行上面所说的ARP广播请求。这样做是为了最大限度地减少广播。
(2)不同子网间ARP
假设在主机A(172.16.10.10/24)上Ping主机B的IP地址172.16.20.5/24,随后主机A将构造关于Ping的IP数据包,这一过程与前面相同,只是目的地址在另外一个子网中。主机A仍然面临如何确定2层帧头中的目的MAC地址的问题。
如果仍然依照目的节点和源节点位于同一子网中的思路,这个目的MAC应该是主机B网卡的MAC地址。顺着这个思路走下去,看看会发生什么情况。
由于主机B位于路由器的另外一侧,因此主机B要想收到主机A发出的以太网帧必须通过路由器转发,那么路由器是否会转发呢?答案是否定的。路由器在收到某个以太网帧后首先检查其目的MAC,而这里假设A发出的帧中的目的MAC是B的网卡地址,路由器从Ethernet 0接口收到该帧后,查看目的MAC地址,发现它不是自己的MAC地址,从而将其丢弃掉。由此看来,位于不同子网的主机之间在通信时,目的MAC地址不能是目标主机的物理地址。
实际上,不同子网之间的主机通信要经过路由过程,这里就是需要路由器A进行转发。因此,主机A发现目标主机与自己不在同一个子网中时就要借助于路由器。它需要把数据帧送到路由器上,然后路由器会继续转发至目标节点。在该例中,主机A发现主机B位于不同子网时,它必须将数据帧送到路由器上,这就需要在帧头的“目的地址”字段上写入路由器接口Ethernet 0的MAC地址。因此,主机A需要通过ARP询问路由器Ethernet 0接口的MAC地址。
这里仍然是两个操作过程,一个是ARP请求;另一个是ARP应答。不过在ARP的请求帧中,目标IP地址将是路由器Ethernet 0接口的IP地址,这个地址实际上就是子网172.16.10.0/24中主机的默认网关。路由器收到ARP请求后回答自己Ethernet 0接口的MAC地址,这样主机A就获得了其默认网关的MAC地址。主机A构建完整的数据帧并将其发送给到路由器。路由器收到主机A的数据后,根据路由表的指示将从另一接口Ethernet 1把数据发送给主机B。同样,在发送前路由器也要封装2层帧头,也需要知道主机B的MAC地址,路由器也是通过ARP协议来获得B的MAC地址的。
综合以上两种情况,主机A的完整操作过程如下:
主机A首先比较目的IP地址与自己的IP地址是否在同一子网中,如果在同一子网,则向本网发送ARP广播,获得目标IP所对应的MAC地址;如果不在同一子网,就通过ARP询问默认网关对应的MAC地址。
下一篇: 用IP地址和子网掩码计算相关地址信息