ARP-Address Resolution Protocol-地址解析协议

主要内容摘自:图解TCP/IP

ARP是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接受数据分包的网络设备的mac地址。

如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。

不过ARP只适用于IPv4,不能用于IPv6。IPv6可以用ICMPv6替代ARP发送邻居探索消息。

ARP的工作机制

ARP是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。

从一个IP地址发送ARP请求包以了解其MAC地址(同时ARP请求包也将自己的MAC地址告诉了对方),目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。

不是每次发送一个IP数据报都要进行一次ARP请求,接收端主机缓存MAC地址,提高效率,避免不必要的网络流量。

记录IP地址与MAC地址对应关系的数据库叫做ARP表。在UNIX或windows中可以通过“arp -a”命令获取该表信息。每执行一次ARP,其对应的缓存内容都会被清除。此外,MAC地址的缓存是有一定期限的。超过这个期限,缓存的内容将被清除。

ARP包格式

RARP

RARP (Reverse Address Resolution Protocol)是将ARP反过来,从MAC地址定位IP地址的一种协议。

一般用于向RARP服务器获取IP地址。

代理ARP

通常ARP包会被路由器隔离,但是采用代理ARP(proxy ARP)的路由器可以将ARP请求转发给邻近的网段。由此,两个以上的网段的节点之间可以像在同一个网段中一样进行通信。

在目前的TCP/IP网络中,一般情况下用路由器连接多个网络时,会在每个网段上定义各自的子网,从而进行路由控制。然而,对于那些不支持设定子网掩码的老设备来说,不适用代理ARP,有时就无法更好地适用网络。

ARP命令

一般执行arp -a即可显示所有网口mac。windows mac如下,-s添加,-d删除,-a显示。

ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr] [-v]

ARP包解析

通过wireshark抓取arp包。

arp请求包

arp响应包

免费ARP

免费ARP,也叫Gratutious ARP、无故ARP。这种ARP不同于一般的ARP请求,它的Sender IP和Target IP字段是相同的,相当于是请求自己的IP地址对应的MAC地址。

发送免费ARP的主机或者设备,往往并不希望收到一个ARP应答。因为若是收到了,说明网络上有人使用相同的IP,这会造成IP冲突。

免费ARP是一个广播ARP请求报文。

 ARP announcement

ARP announcement: 用于昭示天下(LAN)本机要使用某个IP地址了,是一个SenderIP和Traget IP填充的都是本机IP地址的ARP request。这会让LAN(VLAN)中所有主机都会更新自己的ARP cache,将IP地址映射到发送者的MAC地址

地址冲突检测(ACD)
Gratuitous ARP发现地址冲突后什么都不能做,只能提示用户发生了地址冲突。所以RFC5227提出了一个新的机制:ACD(Address Conflict Detection)

ACD可以对地址冲突做出反应,ACD定义了ARP probe和ARP announcement两种ARP包(都是ARP request,只是填充内容不太一样)

ARP probe:用于检测IP地址冲突,Sender IP填充为0,填充为0是为了避免对其他主机的ARP cache造成污染(因为可能已经有主机正在使用候选IP地址了,不要影响别人的正常通行嘛),Target IP是候选IP地址(即本机想要使用的IP地址)

ARP announcement:用于昭示天下(LAN)本机要使用某个IP地址了,是一个SenderIP和Traget IP填充的都是本机IP地址的ARP request。这会让LAN(VLAN)中所有主机都会更新自己的ARP cache,将IP地址映射到发送者的MAC地址。

ACD流程
1. 网卡启动时(或者从睡眠状态恢复,或者链接建立时)会发送一个ARP probe。(为了避免多个网卡同时启动同时发ARP probe造成拥塞,有一个拥塞避免策略,不会立刻发送ARP probe,单个网卡的多个probe也不会连续发送,会有间隔时间)

2. 发送主机可能收到ARP reply或者ARP probe,如果收到了ARP reply,说明候选IP地址已经有主机在用了。如果收到了一个Target IP地址为候选IP的ARPprobe,说明另外一个主机也同时想要使用该候选IP地址。这种情况下,两个主机都会提醒用户出现了IP地址冲突。然后进行地址冲突处理(见后面)

3. 如果上述两种ARP包都没有收到,说明候选IP地址可用。主机发送一个ARP announcement,告诉其他主机这个候选IP有人用了,这个ARP request会让LAN(VLAN)中其他主机更新ARP cache。

4. 系统运行期间,ACD是一直在运行的,这点与Gratuitous ARP不同。主机会一直检测收到的ARP reqeust 和ARP reply,判断Sender IP域是否和本机IP地址一样,如果一样说明有主机也在用这个IP地址了。然后需要进行地址冲突处理。(见下面)

地址冲突处理:《RFC5527》提供了三种可选的解决机制:1)放弃使用该IP地址,2)发送一个ARP announcement来进行IP地址“守卫”,如果冲突仍然继续存在,放弃使用这个IP。3)无视冲突,继续使用这个IP。

 

参考
1. 实战 | ​​IP地址冲突检测方法研究与实践

2. ARP通告协议ARP announcement

3. 免费ARP

posted @ 2017-06-03 12:28  yuxi_o  阅读(848)  评论(0编辑  收藏  举报