上QQ阅读APP看书,第一时间看更新
1.4.2 ARP协议
网络上的IP数据报到达最终目的网络后,必须通过MAC地址来找到最终目的主机,而数据报中只有IP地址,为此需要把IP地址转为MAC地址,这个工作就由ARP协议来完成。ARP协议是网络层中的协议,用于将IP地址解析为MAC地址。通常,ARP协议只适用于局域网中。ARP协议的工作过程如下:
(1)本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。这一步所表达的意思就是“如果你是这个IP地址的拥有者,请回答你的硬件地址。”
(2)目的主机收到这个广播报文后,用ARP协议解析这份报文,识别出是询问其硬件地址,于是发送ARP应答报,里面包含IP地址及其对应的硬件地址。
(3)本地主机收到ARP应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。同时,会把目的主机的IP地址和MAC地址保存在本机的ARP表中,以后通信直接查找此表即可。
在Windows操作系统的命令行下可以使用arp –a命令来查询本机ARP缓存列表,如图1-11所示。另外,可以使用arp -d命令清除ARP缓存表。
图1-11
ARP协议通过发送和接收ARP报文来获取物理地址,ARP报文的格式如图1-12所示。
图1-12
结构ether_header定义了以太网帧首部;结构arphdr定义了其后的5个字段,其信息用于在任何类型的介质上传送ARP请求和回答;结构ether_arp除了包含结构arphdr外,还包含源主机和目的主机的地址。如果这个报文格式用C语言表述,代码如下:
//定义常量 #define EPT_IP 0x0800 /* type: IP */ #define EPT_ARP 0x0806 /* type: ARP */ #define EPT_RARP 0x8035 /* type: RARP */ #define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */ #define ARP_REQUEST 0x0001 /* ARP request */ #define ARP_REPLY 0x0002 /* ARP reply */ //定义以太网首部 typedef struct ehhdr { unsigned char eh_dst[6]; /* destination ethernet addrress */ unsigned char eh_src[6]; /* source ethernet addresss */ unsigned short eh_type; /* ethernet pachet type */ }EHHDR, *PEHHDR; //定义以太网arp字段 typedef struct arphdr { //arp首部 unsigned short arp_hrd; /* format of hardware address */ unsigned short arp_pro; /* format of protocol address */ unsigned char arp_hln; /* length of hardware address */ unsigned char arp_pln; /* length of protocol address */ unsigned short arp_op; /* ARP/RARP operation */ unsigned char arp_sha[6]; /* sender hardware address */ unsigned long arp_spa; /* sender protocol address */ unsigned char arp_tha[6]; /* target hardware address */ unsigned long arp_tpa; /* target protocol address */ }ARPHDR, *PARPHDR;
定义整个ARP报文,总长度42字节,代码如下:
typedef struct arpPacket { EHHDR ehhdr; ARPHDR arphdr; } ARPPACKET, *PARPPACKET;