ARP详解



MAC地址与MAC帧

每块网络设备都至少有一个地址, 称为MAC地址, 也称物理地址。 MAC地址长6B, 一般由冒号(或连字符)分个的6个十六进制数表示, 如:02-60-8c-e4-b1-21, 高24位为厂商代码, 低24位为厂商自行分配的网卡序列号。

常用的以太网MAC帧格式有两种标准: DIX Ethernet V2标准 和 IEEE 的 802.3标准, 最常用的MAC帧格式是以太网V2的格式:

MAC帧

MAC帧字段说明:

  • 前导码: 8个字节可分两部分, 第一部分7个字节, 是前同步码, 用来迅速实现MAC帧的比特同步; 第二个字段是帧开始定界符,表示后面的信息就是MAC帧。
  • 地址: 6B的地址(MAC地址)
  • 类型: 用来标志使用的是什么协议, 以便把收到的MAC帧的数据上交给这个协议处理
  • 数据: 46 ~ 1500B, 由于CSMA/CD算法的限制, 以太网帧最小长度为64B(其他字段共占了18B, 数据字段最少46B), 因此当数据字段长度小于46B时, 必须在数据之后进行, 保证以太网的MAC帧长不小于64B
  • FCS: 4B校验字段, 校验范围从目的地址到数据段的末尾, 算法采用32位的CRC。

地址解析协议ARP

无论在网络层使用什么协议, 在实际网络的数据链路上传送数据时, 最终必须使用硬件地址。 所以需要一种方法来完成IP地址MAC地址的映射, 这就需要用到地址解析协议(Address Resolution Protocol, ARP)。 每台主机(路由器)上单独存放一个从IP地址MAC地址的映射表, 称ARP表, 使用ARP协议来动态维护此ARP表。

ARP帧格式

ARP帧格式如下:

ARP

  • 以太网目的地址: 目的主机的硬件地址。目的地址全为1表示广播地址
  • 以太网源地址: 源主机的硬件地址
  • 帧类型: 对于ARP协议, 该字段为0x0806; 对于RARP协议, 该字段为0x8035
  • 硬件类型: 表示硬件地址的类型, 值为1时表示以太网地址。也就是说ARP协议不仅仅应用于以太网协议, 还可以支持别的链路层协议
  • 协议类型: 表示要映射的协议地址类型。值为0x0800表示IP协议。
  • 硬件地址长度: 与硬件类型对应的硬件地址长度, 以字节为单位。如果是以太网,则是6字节(MAC长度)
  • 协议地址长度: 与协议类型对应的协议地址长度, 以字节为单位。如果是IP协议, 则是4字节(IP地址长度)
  • 操作类型(op): 四中操作类型。1表示ARP请求; 2表示ARP应答; 3表示RARP请求; 4表示RARP应答
  • 发送端硬件地址: 如果是以太网, 则是源主机以太网地址, 此处和以太网头中的源地址对应
  • 发送端协议地址: 如果是IP协议, 则表示源主机的IP地址
  • 目的端硬件地址: 如果是以太网, 则是目的以太网地址, 和以太网头中的目的地址对应
  • 目的端协议地址: 如果是IP协议, 则表示源主机要请求硬件地址的IP地址

另外, 需要注意:

  1. 这里的以太网首部(14B)就是上一部分内容中的MAC帧的格式
  2. 以太网首部ARP报文体的部分内容是重复的。对应ARP请求包来说, 以太网首部中的目的物理地址为FF-FF-FF-FF-FF-FF, 报文体中的目的端的硬件地址字段无需填充, 其他字段都需要填充。
  3. APR请求包是广播的, 但是ARP应答帧是单播的
  4. ARP报文体只有28B, 需要进行填充, 使得MAC帧数据部分最少为46B(首部14B, 数据46B, FCS 4B, 总共64B)

ARP工作流程

在以太网(ARP协议只适用于局域网)中, 如果本地主机想要向某一个IP地址的主机发数据报, 但是并不知道其硬件地址, 此时利用ARP协议提供的机制来获取硬件地址,具体过程如下:

  1. 当主机A向 本局域网 上的某个主机B发送IP数据报时, 就先在自己的ARP缓冲表中查看有无主机B的IP地址
  2. 如果有, 就可以查出其对应的硬件地址, 再将此硬件地址写入MAC帧(链路层协议), 然后通过局域网将该MAC帧发往目的主机
  3. 如果没有, 主机A就需要使用ARP协议来解析这个IP地址
    • 通过使用目的MAC地址为FF-FF-FF-FF-FF-FF(MAC地址为6B)的帧来封装并广播ARP请求分组
    • 同一个局域网里所有主机都收到此ARP请求
    • 主机B收到该ARP请求后, 就会向A发出响应ARP分组, 分组中包含B的IP与MAC地址的映射关系
    • 主机A收到主机B的ARP响应分组后, 就在其ARP缓存中写入主机B的IP地址到硬件地址的映射

注意: ARP解决的是同一个局域网上的主机或路由器的IP地址与MAC地址的映射问题。如果要找的主机和源主机不在同一个局域网上, 那么需要通过ARP协议找到一个位于本局域网的某个路由器的硬件地址, 然后把分组发送给这个路由器, 让这个路由器把分组转发给下一个网络