当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,必须要知道对方的物理地址。如果只知道目的主机的IP地址,就必须通过ARP协议来获取其物理地址。
当链路层数据类型被标记为ARP包时,那么链路层数据段的内容就是ARP包的内容。
首先定义ARP包结构体:
//eth.h
#ifndef __ETH__
#define __ETH__
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
/*链路层结构*/
typedef struct
{
u8 destMAC[6]; //目的MAC
u8 sourMAC[6]; //源MAC
u16 type; //类型
u8 data[1500]; //数据
}ETH_HEADER;
/*链路层数据包类型*/
typedef enum
{
ARP_PACKET=0x0806, //ARP包
RARP_PACKET=0x8035, //RARP包
IP_PACKET=0x0800 //IP包
}PACKET_TYPE;
/*ARP包结构*/
typedef struct
{
u16 hardware; //硬件地址类型,1表示MAC地址
u16 protocol; //协议地址类型,0x0800表示IP地址
u8 mac_len; //硬件地址的长度,对于MAC地址为6
u8 ip_len; //协议地址长度,对于IP地址来说有4和6,对应IPV4和IPV6
u16 op; //操作类型,1表示AR