一、ARP协议简介
Internet是由各种各样的物理网络通过使用诸如路由器之类的设备连接在一起组成的。当主机发送一个数据包到另一台主机的过程中 可能要经过多种不同的物理网络。主机和路由器都是在网络层通过IP地址来识别的,这个地址是在全世界内唯一的。 然而,数据包是通过物理网络传递的。在物理网络中,主机和路由器通过其MAC地址来识别的,其范围限于本地网络中。 MAC地址和IP地址是两种不同的标识符。这就意味着将一个分组传递到一个主机或路由器需要进行两级寻址:IP和MAC。需要能将一个IP地址映射到相应的MAC地址。
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。 所谓“地址解析”就是主机在发送帧前将目标网络层地址转换成目标物理地址的过程。在使用TCP/IP协议的以太网中,即完成将IP地址映射到MAC地址的过程——使用ARP协议通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
二、ARP报文格式
从网络底层看来,一个ARP包是分为两个部分的,前面一个是物理帧头,后面一个才是ARP帧。
首先,物理帧头,它将存在于任何一个协议数据包的前面,我们称之为DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以便硬件设备识别。
图1 物理帧头格式
图1是需要我们填充的物理帧头的格式,我们可以看到需要我们填充的仅仅是发送端和接收端的物理地址罢了,是不是很简单呢?
接下来我们看一下ARP帧的格式
图2 ARP帧格式
我们可以看到需要我们填充的同样也只是MAC,IP,再加上一个1或2的操作码而已。
三、ARP包的填充
1、请求包的填充:
比如我们的电脑MAC地址为 aa-aa-aa-aa-aa-aa,IP为 192.168.0.1
我们想要查询 192.168.0.99的MAC地址,应该怎么来做呢?
首先填充DLC Header,通过前面的学习我们知道,想要知道某个计算机对应的MAC地址是要给全网发送广播的,所以接收方MAC肯定是 ffffffffffff,发送方MAC当然是自己啦,于是我们的DLC Header就填充完成了,如图,加粗的是我们要手动输入的值(当然我编的程序比较智能,会根据你选择的ARP包类型帮你自动填入一些字段,你一用便知)。
图3 ARP请求包中 DLC Header内容
接下来是ARP帧,请求包的操作码当然是 1,发送方的MAC以及IP当然填入我们自己的,然后要注意一下,这里的接收方IP填入我们要查询的那个IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如图
图4 ARP请求包中 ARP帧的内容
如果我们构造一个这样的包发送出去,如果 192.168.0.99存在且是活动的,我们马上就会收到一个192.168.0.99发来的一个响应包,我们可以查看一下我们的ARP缓存列表,是不是多了一项类似这样的条目:
192.168.0.99 bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我们再来看一下ARP响应包的构造
2、响应包的填充
有了前面详细的解说,你肯定就能自己说出响应包的填充方法来了吧,所以我就不细说了,列两个表就好了
比如说给 192.168.0.99(MAC为 bb-bb-bb-bb-bb-bb)发一个ARP响应包,告诉它我们的MAC地址为 aa-aa-aa-aa-aa-aa,就是如此来填充各个字段
图5 ARP响应包中 DLC Header内容
图6 ARP响应包中 ARP帧的内容
这样192.168.0.99的ARP缓存中就会多了一条关于我们192.168.0.1的地址映射。
四、ARP的运行过程
在因特网中,数据报传递过程中包括如下步骤:
1. 发送者知道目标端的IP地址
2. IP要求ARP创建一个ARP请求报文,其中包含了发送方的物理地址、发送方的IP地址和目标端的IP地址。目标的物理地址用0填充。3. 将报文传递到数据链路层,并在该层中用发送方的物理地址作为源地址,用物理广播地址作为目的地址,将其封装在一个帧中。
4. 同一链路中的每个主机或路由器都接收到这个帧,因为该帧中包含了一个广播目的地址,所有的站点都对报文进行移交,并将其传递到ARP。除了目标机器以外的所有机器都丢弃该报文。目标机器对IP地址进行识别。
5. 目标机器用一个包含其物理地址的ARP响应报文做出响应,并对该报文进行单播。
6. 发送方接收到一个响应报文,这样它就知道了目标机器的物理地址。
7. 这样就可以将携带目标机器数据的IP数据报封装在一个帧中,并单播到目的地址。
五、ARP缓存
实际上,在真正的协议实现中,并不是每次发送IP报文前都需要发送ARP请求报文来获取目的MAC地址。在大多数的系统中都存在着一个ARP缓存表。记录着已经获取的MAC地址和IP地址的映射关系,如下图:
IP地址 MAC地址
202.98.13.1 00-E0-4C-3D-89-76
202.98.13.2 00-E0-4C-3D-C5-03
202.98.13.3 00-E0-4C-4D-BA-92... ...
发送IP报文前总是先对ARP缓存表进行查找,看是否目标MAC地址存在于缓存表中,如果存在,则不需要发送ARP请求报文而直接使用此地址进行IP报文的发送。如果不存在,则发送ARP请求报文,并将结果存于ARP缓存表中供以后使用。
另外,ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
六、ARP代理
ARP本身无法跨跃不同网段。当数据要发往外部网络时,通常是首先使用ARP请求网关路由器的MAC地址,之后将数据发往网关路由器, 由网关路由器进行转发(动画演示)。 但有时由于管理或地域等原因,我们的内部网络又会划分为很多子网,这时我们可以通过修改网络内每台主机的本地路由,使发往其它子网的数据发送到连接两个子网的路由器, 再由路由器转发。但这样也许并不是一个易于管理和维护的方案。我们可以使用ARP代理使子网的划分对每台主机更加透明化。ARP代理的工作原理很简单:
当ARP请求是从一个网络的主机发往另一个网络的主机时,启用ARP代理的连接这两个网络的路由器将回答该请求,使请求的发送者误以为此路由器就是目标主机, 而将所有数据帧发送到此路由器。路由器在收到数据帧后,再将其转发到真正的目标主机(动画演示)。
ARP代理实际上是使用了简单的欺骗手段,使网络内的主机错误的认为目标主机与自己处于同一网段内,从而达到了透明化子网划分的目的。