Address Resolution Protocol


 ARP协议是专门解决局域网内部MAC地址的协议,通过IP地址来寻找该IP地址设备的MAC地址。由请求主机以广播的方式发出请求,请求包里面IP对应的主机会回应,这样就完成一次ARP完整传输。

如果每发送一次数据都要获取一次ARP请求,那么一个局域网多个主机传输数据的话,额外产生的ARP流量是不小的开销,因此每个设备会有ARP表,该表记录IP地址与MAC地址的映射。

window系统可通过arp -a命令查看:

 主机会把获取的ARP记录记忆到该表中,这样下次传输数据就不需要获取ARP协议了,ARP表中的映射关系是有缓存期限的,超出期限的记录会被从表中清除掉,这样是为了防止IP和MAC地址发生变化导致数据包发错了目标地址。因此ARP表的类型分为动态记录和静态记录,动态记录会根据期限来调整,静态记录是绑定的,在这个网段中是终生不变的。

​ 为了使得ARP协议形象化,使用Wireshark软件对arp包进行捕获:

可以看到第一条记录,由本机MAC地址(48:a4:72:59:82:4c)发往广播地址(ff:ff:ff:ff:ff:ff)的arp包,点开查看详情如下:

可以看到上图的ARP协议的详细信息:

Hardware type:Ethernet   硬件类型是以太网

Protocol type:IPv4      上层协议类型是IPv4

Hardware size:6        MAC地址长度是6字节

Protocol size:4         IP地址长度是4字节

Opcode:request (1)      操作类型是查询

Sender MAC address、Sender IP address、Target MAC address、Target IP address分别表示发送端MAC地址、IP地址与接收端MAC地址、IP地址。

综上信息可以判断出这是一个ARP查询包,用于本机向广播地址发送的,查询网关IP的MAC地址。

如果不出意外网关设备会进行ARP回应,告知本机自身的MAC地址。

查看第二条记录,是由28:d1:27:e3:f8:a5这个地址发给本机MAC地址(48:a4:72:59:82:4c),目前还不知道28:d1:27:e3:f8:a5这个地址来自哪里,点开详情查看分析:

前面的信息就不用看了,从Opcode这个开始看起,通过Opcode:reply (2)这个属性可以理解出这个是一个回应包。接着看到发送端MAC地址和上面的28:d1:27:e3:f8:a5一致,发送端IP地址是网关的IP地址,到这里已经可以确定这是网关设备对本机发出ARP请求的回应包。(下面的接收端地址证明了是本机)

以上就是通过wireshark捕获到一个完整的ARP请求与回复包,本机会把获取到的记录存至ARP缓存表,并刷新期限。


但是既然已经进行了一次ARP完整传输,那么第三条记录和第四条记录为何还是ARP记录?

既然ARP是广播包,为何源地址和目标地址是网关设备和主机的MAC地址?

其实这是一种ARP的机制,称为单播轮询。通过定期向ARP表中的主机发送ARP请求确认包,主动性轮询该主机,如果连续N次该主机没有回应reply,那么就把该主机从ARP表中删除。

还有一种ARP包叫做无偿ARP,也叫无故ARP。在没有设备询问的时候自问自答。

这种就是主机发送给主机自己的ARP包,但是这是一种广播包,发送给所有的设备,让大家都知道。

无偿ARP的出现有多种用途,比如这个主机的IP和其他主机的IP冲突了、ARP缓存表清理、网络设备的IP地址修改等情况下该设备会发出无故ARP包通知该网段所有设备。

可以看到Opcode下面的两行,说明了这是一个无故ARP包,并且还可以从发送端IP和接收端IP看出来。