地址解析协议(Address Resolution Protocol,缩写ARP)是一个通过解析
网络层地址来找寻
数据链路层地址的
网络传输协议,它在
IPv4中极其重要。
定义
在同一个以太网环境下传输数据时, 主机之间通过48位的MAC地址来进行通信,而IP协议则通过32位的IP协议进行通信, 网络层协议与数据链路层协议之间使用的地址并没有特定的函数关系, 这造成当 IP 协议通过路由算法确定出下一跳的目标主机时, 数据包无法直接根据IP地址投递给目标主机。在ARP出现协议之前, 由于缺乏一个统一的标准, 因此由具体的实现者 (Implementor) 自行来做 IP地址与MAC地址的转换, 而ARP协议便是要解决这个问题, ARP 协议并非特定应用于MAC协议与IP协议的地址映射, 而是支持多种数据链路层协议与网络层协议。
发展历史
技术起源
ARP的正式定义由IETF(互联网工程任务组)于1982年11月的RFC 826给出,其中包括制定ARP的动机、定义、报文格式、报文生成、报文接收等内容。随着时间的推移,IETF已经对其做了许多改进,扩充协议的定义,增加功能。
发展历程
1984年6月,RFC 903定义了逆向地址解析协议(Reverse AddressResolution Protocol,缩写RARP), 实现MAC地址动态映射到协议地址(如IP地址)。
1998年9月,RFC 2390描述了ARP的新增功能-反向地址解析协议(Inverse Address Resolution Protocol,缩写InARP),允许站点请求与给定硬件地址对应的协议地址。
2008年7月,RFC 5227在RFC 826的基础上进行了扩展:配置接口时应生成特定的ARP请求,以发现地址是否已在使用,以及对每个接收到的ARP数据包进行额外的简单测试,以便于进行被动冲突检测。
2009年4月,RFC 5494规定了IANA( Internet Assigned Numbers Authority,互联网号码分配机构)对ARP的分配指南,用于对地址解析协议(ARP)中的各个字段分配新值。此更改也适用于使用相同消息格式的ARP扩展,如[RFC903]、[RFC1931]和[RFC2390]等。
基本原理
ARP实现过程
在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如下表所示:
以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。
1.当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址为(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可。
2.如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在本地网络上广播发送一个ARP请求(ARP request),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是什么?”
3.网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的应答(ARP response):“192.168.38.11的MAC地址是00-BB-00-62-C2-02”,此应答以单播方式进行。这样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。同时它还更新自己的ARP缓存(ARP cache),下次再向主机B发送信息时,直接从ARP缓存表里查找就可。
ARP缓存
ARP缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可减少缓存表的长度,加快查询速度。
无故ARP
无故ARP(gratuitous ARP)是指主机发送ARP查询(广播)自己的IP地址,当ARP功能被开启或者是端口初始配置完成,主机向网络发送无回报的ARP来查询自己的IP地址确认地址唯一可用,作用如下:
1.确定网络中是否有其他主机使用了相同的IP地址,如果有应答则产生错误消息。
2. 无故ARP可以做更新ARP缓存用,网络中的其他主机收到该广播则在缓存中更新条目,收到该广播的主机无论是否存在与IP地址相关的条目都会强制更新,如果存在旧条目则会将MAC更新为广播包中的MAC。
代理ARP
代理ARP是ARP协议的一个变种。对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的ARP请求会使用自己的MAC地址与目标计算机的IP地址对源计算机进行应答。代理ARP就是将一个主机“作为”另一个主机对收到的ARP请求进行应答。它能使得在不影响路由表的情况下添加一个新的Router,使得子网对该主机来说变得更透明化。同时也会带来巨大的风险,除了ARP欺骗,和某个网段内的ARP增加,最重要的就是无法对网络拓扑进行网络概括。代理ARP的使用一般是使用在没有配置默认网关和路由策略的网络上的。
报文格式
ARP是通过报文工作的,ARP报文分为ARP请求和ARP应答报文两种,报文长度28个字节,其中ARP报头是18个字节,包含硬件类型、上层协议类型、硬件地址长度、协议地址长度、操作类型5个字段。除去报头外,剩余20个字节分别表示源、目的MAC地址和协议地址。报文包括如下字段:
到达数据链路层后,由数据链路层协议进行封装,一般是以太网协议。封装的过程,就是在ARP报文的前面加上以太网帧首部,再加上4字节的冗余校验码结尾,校验码用于检验数据传输是否出现损坏。以太网帧首部一共14个字节,包含目的MAC地址、源MAC地址、帧类型三个字段,此时报文包括如下字段:
以太网帧首部:
ARP报文:
ARP协议的参数由互联网号码分配局(Internet Assigned Numbers Authority, 简称IANA)负责标准化和维护。
ARP协议的以太类型为0x0806。该类型出现于以太网帧格式中的以太类型字段。请注意区别此类型和ARP协议类型(PTYPE)。
应用
①局域网通信:在同一局域网内的设备通信时,ARP用于解析IP地址到MAC地址,这是其最基本的应用场景。通过ARP请求和应答,设备能够学习到同一网络内其他设备的MAC地址,从而实现数据的准确传输。
②跨网络通信:当通信发生在不同网络时,ARP可以结合路由信息,通过代理ARP或路由器的ARP表来解析目标MAC地址。例如,如果目的IP和本机IP不属于同一网段,ARP请求会查询网关的MAC地址,然后由网关继续转发数据包至目标网络。
③网络诊断:ARP命令(如arp -a)可以用来诊断网络问题,例如IP地址冲突、网络连接问题等。通过查看ARP缓存表,网络管理员可以识别和解决网络中的一些问题:
arp-a或arp –g
用于查看缓存中的所有项目。-a和-g参数的结果是一样的,多年来-g一直是UNIX平台上用来显示ARP缓存中所有项目的选项,而Windows用的是arp -a(-a可被视为all,即全部的意思),但它也可以接受比较传统的-g选项。
arp-a IP
如果有多个网卡,那么使用arp -a加上接口的IP地址,就可以只显示与该接口相关的ARP缓存项目。
arp-s IP 物理地址
可以向ARP缓存中人工输入一个静态项目。该项目在计算机引导过程中将保持有效状态,或者在出现错误时,人工配置的物理地址将自动更新该项目。
arp-d IP
使用该命令能够人工删除一个静态项目。
后续发展
地址解析协议是IPv4中必不可少的协议,但在IPv6中将不再存在地址解析协议。在IPv6中,地址解析协议的功能将由NDP(邻居发现协议,Neighbor Discovery Protocol)实现,它使用一系列IPv6控制信息报文(ICMPv6)来实现相邻节点(同一链路上的节点)的交互管理,并在一个子网中保持网络层地址和数据链路层地址之间的映射。邻居发现协议中定义了5种类型的信息:路由器宣告、路由器请求、路由重定向、邻居请求和邻居宣告。与ARP相比,NDP可以实现路由器发现、前缀发现、参数发现、地址自动配置、地址解析(代替ARP和RARP)、下一跳确定、邻居不可达检测、重复地址检测、重定向等更多功能。
NDP与ARP的区别:
IPv4中地址解析协议是独立的协议,负责IP地址到MAC地址的转换,对不同的数据链路层协议要定义不同的地址解析协议。IPv6中NDP包含了ARP的功能,且运行于因特网控制信息协议ICMPv6上,更具有一般性,包括更多的内容,而且适用于各种数据链路层协议。地址解析协议以及ICMPv4路由器发现和ICMPv4重定向报文基于广播,而NDP的邻居发现报文基于高效的组播和单播。
ARP存在的安全风险
ARP欺骗
ARP协议本身缺乏验证机制, 所有的请求和应答都是通过明文发送, 它是建立在相互信任的机制之上运行的, 因此也缺乏安全性。例如可以伪造ARP应答, 随意封装一个错误的ARP应答包, 以发起ARP攻击, 此类攻击的门槛很低, 任何了解ARP协议的攻击者都可以轻而易举地发送欺骗应答。为了解决此类问题, 最直接的方法可以是静态绑定局域网主机IP地址与MAC地址的映射关系, 但这缺乏了灵活性,还有的方法是当主机首次运行DHCP时, 可以由统一的交换机记录下主机IP与MAC地址的映射关系, 之后当需要请求获得映射关系时可以通过交换机的映射表来查询, 此类方法都需要采取额外的机制。
ARP缓存溢出
ARP缓存有限,恶意攻击者可以通过发送大量虚假ARP请求使得缓存溢出,导致网络服务中断或拒绝服务攻击,可以设置一些缓存清理策略来进行处理。
协议的分层
ARP协议在TCP/IP模型和OSI模型的位置可能会造成混乱和争议。RFC 1122中仅仅在数据链路层提及ARP协议但并未说明将此协议置于该层。一般在OSI模型中将ARP置于数据链路层,而在TCP/IP模型中,ARP协议属于网络层。
参考资料
RFC 826.An Ethernet Address Resolution Protocol: Or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware.
RFC 903.A Reverse Address Resolution Protocol.
RFC 2390.Inverse Address Resolution Protocol.