Linux C/C++服务器开发实践
上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;