ARP地址解析协议原理

来源:互联网 发布:react用js和jsx的区别 编辑:程序博客网 时间:2024/06/10 09:06

概述

网络层以上的协议用IP地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口。因此我们需要进行IP地址与物理地址之间的转化。

对于IPv4来说,我们使用ARP地址解析协议来完成IP地址与物理地址的转化(IPv6使用邻居发现协议进行IP地址与物理地址的转化,它包含在ICMPv6中)。 

ARP协议提供了网络层地址(IP地址)到物理地址(mac地址)之间的动态映射。ARP协议 是地址解析的通用协议

 

 请求的例子:

 

 

 

 

MAC 地址 与 IP地址

  Mac地址由设备制造商定义/分配,每一个硬件设备都有一个链路层主地址(MAC地址),保存在设备的永久内存中。设备的mac地址不会改变(现在可以进行mac地址伪装) 
  IP地址由用户配置给网络接口, 网络接口的IP地址是可以发生变化的(通过DHCP获取IP,变化速度比较快)

获取目的端的MAC地址(在一个以太网中)步骤如下: 

         1.发送ARP请求的以太网数据帧给以太网上的每个主机,即广播(以太网源地址填全1)。ARP请求帧中包含了目的主机的IP地址。 
         2.目的主机收到了该ARP请求之后,会发送一个ARP应答,里面包含了目的主机的MAC地址。 

ARP协议工作原理

  1. 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
  2. 主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
  3. 网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
  4. 某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
  5. 当本网络的所有主机收到该 ARP 数据包时:

             (A)首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。

             (B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。

             (C 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。

          6.源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

ARP工作实例

下面我们就来谈一谈ARP地址解析协议是如何把目的地址的IP地址转化成MAC地址的。 


1. 首先,主机A想要向主机B发送消息,但它不知道主机B的MAC地址,只知道主机B的IP地址。这时,主机A会在当前局域网下以广播的形式发送ARP请求数据报,表示主机A想知道主机B的MAC地址(注:广播时,以太网首部的目的地址为全f)。 
(ARP请求数据报.png) 


2. 由于是广播,所以在本局域网上的所有主机都会受到主机A发送的ARP数据报,然后所有主机会把以太网首部这个报头给去掉,向上面的网络层发送ARP数据报。在这里我们便可以回答上面的问题了,以太网首部和ARP数据报内的MAC地址都不能少,一个是在数据链路层使用的,一个是在网络层使用的,因为两个层都不能看到互相的数据。 


3. 网络层首先会检查op字段,发现这时个ARP请求数据报,然后又会检查目的IP地址字段,检查完毕后,这时除了主机B外,在这个局域网内的其他主机都会把数据报丢弃,因为只有主机B的IP地址和目的IP地址是相同的。 
(ARP应答数据报)

ARP缓存

      ARP高速缓存(即ARP表)是 ARP地址解析协议能够高效运行的关键, (如果有多次ARP响应时,以最后一次响应为准)

      ARP给IP地址和MAC地址中间做了动态映射,也就是说缓存了一个ARP表,将得到的IP地址和MAC地址对应起来,如果在表中没有查到IP地址对应的MAC地址,就会发广播去找。随着用户的使用,ARP表如果不做任何措施,就会变得越来越臃肿缓慢,就降低了网络传输数据的效率,所以ARP缓存中每一项被设置了生存时间,一般是20分钟,从被创建时开始计算,到时则清除,如果在计时期间又被使用了,计时会重置。

 

我们可以通过arp命令查看arp表: 


              这里写图片描述 


ARP表中记录了一些IP地址与物理地址的映射,在arp表中,我们可以看到一个Flags字段,该字段有C、M、P三种取值: 

      C: 表明arp条目为通过ARP请求动态获取,(一般存活时间为20min) 
      M:表明arp条目为手动设置。 
      P: 表示Publish,表示该ARP条目可以用于恢复其他主机的ARP请求。(用于ARP proxy)

 

报文格式(ARP 帧)

   这里写图片描述

    

 

     

   这里写图片描述

ARP帧以以太帧的形式存在,即ARP消息包含在以太帧中 ,因此包含以太帧的首部和尾部。(这里不考虑802.1p/q等特殊以太帧)。 

这里写图片描述


* 帧类型*:用来向收到数据报的主机表示该数据报的类型,常见类型如下: 
0800:IP数据报; 
0806:ARP请求/应答数据报; 
8035:RAPP请求/应答; 

ARP Request or Reply Message 是ARP帧的核心部分。 

前14字节是以太网首部帧格式 ,然后后面四个字段描述了本ARP帧涉及的硬件类型和协议类型。 
Hard Type:该字段占2个字节,指定硬件地址类型, 如值为1表示为以太网地址。 
Prot Type :该字段占2个字节,指定协议地址类型,如0x0800 表示协议地址类型为IPv4地址。该值与以太帧首部的类型字段相同。 
Hard Size: 表示硬件地址的大小(单位:字节),如以太网地址为6。
Prot Size : 表示协议地址的大小(单位:字节), 如IPv4地址大小为4。(硬件地址长度和协议地址长度,分别占1个字节,指出硬件地址和协议地址的长度,以字节为单位。)

OP : 表示ARP的消息类型。 
    1:ARP Request; 
    2:ARP Reply 
    3:RARP Request 
    4:RARP Reply

后面四个字段写入的是一些物理地址和协议地址。不一定全部有值。 
对于ARP Request 而言,我们不知道目的MAC地址是什么,因此 Target’s Hardware Address 全部填充为0.

ARP帧的交互

当主机接收到一个针对其协议地址的ARP Request时,它会回应ARP Reply. 该Reply消息内容为:对调sender 和 Target 地址字段,然后将Sender’s Hardware Address(即原来的Target’s Hardware Address )修改为本机的Hardware Address。另外OP字段有1变为2.

 

局域网中一台主机获取已知一台IP地址的主机的硬件地址过程:

当主机A向本局域网上的主机B发送IP数据报时,先在ARP高速缓存中查找B主机IP所对应的硬件地址,要是找到了,就将此硬件地址写入到MAC帧首部的目的地址中,然后通过局域网发送;要是没有找到,那么主机A会运行ARP,将会按照以下步骤找出主机B的硬件地址。
①主机A想局域网中广播发送一个ARP请求分组,广播的主要内容是:“我的IP地址是IPA,我的硬件地址是MACA,我要知道IP地址为IPB的主机的硬件地址”。
此时局域网中的主机都会收到这样的一个数据帧。
②链路层在接收到这个数据帧之后将有效载荷和报头分离之后,将有效载荷交付给ARP协议进行处理(因为MAC帧首部的帧类型为ARP协议)。
③在所有局域网中的主机获得链路层交付的有效载荷后,它们会对其进行处理,发现其中的接收端IP地址与自己的IP地址不同,则会将该数据报丢弃,不做处理。只有B主机会发现接收端IP地址与自己的IP地址相同,此时B主机会向A主机单播一个响应分组(因为通过A的广播,B知道了A的IP地址和硬件地址),“我的IP是IPB,我的硬件地址是MACB”。
④在主机A收到主机B的ARP响应分组后,就在ARP的告诉缓存中写入B主机的IP地址到硬件地址的映射。
 

免费ARP 和 地址冲突检测

* 免费ARP* 指的是 主机发送一个ARP请求,求寻找自己的IP地址 。常用在系统引导时,对网络接口进行配置的时候。 
免费ARP有两个重要作用 
1. 检测网络上是否有其他主机的IP地址与本机相同,即地址冲突检测。 
2. 当主机向网络广播免费ARP时,其实她也将自己的IP地址与物理地址的映射关系广播给其他主机了。因此,如果本机的硬件地址发生了变化,其他主机也应该做出相应的更新。

 

ARP请求发送到了目的端之后,目的端填上了自己的硬件地址,然后把两个目的端地址和两个发送端地址交换,把op的值置为2,再把该ARP数据报发回去。

前面提到的获取目的端的MAC地址的步骤是在一个特殊的条件下完成了,即发送端和目的端都在同一个以太网中,那么当发送端和目的端不在同一个网络中呢。 
这种情况下有一个术语叫ARP代理。连接发送端和目的端网络的路由器就充当这样一个代理。举个简单的例子,当主机A发送ARP请求给主机B时,它们处于不同的网络,但是由路由器C相连,当C识别出主机B的IP地址属于它连接的一个主机,这时C就会欺骗主机A,让A误认C就是目的主机,然后C就将ARP数据报发给B,最后B再将ARP应答发回来。

还有最后一个ARP特性:免费ARP 
它是指主机发送ARP查找自己的IP地址。 
作用有两个: 
1.主机可以通过它来确定另一个主机有没有设置同样的IP地址。 
2.如果发送免费ARP的主机改变了硬件地址(换了网卡),那么这个分组就会更新其它主机高速缓存表中旧的硬件地址。

  ARP报头定义如下: 

 
在学习到这些知识之后我们可以做这样一些实验,编写一个脚本抓取和自己电脑处于同一局域网的其他主机的MAC地址。
原理很简单,一个C类的地址最多有254台主机,所以我们可以暴力的去ping每个IP,我们就可以获取到连接在本局域网中的其他主机的MAC地址。
[cpp] view plain copy
 
  1. #!/bin/bash  
  2.   
  3. net='192.168.199.'  
  4. i=1  
  5.   
  6. count=0  
  7. while [ $i -le 254 ]  
  8. do  
  9.     if [ $count -eq 20 ];then  
  10.         count=0  
  11.         sleep 1  
  12.     fi  
  13.     ping -c1 $net$i &  
  14.     let i++  
  15.     let count++  
  16. done  
  17.   
  18. wait  
  19. echo '############################################'  
  20. arp -a | grep -v 'incomplete'  
  21. echo '############################################'  
在我电脑上成功抓取到其他主机的硬件地址。
注意:如果是使用VM虚拟机,要将网络适配器改为桥接模式