原文地址:http://www.vants.org/?post=118
免费ARP的格式
免费ARP报文与普通ARP请求报文的区别在于普通的ARP请求报文,其ARP封装内的“目的IP地址”是其他机器的IP地址,而免费ARP的请求报文,其ARP封装内的“目的IP地址”是其自己的IP地址。免费ARP的封装格式如下图所示:
免费ARP报文的封装格式图示
免费ARP的作用
(1)一个主机可以通过免费ARP来确定另一个主机是否设置了相同的I P地址。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP 的主机。
(2)如果发送免费A R P的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。
免费ARP的应用场景
(1)双机热备,更新硬件地址
(2)检测地址冲突
C语言实现
- //填充以太网头部
- memcpy(frame.eh.ether_dhost, 0xff, 6); //目的MAC地址
- memcpy(frame.eh.ether_shost, src_mac, 6); //源MAC地址
- frame.eh.ether_type = htons(ETH_P_ARP); //协议
- //填充ARP报文头部
- frame.arp.ea_hdr.ar_hrd = htons(ARPHRD_ETHER); //硬件类型
- frame.arp.ea_hdr.ar_pro = htons(ETHERTYPE_IP); //协议类型 ETHERTYPE_IP | ETH_P_IP
- frame.arp.ea_hdr.ar_hln = 6; //硬件地址长度
- frame.arp.ea_hdr.ar_pln = 4; //协议地址长度
- frame.arp.ea_hdr.ar_op = htons(ARPOP_REQUEST); //ARP请求操作
- memcpy(frame.arp.arp_sha, src_mac, 6); //源MAC地址
- memcpy(frame.arp.arp_spa, ip, 4); //源IP地址
- memcpy(frame.arp.arp_tha, 0xff, 6); //目的MAC地址
- memcpy(frame.arp.arp_tpa, ip, 4); //目的IP地址,与源IP地址保持一致