ARP即Address Resolution Protocol地址问题的协议,以目标IP为线索,用来定位下一个应该接收数据包的网络设备所对应的Mac地址。 > ARP仅仅适用于IPv4,不能用于IPv6,在IPv6中可以用ICMPv6代替ARP邻居探索消息. # ARP工作原理 ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。 ![](https://leanote.com/api/file/getImage?fileId=597567cbab64415fa1000b20) 主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。就是说,ARP请求包中已经包含了主机B的IP地址。由于广播的包可以被同一个链路上的所有主机或路由器接收,因此ARP的请求包也会被着同一个链路上所有主句和路由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。 总之,从一个IP地址发送ARP请求包以了解其MAC地址(ARP请求包还有一个作用,那就是将自己的MAC地址告诉给对方),目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。 根据ARP可以动态地进行地址解析,因此,在TCP/IP的网络构造和网络通信中无需事先知道MAC地址是什么,只要有IP地址即可。 如果没发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量。通常做法是把获取到的MAC地址缓存一段时间。即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆到一个ARP缓存表中(记录IP地址与MAC地址对应关系的数据库叫做ARP表。通过arp-e命令获取该表信息),下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中MAC地址进行数据报的发送。每次执行一次ARP,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。每执行一次ARP,其对应的缓存内容会被清除。不过在清除之前都可以不需要执行ARP就可以获取想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性。 一般来说,发送过一次IP数据报的主机,继续发送多次IP数据报的可能性会比较高。因此,这种缓存能够有效地减少ARP包的发送。反之,接收ARP请求的那个主机又可以从这个ARP请求包获取发送端主机的IP地址及其MAC地址。这时他也可以将这些MAC地址的信息缓存起来,从而根据MAC地址发送ARP响应包给发送端主机。类似的,接收到IP数据报的主机又往往会继续返回IP数据报给发送端主机,以作为相应。因此,在接收主机端缓存MAC地址也是一种提高效率的方法。 不过,MAC地址的缓存是有一定期限的。超过了这个期限,缓存的内容将被清除。这使得MAC地址与IP地址对应关系即使发生了变化,也依然能将数据包正确地发送给目标地址。 ![](https://leanote.com/api/file/getImage?fileId=597567cbab64415fa1000b21) # IP地址和MAC地址缺一不可? 出现的疑问是:只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了么?那么,为什么既需要IP地址又需要MAC地址呢? 如下的案例,主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B。此时主机A必须得先将数据报发送给路由器C的MAC地址C1。 ![](https://leanote.com/api/file/getImage?fileId=597567cbab64415fa1000b22)