1. ARP协议介绍
ARP(AddressResolutionProtocol)地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)[RFC826].ARP协议是属于链路层的协议,在以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核(如驱动)必须知道目的端的硬件地址才能发送数据。当然,点对点的连接是不需要ARP协议的。ARP工作时,首先请求主机会发送出一个含有所希望到达的IP地址的以太网广播数据包,然后目标IP的所有者会以一个含有IP和MAC地址对的数据包应答请求主机。这样请求主机就能获得要到达的IP地址对应的MAC地址,同时请求主机会将这个地址对放入自己的ARP表缓存起来,以节约不必要的ARP通信。ARP协议是工作在数据链路层,基于以太网. 所以,必须了解以太网的MAC帧格式和ARP协议格式.
MAC帧示意图:
![](http://book.chinaunix.net/upfile/091217230318.jpg)
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; // destination eth addr
u_int8_t ether_shost[ETH_ALEN]; // source ether addr
u_int16_t ether_type; // packet type ID field
} __attribute__ ((__packed__));
整个以太网的头部包括: 目的地址(6字节),源地址(6字节),类型(2字节),帧内数据(46-1500个字节),CRC校验和(4字节)
#define ETH_ALEN 6 //以太网地址的长度
#define ETH_HALEN 14 //以太网头部的总长度 (6+6+2)
#define ETH_ZLEN 60 //不含CRC校验数据的数据最小长度(46+14)
#define ETH_DATA_LEN 1500 //帧内数据的最大长度
#define ETH_FRAME_LEN 1514//不含CRC最大以太网长度(1500+14)
ARP协议示意图:
ARP头部信息:
struct arphdr{
__be16 ar_hrd;//硬件类型 1-硬件接口为以太网接口-2字节
__be16 ar_pro;//协议类型-0x0800高层协议为IP协议 -2字节
unsigned char ar_hln;//硬件地址长度-6字节 MAC-1字节
unsigned char ar_pln;//协议地址长度-4字节为IP-1字节
__be16 ar_op;//ARP操作码-1 ARP请求-2字节
}
ARP协议数据结构:
struct ether_arp{
struct arphdr ea_hdr; //ARPfixed-size header(ARP固定大小的报头)-8字节
u_char arp_sha[ETHER_ADDR_LEN]; //sender hardware address(发送端硬件地址)-6字节
u_char arp_spa[4]; //sender protocol address(发送端协议地址)-4字节
u_char arp_tha[ETHER_ADDR_LEN]; // target hardware address(接收端硬件地址)-6字节
u_char arp_tpa[4]; //target protocol address(接收端协议地址)-4字节
};
#define arp_hrd ea_hdr.ar_hrd
#define arp_pro ea_hdr.ar_pro
#define arp_hln ea_hdr.ar_hln
#define arp_pln ea_hdr.ar_pln