【以太网数据结构】地址解析协议ARP

ARP数据包结构:(看不清可将图片放大查看)
【以太网数据结构】地址解析协议ARP_第1张图片

为什么有ARP?
在以太网为基础的局域网中,每个网络接口都有一个硬件地址,即MAC。在局域网中必须知道网络设备的硬件地址才能向目的主机发送数据,而在广域网中数据传输的目的地址是IP地址
要保证数据准确的传输到目的地必须建立IP地址和硬件地址的映射关系,所以有了ARP。

ARP穿着一件外套——以太网头部,此时以太网头部目的地址为ff ff ff ff ff ff,帧类型为0x0806。
ARP协议结构字段解释:
1. 硬件类型表示硬件地址类型,值为1表示以太网硬件地址
2. 协议类型表示硬件地址的类型,值为0x0800表示询问IP地址
3. 硬件地址长度,表示硬件地址以字节为单位的长度,MAC地址占6字节,此处填6
4. 协议地址长度,表示协议地址以字节为单位的长度,不用说,IP地址占4个字节,此处填4
5. 操作方式字段为本次操作的类型,可选方式见下表:

含义
1 ARP请求
2 ARP应答
3 RARP请求
4 RARP应答

6. 剩下的四个字段分别为发送方和接收方的MAC和IP

相关源代码
在linux/if_arp.h中,arp数据包头结构体定义如下:

struct arphdr {
    __be16      ar_hrd;     /* format of hardware address */
    __be16      ar_pro;     /* format of protocol address */
    unsigned char   ar_hln;     /* length of hardware address */
    unsigned char   ar_pln;     /* length of protocol address */
    __be16      ar_op;      /* ARP opcode (command) */

#if 0
     /* * Ethernet looks like this : This bit is variable sized however... */
    unsigned char       ar_sha[ETH_ALEN];   /* sender hardware address */
    unsigned char       ar_sip[4];      /* sender IP address */
    unsigned char       ar_tha[ETH_ALEN];   /* target hardware address */
    unsigned char       ar_tip[4];      /* target IP address */
#endif

};

获取arp包头指针函数:

static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
{
    return (struct arphdr *)skb_network_header(skb);
}

wireshark抓包实例:
【以太网数据结构】地址解析协议ARP_第2张图片

你可能感兴趣的:(以太网,TCP-IP协议,地址解析协议ARP)