文章目录
ARP协议介绍
ARP,Address Resolution Protocol,翻译为地址解析协议,用于不同网络层次之间的地址解析,如网络层IP到物理层MAC地址的解析。
ARP报文格式
硬件地址类型[ Linux-2.5.17/include/linux/if_arp.h ]:
操作码:REQUEST-1 REPLY-2
协议地址类型:EtherType定义的协议码。EtherType定义:https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml
ARP首部定义
ARP协议工作过程
发送ARP请求
当主机或者路由的ARP表项中没有某个协议地址的<协议地址,硬件地址>映射时,会向所在子网(路由器应该是相连的各个子网)广播ARP请求。
接收ARP请求
流程说明:
1、如果目的协议地址与本机地址不匹配,而且本机不存在发送方的<协议类型,协议地址>表项,本机是不会将发送方地址和接收方地址加入到进本地ARP表中的。
2、在返回REPLY响应报文时,目的物理地址是根据REQUEST报文中的发送方物理地址作为目的地址,而不是以太网帧中的源物理地址。
3、REQUEST包通过广播形式进行发送,REPLY包通过单播形式进行发送。
4、只有目的协议地址与本机协议地址匹配,才会进行响应。
ARP表项老化
为什么需要表项老化的特性?
答:虽然硬件地址不会发生改变,但是协议地址是可以改变。当协议地址被重新分配到另一个不同硬件地址的设备上时,之前缓存的错误表项可能会导致错误的路由信息从而可能导致硬件或者软件发生错误。
ARP表项更新以及老化的一些建议
-
每当收到来自某个主机的包时,都会刷新对应主机协议地址的ARP表项老化时间(通过Hash或者索引来加速访问);如果在一段时间内没有收到来自某个主机的包,将会移除无用的ARP表项。
-
尝试初始化与某个主机的连接,如果建立连接失败,则表明主机已经下线或者原来的表项不合法,该主机对应的表项可以移除。
-
创建一个后台线程,通过对ARP表中的每个协议地址发送一个REQUEST报文,如果在短时间内没有收到REPLY报文,则视为可删除ARP表项。
-
当协议地址与硬件地址的绑定关系发生改变时,新的协议地址绑定主机需要广播ARP REPLY包,从而更新子网中所有的ARP缓存。
一些问题
为什么不通过周期性广播ARP报文的方式进行ARP表项的维护?
答:在网络中,只有部分主机之间会进行通信,因此不需要每台主机都知道彼此的硬件地址。
在局域网怎么判断IP冲突?
答:通过广播携带本机IP的ARP请求,如果收到响应,说明该IP在局域网中存在冲突
拓展:这种主机发送ARP查找自己的IP地址,也被称为Gratuitous ARP Request(免费ARP请求)