当发送ARP请求时,发送方填入发送方以太网地址、发送方ip地址以及目标ip地址。目标主机接收到这个ARP广播包时,会在响应报文中填上自己的以太网地址。ARP报文格式如下:
硬件类型 | 协议类型 | 硬件地址长度 | 协议地址长度 | 操作码 | src硬件地址 | src ip地址 | dst硬件地址 | 目标ip地址 |
1、硬件类型都是以ARPHDR_开头
2、操作码包括:ARPOP_REQUEST,ARPOP_REPLY
ARP报文像ip数据报一样,要是作为数据封装在以太网帧中发送。ARP会在初始化的时候注册ARP报文类型:
static struct packet_type arp_packet_type __read_mostly = {
.type = cpu_to_be16(ETH_P_ARP),
.func = arp_rcv,
};
ARP模块的初始化是通过arp_init完成,该函数在ipv4协议栈初始化函数inet_init调用。
void __init arp_init(void)
{
neigh_table_init(&arp_tbl);
dev_add_pack(&arp_packet_type);
arp_proc_init();
#ifdef CONFIG_SYSCTL
neigh_sysctl_register(NULL, &arp_tbl.