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帧](/assets/mac-BKnGHmP2.png)
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](/assets/ARP-BXdxMZF-.png)
以太网目的地址
: 目的主机的硬件地址。目的地址全为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地址
另外, 需要注意:
- 这里的
以太网首部(14B)
就是上一部分内容中的MAC帧
的格式 以太网首部
与ARP报文体
的部分内容是重复的。对应ARP请求包来说,以太网首部
中的目的物理地址为FF-FF-FF-FF-FF-FF
, 报文体中的目的端的硬件地址
字段无需填充, 其他字段都需要填充。- APR请求包是广播的, 但是ARP应答帧是单播的
- ARP报文体只有
28B
, 需要进行填充, 使得MAC帧
数据部分最少为46B
(首部14B, 数据46B, FCS 4B, 总共64B)
ARP工作流程
在以太网(ARP协议只适用于局域网
)中, 如果本地主机想要向某一个IP地址的主机发数据报, 但是并不知道其硬件地址, 此时利用ARP协议提供的机制来获取硬件地址,具体过程如下:
- 当主机A向 本局域网 上的某个
主机B
发送IP数据报时, 就先在自己的ARP缓冲表中查看有无主机B的IP地址 - 如果有, 就可以查出其对应的硬件地址, 再将此硬件地址写入
MAC帧
(链路层协议), 然后通过局域网将该MAC帧
发往目的主机 - 如果没有, 主机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协议找到一个位于本局域网的某个路由器的硬件地址, 然后把分组发送给这个路由器, 让这个路由器把分组转发给下一个网络