ARP协议的数据结构:
typedef struct arphdr
{
unsigned short arp_hrd; /* 硬件类型 */
unsigned short arp_pro; /* 协议类型 */
unsigned char arp_hln; /* 硬件地址长度 */
unsigned char arp_pln; /* 协议地址长度 */
unsigned short arp_op; /* ARP操作类型 */
unsigned char arp_sha[6]; /* 发送者的硬件地址 */
unsigned long arp_spa; /* 发送者的协议地址 */
unsigned char arp_tha[6]; /* 目标的硬件地址 */
unsigned long arp_tpa; /* 目标的协议地址 */
}ARPHDR, *PARPHDR;
为了解释ARP协议的作用,就必须理解数据在网络上的传输过程。这里举一个简单的PING例子。
假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping 192.168.1.2 。该命令会通过ICMP协议发送ICMP数据包。该过程需要经过下面的步骤:
1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
3、如果存在该IP-MAC对应关系,那么跳到步骤9;如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4、内核进行ARP广播,目的地的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;
5、当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
6、本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7、内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;
使用arp -a 命令就可以查看本地的ARP缓存内容,所以,执行一个本地的PING命令后,ARP缓存就会存在一个目的IP的记录了。当然,如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。
知道了ARP协议的作用,就能够很清楚地知道,数据包的向外传输很