一、ARP协议报文格式及ARP表

ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址还是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送,因为发送站还必须有接收站的物理地址,所以需要一个从IP地址到物理地址的映射。ARP就是实现这个功能的协议

ARP报文

ARP是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为下图所示

arp报文及使用go实现_数据链路层

  • 硬件类型:占两字节,表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
  • 上层协议类型:占两字节,表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800
  • MAC地址长度:占一字节,标识mac地址长度,以字节为单位,此处为6.
  • IP协议地址长度:占一字节,标识IP地址长度,以字节为单位,此处为4
  • 操作类型:占两字节,指定本次ARP报文类型。1表示arp请求报文,2表示arp应答报文,3表示RARP请求,4表示RARP应答
  • 源MAC地址:占六字节,标识发送设备的硬件地址
  • 源IP地址:占4字节,标识发送方设备的IP地址
  • 目的MAC地址:占六字节,标识接收方设备的硬件地址,在请求报文中该字段全为0,即00-00-00-00-00-00,表示任意地址,因为现在不知道这个地址
  • 目的IP地址:占四字节,表示接收方的IP地址
    ARP报文不是直接在网络层上发送的,它还是需要向下传输到数据链路层,所以当ARP报文传输到数据链路层之后,需要再次进行封装。以以太网为例,ARP报文传输到以太网数据链路层后会形成ARP帧。ARP帧如下图所示,他就是在ARP报文前面加了一个以太网帧头

以太网帧头的三个字段说明:

目的MAC地址:占6字节,如果是ARP请求帧,因为它是一个广播帧,所以要填上广播MAC地址(FF-FF-FF-FF-FF-FF),其目标主机是网络上所有主机
源MAC地址:占6字节,这是发送ARP帧的节点MAC地址
帧类型:占两字节,这里用来标识 帧封装的上层协议,因为本帧的数据部分是ARP部分,所以直接用ARP的协议号0x0806表示就可以了

arp报文抓包分析

arp请求报文

arp报文及使用go实现_封装_02


arp报文及使用go实现_数据链路层_03


arp返回报文

arp报文及使用go实现_数据链路层_04