ARP(Address Resolution Protocol) -----地址解析协议。根据百度百科:” ARP,即地址解析协议,实现通过IP地址得知其物理地址。在tcp/ip网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。”
 
详见rfc826中的定义:

Presented here is a protocol that allows dynamic distribution of the information needed to build tables to translate an address A in protocol P's address space into a 48.bit Ethernet address.

注:P指的是一台设备。
arp其实就将32位ip地址解析成48位的mac地址。因为链路层不识别ip地址,另外mac地址具有唯一性。Arp用的很广,从硬件类型就可以看出,常见的支持ethernet,frame-relay,atm,hdlc等,个人认为,只要是ma(multi-access)都需要arp。但在p2p环境中,就不需要arp了,因为在p2p环境中(比如ppp),他只要将报文从接口中扔出即可,接受者只有对方。拨号(pppoe)也是如此。
 
 
先看看ARP数据包的格式:
 
Dest mac
Sou
mac
type
Hardware
type
Protocol
type
Hardware
size
Protocol
size
opcode
Sender
mac
Sender
ip
Target
mac
Target
ip
 

从硬件类型(hardware type)开始就是ARP数据包了,前面是以太网的帧头。

 
先看各个字段

硬件类型(hardware type)为16bit,指定了硬件类型,常见的有:

编号
硬件类型
1
以太网
15
帧中继
16
hdlc
17
ATM(异步传输模式)
20
串型链路
 

协议类型(protocol type)为16bit.,指定了发送者映射到硬件地址(在ethernet中的mac地址,hdlc中的pvc等)的网络层协议。

Ip 为0X0800(这里与以太网的frame头中的type字段很相似,这里标识的是上层的用的是什么传输协议来封装,比如说ip, ipv6, ipx, appletalk 等)
 

硬件地址大小(hardware address size)为8个bit,指定了硬件地址的大小(ethernet中的mac地址大小,mac为6(字节))

 

协议地址大小(protocol address size)为8个bit,指定了网络层地址的大小(ipv4为4(字节))

 
操作(opcode)为16个bit,指明这个arp数据包是arp request (1)还是 arp reply(2)。还有反转arp request(8),反转 arp reply(9)。
 

发送者硬件地址(sender hardware address)为48个bit-----这里以 ethernet 为例

 
发送者网络层地址 (sender ip address)为32个bit ------这里以ip 为例
 

目的者硬件地址(target hardware address)为48个bit

目的者网络层地址(target ip address)为32个bit

 
看看arp request包
 

 
 
Arp reply包
 

免费arp
 
免费arp即链路中的设备将自己的ip地址做为目的地址来发送arp请求,设备是很不愿意收到这样的arp回复的,如果收到说明链路中有设备与自己的ip地址相同。
主要作用:
1、 检查链路中是否有重复地址
2、 用于hsrp中standby---》active
 
其实每个配置了ip地址的设备刚开机或者刚连接到链路上,都会发送免费arp
看看windows主机发送的免费arp:
 

再看看router发送的免费arp
cisco
 

 
路由器与主机发送的免费arp并不一致。而且个数也不相同。主机是一次发送3个request 包。而router是一次发2个relay 包。也许router之间是不会将免费arp放进自己的arp缓存中,而主机可能将router发送的免费arp放进自己的arp缓存中,可能hsrp中设备更改standby---》active状态就是这样更改主机的arp缓存的吧(这个与arp欺骗很相似)
 
如果设备没有配置ip地址,他会发送免费arp吗?


 
答案是不会。
看看router收到免费arp是否放进自己的arp-cache中
其实arp-cache的作用就是方便再一段时间再去访问该设备不需要去请求对方的mac地址,节省链路的带宽与cpu的处理------很多地方都是这样。为高速包交换 
看topology
 

R1与R2、R3为192.168.1.0/24
R2与R4为24.1.1.0/24
R3与R4为34.1.1.0/24
R4的lookback1 地址为4.4.4.4
 
那些ARP包会被设备放进自己的ARP-CACHE中
R2上面开启debug arp
 

首先是免费arp,R2收到R3的免费arp,但是并没有放进arp缓存。
 
请求目的mac的请求者与被请求者
这里以R1请求R2的mac地址,与R3请求R1的mac地址为例
 
先清空arp-cache
R1
 

 
R2
 

R3
 

首先R1请求R2的mac地址
 

 
访问后R1的arp-cache
 

 
 
 
 
 
 
R2的ARP-Cache
 

 
无关人----R3的arp-cache
 
 

然后R3请求R1的mac地址
 


 
 
R3访问R1后访问后,R1的arp-cache
 

 
R3访问R1后访问后,R2的arp-cache
 
 

 
R3访问R1后访问后,R3的arp-cache
 
 

 
总结:
ARP数据包是一个broadcast frame,    整个broadcast domain中所以的设备都会收到。只有请求者与应答者会 将对方的ip-mac的映射放进自己的arp-cache中,而其他设备解包后丢弃,不会放进自己的arp-cache中。如果自己arp-cache中有该映射的ip地址,后接受的会覆盖先接受的。                                           
 
代理arp
 
代理arp应该算是一种arp欺骗,网关设备向主机或者网段之间的其他设备作出的一个代理应答。因为router并不转发广播包,而且有去往目的的路由。所以将自己与之直连的接口的mac地址和目的设备的ip地址做一个映射来应答请求的设备。
 
这里让我想起来,红头发曾经遗留的一道题目:下一
条是直连设备的ip地址与下一条是自己的接口有什么不同。
 
根据上面的top
我在R1配置一条静态路由

R1(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.2

R1(config)# ip route 0.0.0.0 0.0.0.0 fa 0/0

 
现在在R1上面去访问R4的lookback0地址:4.4.4.4
 
先是配置成

R1(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.2

而且开启了proxy ARP(default开启)

 

 
R1访问目的地址为4.4.4.4后的arp-cache

 

 

R1请求的是gateway的mac地址(里面没有用到proxy arp),只是将数据包扔给Gateway,由Gateway来转发(这里不管目的是什么网段,都交由GATEWAY, 如果Gateway路由表里面没有到达的路由,就会回复一个icmp报文:目的不可达)

 

 

 

 

将前面那条default route no掉,配置成

R1(config)# ip route 0.0.0.0 0.0.0.0 fa 0/0

 
再去访问4.4.4.4
R1请求4.4.4.4的设备的mac地址,这时R2与R3同时将自己的mac给予回应(这里就是代理arp)
收到2个arp reply
先是R3回应的:
 

 
再是R2回应的:
 

看R3的回应的ARP报文,还出现了多个ip地址映射成一个mac地址。而后回应的ARP,会取代先形成的映射(ip地址相同的),与arp欺骗差不多吧
 
看R2 debug结果
 

R1访问4.4.4.4成功,Arp-Cache中出现4.4.4.4映射的MAC(是R2做的Proxy Arp)
 

总结:这里都能访问目的网段,有什么问题呢。这里配置下一条为接口的,谁后回应arp,将谁的mac与目的网段做映射,如果在R2与R4之间设置了加密,而你却走R3,如果R3是一个非法者,R1发送的包全给R3监听了。
 
既然开启proxy arp都可以访问,现在关闭proxy arp功能,R2关闭后debug的结果
 

R3关闭Proxy ARP:
 

R2与R3关闭Proxy Arp后,R1访问4.4.4.4
 
 

压根就没有设备回应R1的ARP request ,R1都没有封装成功。
 

 
 
将默认路由的下一下换成R2的ip地址,R2成为R1的网关:
 
R1的ARP Request
 

R2的ARP Reply:
 
 

       结果看到了吧,ping成功了。在看R1的Arp­-cache:
 

本来想做个Arp欺骗的实验,可以环境搭建不起来,就说说原理吧:                                                                                      
就上面的top:
R1是主机,R2是Gateway,R3做为***者,R3主动向R1发送Arp relay报文,发送者的ip 地址是R2的地址(192.168.1.2),而发送者的mac是自己的mac地址,R1收到后会覆盖之前R2的IP地址与MAC地址映射,将R2的IP地址与R3的MAC地址形成映射。而R1要向其他网段访问,就不会将数据包发给R2,而是R3,这个过程就是ARP欺骗。
 
本文到此结束,写的比较仓促,有不对的地方请指正,谢谢