简介
ARP(Address Resolution Protocol):地址解析协议。是用来根据IP地址来查找对应的物理地址(mac地址),即以太网接口地址。
既然有根据IP查找mac地址的地址解析协议,也有根据mac地址查找IP地址的协议:逆地址解析协议RARP(Reverse Address Resolution Protocol),这个不是本文重点,不再表达。
协议体系层次
协议体系结构主要有两种:1. OSI七层体系模型,2. TCP/IP的四层体系模型
学习,选第3种,如图片最右侧那个,这样容易阐述清楚概念。下面以针对第3种说明。
我翻了一些大学那会的教科书,把ARP协议划分到网络层。和IP协议同层,实际上应该属于网络层的最下层,ARP协议是被IP协议使用,但又没有划到数据链路层,那算网络层的最下层吧。(我本以为属于数据链路层,看下文)
在数据链路层的工作
虽然被划分到网络层,说起来算是工作在数据链路层,为什么这样说?
在同一局域网内,一个数据帧从一台主机或路由器/交换机(路由器和交换机其实不属于一层,一个在网络层,一个在链路层,现在的设备高端呀),发往目的主机,是根据以太网接口地址(物理地址,也就网卡的mac地址)来确定的。IP寻址是工作在路由器这一层(网络层),在交换机这一层寻址是通过mac地址的。设备驱动程序(如网卡驱动)不检查IP数据报中的目的IP地址。
ARP请求/应答数据报格式
共28个字节长度。这里没画出以太网帧首部,如果是arp请求/应答,以太网帧首部14个字节的最后2个字节表示帧类型的值是0x0806。
简单说明下上面几个字段:硬件地址是硬件地址类型,协议类型分以太网地址类型和IP地址,因此协议地址长度的值可能为6或4。OP是操作类型,有4种:arp请求、arp应答、rarp请求和rarp应答,对应的值分别为1、2、3、4(本文不关注rarp)。
wireshark抓包分析
p.s. 我的系统是ubuntu,和windows上的wireshark可能会有一点点的区别(我不清楚)。但主要功能上是没有区别的。
打开wireshark,指定过滤接口并设置捕获过滤器只捕获arp协议:
捕获开始,就看到的是我的小米路由器的arp广播请求。。。。每过一会,它就会广播一次。除了网关,依次查询当前网段每个IP对应mac地址。
刚好,我这个网段内也有几台设备,可以看到arp应答:
这个221主机就是我当前正在写博客的笔记本,可以看到查询到这里的时候,我的给出了应答。
展开看下arp请求信息:
在以太网桢的最后两个字节Type字段那里值是0x0806。arp协议部分,每一个字段可以对照上面的报文格式来看(顺序一致)。
应答报文:
ARP缓存
主机上都有arp高速缓存,存放着最近的ip到mac的映射。这个缓存是存在失效时间的,不过多久我目前未确认,我曾在TCP/IP详解卷1中看到过说是一般为20分钟。我查了我的系统对这个失效时间的值是多少,并测试了下,结果并不理想。
我们可以使用arp命令来查看arp缓存表,执行arp -a,linux/windows都可以执行这个命令:
arp命令其它选项可以查看帮助文档,如果详细信息、增加、删除等。
免费ARP
免费arp有两个作用:1. 确定IP是否冲突:比如配置主机IP时候,发一个arp请求,如果局域网内不存在同样IP配置的主机,就不会有应答;2. 更新目的主机的arp缓存:这是协议规范,收到arp请求的主机会根据arp请求的源地址更新本地arp缓存。
第2个作用,也是我比较感兴趣的一个东西,因为它可以进行arp缓存中毒攻击,arp欺骗。比如:我对我局域内某台主机发送arp请求,源IP是网关地址,mac地址是我本机接口地址,这样另一台主机的arp表会更新网关地址的mac地址为我这台主机的mac地址。这样它向网关发送请求的时候,流量都会走到我这台电脑上。如下对局域网内另一台主机,进行arp缓存中毒攻击,用wireshark抓包:
查看另一个电脑的arp表:
可以看到网关的mac地址是我当前主机的mac地址了。