1. ARP是什么
ARP(Address Resolution Protocol)是地址解析协议的简称,这个协议原理简单但十分重要,并且在现实网络中十分常见,所以了解一下它总归是没有错的。
ARP协议位于TCP/IP四层模型的网络接口层,也可以说是教材中所讲的五层模型的数据链路层,它工作在链路层但为网络层提供服务。
而ARP协议主要用于解决什么问题呢?ARP协议提供了一种将不同形式的地址进行动态转换的方式,通常来说是将IP地址和任意一种链路层地址(通常是MAC地址)进行转换。
当一个以太网帧从局域网中的一个主机发往另一个主机的时候,帧头中的48位目的MAC地址决定了这个以太网帧的目的地,而路径上的中转站们可不会关注IP报文里的目的IP地址。但不幸的是,网络层及上层应用通常都是用IP地址甚至更高层的抽象(域名)来表示一个目的地的,而且像32位的IP地址和48位的MAC地址间并不存在一种简单的映射关系,所以这就需要ARP协议来帮助操作系统对IP地址进行转换了。
2. 工作原理
ARP叫做地址解析协议,顾名思义是用来解析局域网中某一IP地址所对应的MAC地址的。
它的工作原理基本可以概括为下面:每个主机都有一个ARP高速缓存,里面记录了一些IP地址与MAC地址的映射关系。
用命令arp -a
可以显示出本机的arp高速缓存中的所有条目。
现在某一个主机想要和局域网下另一个设备通信,已经知道了另一个设备的IP地址,但如上面所说要实现通信还得知道它的MAC地址。所以该主机首先在自己的ARP高速缓存里查找有没有这个IP对应的MAC地址。如果没找到,这时候它会封装一个ARP请求报文,里面的主要内容是:我的IP地址是xx.xx.xx.xx,我的MAC地址是xx.xx.xx.xx.xx.xx,我想知道IP地址为xx.xx.xx.xx的主机的MAC地址是多少(当然这是形象化的描述,但是这句话里的每一个关键信息都在arp报文里有对应,毕竟把形象的信息精确的描述出来就是网络协议的长处之一)。这个请求报文是以广播的形式向局域网发出的,简单地说就是在一般情况下,局域网的所有主机都会收到这个请求报文。这时比如说一个不是请求对象的主机收到这个请求,他发现这个arp报文并不是在请求自己的MAC地址,所以会直接把这个报文丢掉(其实会多做一步,他会把这个arp请求的源IP和源MAC存储起来,之所以这样设计肯定也是为了方便,万一我以后想和这个发送者通信,就不用再特意请求一次了)。而某一时刻目标主机也受到了这个报文,他发现这是在请求自己的MAC地址,因为自己的IP地址和上面的请求内容中的IP地址匹配上了,所以他会向源主机发送一个单播的ARP回应,里面的内容是:IP地址为xx.xx.xx.xx的主机的MAC地址是xx.xx.xx.xx.xx.xx。这个响应报文是直接朝源主机发送的单播报文,所以在局域网里只有该主机能收到,而源主机收到回应后会把这个IP地址与MAC地址的映射存在自己的ARP高速缓存里,而之后有了MAC地址后面的通信也就可以畅通无阻了。
注意ARP高速缓存的重要作用,正如计算机领域中所有其他的cache一样,ARP Cache同样是为了优化性能而被使用的。试想这样一种情景,两个主机频繁相互通信,假如每发送一个报文之前就要先发送一次ARP请求,可以想到是十分的低效的,所以ARP规定了把之前收到的ARP回应中的IP和MAC信息存在缓存表中,同样也会把收到的不是请求自己的ARP请求里的源IP和源MAC记录进自己的缓存表中,可以感性的想到这相当于把网络中暂时比较活跃的主机提前记录下来,这样下次要查表的时候命中几率也会大一点。但缓存表中的条目也不能永远记录在案,假如某一个IP地址被分配给了另一个主机,即有另一个硬件地址,这时候你还傻乎乎的照着缓存表的旧条目去尝试通信当然不好了,所以ARP规定一个缓存表条目的生存时间通常为20min,过期即清除。
3. 协议格式
简单的看一下ARP协议的格式,主要关注一下几个重点字段。
Hardware type字段标志arp解析的硬件地址的类型,当是Ethernet时该字段为0x0001。
Network type字段标志arp解析的网络层地址类型,当是IP地址时该字段为0x0800。
OP标志这是一个什么种类的arp报文,当里面的值为1的时候表示这是一个ARP请求报文,值为2的时候表示这是一个ARP响应报文。
最后是6字节的发送方MAC地址,4字节的发送方IP地址,6字节的目标MAC地址,4字节的目标IP地址。
ARP工作在链路层,所以ARP数据直接封装在以太网帧头帧尾里来传输。当以太网帧传输的是arp报文的时候,frame type字段的值为0x0806。
4. ARP数据包示例
Wireshark捕获到的一对arp请求和响应报文
可以清楚的看到请求报文的目的MAC地址为全F,即广播地址。而响应报文变成了单播MAC地址。
其他条目就不一一解读了,毕竟Wireshark已经很贴心的用人的英语写出来了。
5. 扩展
无故ARP(Gratuitous ARP)
有时候主机会发出一种目的IP和源IP都是它自身的ARP请求报文,根据上面的知识我们可能觉得这一行为并没有什么用,因为你肯定接收不到回应。但其实不然,这种ARP报文在某些场景还是有自己的一席之地的。
假如一个主机新入网,被手动或自动地分配了一个IP地址,这时候该主机就可以发送一个目标IP为自己的IP地址的ARP请求,假如它收到了一个响应,就说明这个IP地址已经被分配了,出现了冲突,这时候就可以去让网络管理者给你重新分配一个IP地址。
还比如某一主机因为某些原因IP地址和MAC地址出现了变化,这时候可以发送一个无故ARP广播到整个网络,让网络中的其他主机更新它们的ARP缓存,使得通信快速恢复正常。
ARP欺骗
根据上面的内容我们知道,arp请求是以广播的方式向局域网发出的,并且arp报文内容都是明文传输的,这其实就造成了很大的不安全因素。举个最简单的例子,主机A请求主机B的MAC地址,但这个请求被主机C听到了,那主机C完全可以伪造一个arp应答,告诉主机A说主机B的MAC的地址是主机C的MAC地址,这样以后主机A往主机B发送的所有数据都会发送到主机C处,这就是arp欺骗。