网络技术基础知识一之ARP协议概说

作者在 2008-12-26 10:26:47 发布以下内容

网络技术基础知识一之ARP协议概说

1  ARP协议概述
  
  ARP协议和ICMP协议是常用的TCP/IP底层协议。在对网络故障进行诊断的时候,它们也是最常用的协议。
  
  ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的低层协议,负责将某个IP地址解析成对应的MAC地址。
  
  2 ARP工作原理
  
  2.1 ARP工作过程
  
  当一个基于TCP/IP的应用程序需要从一台主机发送数据给另一台主机时,它把信息分割并封装成包,附上目的主机的IP地址。然后,寻找IP地址到实际MAC地址的映射,这需要发送ARP广播消息。当ARP找到了目的主机MAC地址后,就可以形成待发送帧的完整以太网帧头。最后,协议栈将IP包封装到以太网帧中进行传送。
  
  如图1所示,描述了ARP广播过程。
   

 
  图1  ARP广播


  
  在图1中,当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主机B的IP地址/MAC地址对保存在自己的ARP缓存内。
  
  2.2 ARP报文格式
  
  ARP报文被封装在以太网帧头部中传输,如图2所示,是ARP请求协议报文头部格式。
   

 
  图2  ARP请求协议报文头部格式


  
  图2中黄色的部分是以太网(这里是Ethernet II类型)的帧头部。其中,第一个字段是广播类型的MAC地址:0XFF-FF-FF-FF-FF-FF,其目标是网络上的所有主机。第二个字段是源MAC地址,即请求地址解析的主机MAC地址。第三个字段是协议类型,这里用0X0806代表封装的上层协议是ARP协议。
  
  接下来是ARP协议报文部分。其中各个字段的含义如下:
  
  硬件类型:表明ARP实现在何种类型的网络上。
  
  协议类型:代表解析协议(上层协议)。这里,一般是0800,即IP。
  
  硬件地址长度:MAC地址长度,此处为6个字节。
  
  协议地址长度:IP地址长度,此处为4个字节。
  
  操作类型:代表ARP数据包类型。0表示ARP请求数据包,1表示ARP应答数据包。
  
  源MAC地址:发送端MAC地址。
  
  源IP地址:代表发送端协议地址(IP地址)。
  
  目标MAC地址:目的端MAC地址(待填充)。
  
  目标IP地址:代表目的端协议地址(IP地址)。
  
  ARP应答协议报文和ARP请求协议报文类似。不同的是,此时,以太网帧头部的目标MAC地址为发送ARP地址解析请求的主机的MAC地址,而源MAC地址为被解析的主机的MAC地址。同时,操作类型字段为1,表示ARP应答数据包,目标MAC地址字段被填充以目标MAC地址。
  
  2.3 ARP缓冲区
  
  为了节省ARP缓冲区内存,被解析过的ARP条目的寿命都是有限的。如果一段时间内该条目没有被参考过,则条目被自动删除。在工作站PC的Windows环境中,ARP条目的寿命是2分钟,在大部分Cisco交换机中,该值是5分钟。
  
  在工作站PC的Windows环境中,可以使用命令arp -a查看当前的ARP缓存,如图3所示。而在路由器和交换机中可以命令show arp完成相同的功能,如图4所示。
   

 
  图3  Windows环境下,命令arp -a的输出
   
  图4  路由器中show arp命令的输出


  
  注意:ARP不能通过IP路由器发送广播,所以不能用来确定远程网络设备的硬件地址。对于目标主机位于远程网络的情况,IP利用ARP确定默认网关(路由器)的硬件地址,并将数据包发到默认网关,由路由器按它自己的方式转发数据包。
  
  3 反向ARP
  
  反向ARP(Reverse ARP,RARP)用于把物理地址(MAC地址)转换到对应的 IP 地址。例如,在无盘工作站启动的时候,因为无法从自身的操作系统获得自己的IP地址配置信息。这时,无盘工作站可发送广播请求获得自己的IP地址信息,而RARP服务器则响应IP请求消息-为无盘工作站分配1个未用的IP地址(通过发送RARP应答包)。
  
  反向ARP(RARP)在很大程度上已被BOOTP、DHCP所替代,后面这两种协议对RARP的改进是可以提供除了IP地址外的其它更多的信息,如默认网关、DNS服务器的IP地址等信息。
  
  4 代理ARP
  
  代理ARP(PROXY ARP)也被称作混杂ARP(Promiscuous ARP)(RFC 925、1027)一般被像路由器这样的设备使用--用来代替处于另一个网段的主机回答本网段主机的ARP请求。
  
  下面是代理ARP的应用之一,如图5所示,主机PC1(192.168.20.66/24)需要向主机PC2(192.168.20.20/24)发送报文,因为主机PC1不知道子网的存在且和目标主机PC2在同一主网络网段,所以主机PC1将发送ARP请求广播报文请求192.168.20.20的MAC地址。这时,路由器将识别出报文的目标地址属于另一个子网(注意,路由器的接口IP地址配置的是28位的掩码),因此向请求主机回复自己的硬件地址(0004.dd9e.cca0)。之后,PC1将发往PC2的数据包都发往MAC地址0004.dd9e.cca0(路由器的接口E0/0),由路由器将数据包转发到目标主机PC2。(接下来路由器将为PC2做同样的代理发送数据包的工作)。这种ARP使得子网化网络拓扑对于主机来说时透明的(或者可以说是路由器以一个不真实的PC2的MAC地址欺骗了源主机PC1)。
   

 
  图5  代理ARP


  
  5 无故ARP
  
  无故(Gratuitous ARP,GARP)ARP也称为无为ARP。主机有时会使用自己的IP地址作为目标地址发送ARP请求。这种ARP请求称为无故ARP,GARP,主要有两个用途:
  
  (1)检查重复地址(如果收到ARP响应表明存在重复地址)。
  
  (2)用于通告一个新的数据链路标识。当一个设备收到一个arp请求时,发现arp缓冲区中已有发送者的IP地址,则更新此IP地址的MAC地址条目。
  
  如图6所示,显示了一台Cisco路由器在其加电启动后、引导过程中向网络宣布自己的一个以太网接口(Ethernet 0)的MAC地址以及IP地址的包。
   

 
  图6  无故ARP


  
  从图中可以看出,这个ARP包的类型编码是2,代表一个ARP应答消息(但是之前并没有对此IP的ARP请求消息)。这个ARP包的源硬件地址(MAC地址)是路由器的这个接口的MAC地址,目标硬件地址(MAC地址)使用的是广播地址(FF-FF-FF-FF-FF-FF);而源和目标协议地址(IP地址)都是此接口自身的IP地址。此ARP包用于设备(路由器)向网络宣告自身的IP地址和MAC地址映射,也用于检查是否有重复(冲突)的IP地址。 

基础知识 | 阅读 6472 次
文章评论,共6条
vfdff(作者)
2008-12-26 10:28
1
一、ARP协议简介<br />
<br />
ARP,全称Address Resolution Protocol,中文名为地址解析协议,它工作在数据链路层,在本层和硬件接口联系,同时对上层提供服务。<br />
IP数据包常通过以太网发送,以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包。因此,必须把IP目的地址转换成以太网目的地址。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为的硬件地址(MAC地址),以保证通信的顺利进行。<br />
<br />
1.&nbsp;&nbsp;ARP和RARP报头结构<br />
<br />
ARP和RARP使用相同的报头结构,如图1所示。<br />
<br />
<br />
 <br />
<br />
(图1 ARP/RARP报头结构)<br />
<br />
硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;<br />
<br />
协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);<br />
<br />
硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
发送方IP(0-1字节):源主机硬件地址的前2个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
发送方IP(2-3字节):源主机硬件地址的后2个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
目的IP(0-3字节):目的主机的IP地址。<br />
<br />
2.&nbsp;&nbsp;ARP和RARP的工作原理<br />
<br />
ARP的工作原理如下:<br />
<br />
1.&nbsp;&nbsp;首先,每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。 <br />
<br />
2.&nbsp;&nbsp;当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。<br />
<br />
3.&nbsp;&nbsp;网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址; <br />
4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。<br />
<br />
RARP的工作原理:<br />
<br />
1.&nbsp;&nbsp;发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;<br />
<br />
2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;<br />
<br />
3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;<br />
<br />
4. 如果不存在,RARP服务器对此不做任何的响应;<br />
<br />
5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。<br />
<br />
二、解码详解<br />
<br />
了解了ARP和RARP协议的报头结构和工作原理后,我们使用科来网络分析系统抓取ARP包,其详细解码,如图1,<br />
<br />
<br />
<br />
&nbsp;&nbsp;<br />
<br />
(图1 科来网络分析系统中ARP请求包详细解码)<br />
<br />
图1显示是一个ARP的请求包的解码,下面我们来详细说明:<br />
<br />
硬件类型:1,表示硬件借口类型为以太网类型<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
协议类型:0x0800,表示发送方提供的高层协议类型是IP<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
硬件地址长度:表示硬件地址长度为6字节=48位<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
协议地址长度:表示IP地址长度为4字节=32位<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
操作类型:1,表示ARP请求<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
源物理地址:00:14:85:CA:F5:22<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
源IP地址:192.168.0.92<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
目标物理地址:00:00:00:00:00:00<br />
&#61548;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
目标IP地址:192.168.0.208<br />
<br />
ARP回应包和RARP的包类似,我们在这里就不再重复说明。
vfdff(作者)
2008-12-26 11:30
2
图2 中的 Ethernet II帧格式应该使如下占 14 个字节(图2有误)<br />
/**//**//**////////////Ethernet II帧格式//////////////<br />
01 00 5E 7F FF FA&nbsp;&nbsp;&nbsp; //目标MAC地址&nbsp;&nbsp;&nbsp; 厂商代码&nbsp;&nbsp;设备编号<br />
00 14 78 FF 0F 04&nbsp;&nbsp;&nbsp; //源MAC地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00-14-18+FF-0F-04<br />
08 00&nbsp;&nbsp;&nbsp; //上层数据类型&nbsp;&nbsp;&nbsp; 0x0800:IP协议数据;0x809B:AppleTalk协议数据;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0x8138:Novell类型协议数据
vfdff(作者)
2008-12-26 11:33
3
以下是一些正常的ARP数据包。<br />
下面是一个ARP请求包:<br />
以太网 – II&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0/14]<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FF:FF:FF:FF:FF:FF&nbsp;&nbsp;&nbsp;&nbsp;[0/6]<br />
&nbsp;&nbsp;&nbsp;&nbsp;源地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:13:D4:70:ED:63&nbsp;&nbsp;&nbsp;&nbsp;[6/6]<br />
&nbsp;&nbsp;&nbsp;&nbsp;协议类型:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0806(ARP)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[12/2]<br />
ARP-地址解析协议&nbsp;&nbsp;&nbsp;&nbsp;[14/28]<br />
&nbsp;&nbsp;&nbsp;&nbsp;硬件类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0001(以太网)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[14/2]<br />
&nbsp;&nbsp;&nbsp;&nbsp;协议类型:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0800(IP)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[16/2]<br />
&nbsp;&nbsp;&nbsp;&nbsp;硬件地址长度:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[18/1]<br />
&nbsp;&nbsp;&nbsp;&nbsp;协议地址长度:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[19/1]<br />
&nbsp;&nbsp;&nbsp;&nbsp;操作类型:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0001(ARP请求)&nbsp;&nbsp;&nbsp;&nbsp;[20/2]<br />
&nbsp;&nbsp;&nbsp;&nbsp;源物理地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:13:D4:70:ED:63&nbsp;&nbsp;&nbsp;&nbsp;[22/6]<br />
&nbsp;&nbsp;&nbsp;&nbsp;源IP地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;192.168.0.200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[28/4]<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标物理地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00:00:00:00&nbsp;&nbsp;&nbsp;&nbsp;[32/6]<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标IP地址:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;192.168.0.222&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[38/4]<br />
额外数据:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[42/18]<br />
&nbsp;&nbsp;&nbsp;&nbsp;字节数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18 bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[42/18]<br />
FCS - 帧校验序列:&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FCS:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1093A7B1(计算出的)<br />
意思是:192.168.0.200要和192.168.0.222通信前就要先知道192.168.0.222 的MAC地址。问谁是192.168.0.222?请告诉192.168.0.200。请注意以太网的地址是FF:FF:FF:FF:FF:FF,ARP协议中的目标物理地址是00:00:00:00:00:00
vfdff(作者)
2008-12-26 14:11
4
ping不是内部或外部命令的解决方法:<br />
<br />
系统变量中的path里面还有没有这个%systemroot%\system32
sysnakes
2008-12-26 18:36
5
看不到图
xxdwww
2009-01-01 01:48
6
图者看不到啊.
游客请输入验证码
浏览1936577次