ARP协议学网络的人都知道,是TCP/IP众协议中较为简单的一个。其大致又可分文普通ARP、无故ARP(或免费ARP)、代理ARP以及反向ARP。


一、ARP协议概述


ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在以太网中,当一个上层协议要发包时,有了节点的IP地址,ARP就能提供该节点的MAC地址。至于它是工作在那一层的协议,据说在OSI模型中是属于链路层,而在TCP/IP模型中属于网络层。个人认为其实它工作在哪一层并不重要,只要知道它是维系网络层和链路层通讯的一个桥梁就好。

130112705.jpg

封装图1 ARP报文的以太网封装格式



130112753.jpg

封装图2 ARP报文格式


从图1-1和图1-2中可以看到ARP报文是直接封装在以太网里的,其长度为28字节。其中以太网的硬件类型为1,IP的协议类型是0x0800,这是最为常见的硬件和协议类型。在操作代码中,值为1表示ARP请求报文,值为2表示ARP应答报文,值为3表示RARP请求报文,值为4表示RARP应答报文。


190532822.jpg

拓扑图1:C1 ping C2

图中C1为本地的真实机,用的是win7系统。C2为虚拟机,为Liunx系统。整个拓扑结构在GNS3中搭建。三个设备的配置很简单,参看下面的图。

193034811.jpg


193035245.jpg


193035861.jpg

配置图1:PC1、PC2、R1的配置


由于在同一网段,故2台PC均没有设置网关,在C1pingC2之前先清空arp表,下图为ping之后的抓包:


200202945.jpg

抓包图1:ARP的request报文

200204275.jpg

              抓包图2:ARP的REPLY报文


通过以上arp的request包和reply包抓图可以很清楚的看出ARP直接由链路层封装,其长度为28个字节。当C1pingC2时首先发一个广播去查找谁是C2并要它的MAC地址,而reply包则是C2回复C1告诉其自己的MAC地址。有了C2的MAC地址后,ping命令就可以借助ICMP协议进行下去了。


二、普通ARP


其实上面举的例子就是一个在同一子网中实现的普通ARP,所以不需要设置ARP。更常见的情况我们是要和外网通信,这个就需要配置网关。

203512856.jpg

拓扑图2:C2 ping R2


该拓扑图在1的基础上添加了一台路由器R2,其和R1通过串口相连,相互之间需要路由协议保证可以顺利路由。C2添加网关192.168.18.254。

205600640.jpg


205600927.jpg


205601157.jpg

配置图2:PC2、R1、R2的配置


配置完后,在ping之前一定要清空C2的arp缓存,下图为ping后的抓包图:

211019554.jpg

抓包图3:普通ARP


包内具体内容前面已经分析过这里不再赘述。通过这个抓包可以看出,如果ping外网的一个地址,那么会直接发arp协议去广播查找网关的MAC而不是目的IP的MAC(如果本地缓存中网关MAC地址则省去这一步),当得到网关的MAC后ICMP直接封装其MAC地址去查找目的IP。这里也可以看出为什么说路由器是用来分割广播域的。这就是普通ARP的一个标准传输过程。


三、代理ARP


上面我们ping外网的实验是加上了网关,C2去主动查找网关的MAC,那如果我们去掉网关再去ping外网会发生什么呢?让我们先搭建下面的拓扑图。

214347418.jpg

拓扑图3:C3 ping R2


C3是在原实验中新加的,其是有路由器去掉routing功能模拟而成的。

214939556.jpg

配置图3:C3的配置


当使用路由器模拟PC机时,这个实验两点很重要,一是要关闭路由功能(no ip routing) ,二就是指定默认网关。配置好C3后去pingR2,抓包图如下:

215700247.jpg

抓包图4:代理ARP


很明显,这个抓包图和抓包图3除了IP和MAC地址不一样,其他都是一样的。也就是说无论是否有网关我们都能ping到我们想ping的地方,似乎着一些对主机都是透明的。为什么会这样呢?这就是代理ARP的作用。

什么是代理ARP?一台发往其他计算机的ARP请求,被路由器回应,通过伪造身份,路由器承担了将数据包发送到真实目的地的责任。代理ARP能够帮助在一个子网内的计算机到达远程子网而不需要配置路由或者默认网关。

路由器默认状态代理ARP是开启的,这个可以通过show ip interfaces命令在每个接口上看到“Proxy ARP is enabled”这句话。为了进一步验证代理ARP功能,我们可以在R1的f0/0接口上使用no ip proxy-arp命令关闭代理ARP,然后我们在ping路由器R2。抓包图如下:

233734953.jpg

抓包图5:关闭代理ARP


显然,关闭代理ARP之后,由于没有默认网关,R1不在响应C3的ARP包。也许有人会奇怪,既然路由器默认代理ARP都是开启的,那为什么我们还要设置网关呢?这里我们再做一个实验,我们这次选择通过C2去ping路由器R2,当然要去掉默认网关。下图为操作过程和结果:

000715606.jpg

配置图4:完整的ping过程


这次笔者从C2(192.168.18.18)依次连续ping路由器R2(1.1.1.2),不存在IP地址(192.168.18.1),直连路由器R1(192.168.18.254),三者结果迥然不同。pingR2时并没有出现和C3一样的结果,而是立刻显示网络不可达,甚至抓包软件相关的包一个也没有抓到。ping一个不存在的地址时显示的是主机不可达。只有在pingR1时候才得到我们预料中的结果。而且笔者也从主机C1做了类似的实验,结果是相同的。

为什么C1、C2会和C3的结果不一样呢?C3不是模拟了C1或者C2吗?这里我只能说虽然路由器是在模拟一台PC,但它毕竟不是PC。实际情况是无论是在windows还是linux环境下去ping一个地址,首先它要与子网掩码做与运算,如果发现是本网段会发出ARP查询,如果不是本网段有默认网关的话会arp查询网关mac然后交给网关处理,若是没有网关会直接丢包,根本不会发出ARP查询!

个人觉得实际生活中用到代理ARP的情况概率很低。路由器还把代理功能设为默认启动,不但浪费资源而且存在ARP***等安全隐患,不如将代理功能设为默认关闭。


四、无故ARP


主机偶尔也会使用自己的IP地址作为目标地址发送ARP请求,这种ARP请求成为无故ARP,也称免费ARP。这里我们做个实验,将主机C1(192.168.18.16)的地址刻意改为主机C3(192.168.18.17)的地址。下图为此过程的抓包结果:

005056125.jpg

抓包图6:无故ARP


从图中可以看出,C1欲把IP地址改为C3的地址,当改地址时发出一个ARP以确定该地址没有被占,结果C3回复说该IP地址已经被占,于是出现IP地址冲突。 无奈之下C1只好在选择其他地址,这里选择了169.254.74.195(169.254.X.X是Windows操作系统在DHCP信息租用失败时自动给客户机分配的IP地址),最终配置见下图:

005053653.jpg

配置图5:无故ARP


五、反向ARP

反向ARP故名思议知道MAC地址求IP地址。一般用在系统开机时,只有自己的物理网络地址而没有IP地址,则他可以通过RARP协议,并发出广播请求,征求自己的IP地址。

反向ARP在很大程度上正在被DHCP和BOOTP的扩展协议所替代,不同于RARP,这两种协议都可以提供IP地址以外的更多信息,而且还可以跨越本地数据链路。

非常遗憾笔者找不到合适的环境和模拟器来模拟出反向ARP,不过我们可以做一个DHCP实验来了解一下它是如何工作的。

012331184.jpg

拓扑图4:DHCP


拓扑图4中加了一台PC机C4用来模拟DHCP,该PC机用一小软件VPCS实现。同时需要在R1上开启DHCP服务器功能。

013923548.jpg

配置图6:DHCP Server  


我们这里用R1充当DHCP服务器,其配置如图6所示。配置好之后,可以在VPCS上运行DHCP,如下图所示:        

015955481.jpg

配置图7:DHCP Client


如图可见其IP分配成功,地址为192.168.18.1/24,Server和Client具体交互细节见下图:

020043344.jpg抓包图7:DHCP

该图详细的记录了Discover、Offer、Request和ACK的交互细节,对照抓包图,我们可对DHCP的理论有一个直观的认识。现在观察DHCP服务器,我们可以发现地址192.168.18.1已经绑定。如下图:

020125660.jpg

配置图8:DHCP POOL


             

ARP协议就分析到此了,由于笔者水平有限肯定有错误和不足之处,还望大家指正共同学习!