ARP协议分析
ARP协议简介
ARP全称为“Address Resolution Protocol”(地址解析协议)。其功能是将IP地址解析转换为MAC地址。因为IP地址工作在网络层,MAC地址工作在数据链路层,通常IP地址用于局域网之外的数据转发,而MAC地址用于局域网内的数据通信。当一台主机需要向同一局域网内的另一台主机发送数据时,它虽然知道对方的IP地址,但是最终数据需要以帧的形式在物理网络上传输,这个传输过程依赖于MAC地址,故需要一种机制将目标IP地址翻译成的对应的MAC地址。
为什么不能只用MAC或IP
MAC地址工作在数据链路层,IP地址工作在网络层,它们其实负责的是不同板块的功能。MAC地址负责同一局域网内的数据定位,而IP则负责不同局域网之间的数据定位。如果只用MAC地址,因为MAC地址本身没有分层的结构,路由表将会变得极其庞大而难以管理。
而如果只用IP地址,因为IP地址已经包含了过多功能,在对IP数据包进行处理的时候会相对复杂,且路由器本身成本也更高,相比于使用一台路由器来管理,远不如用一台有硬件级MAC转发电路的交换机来得更为高效和划算,而且这也会导致路由器的角色混乱和性能下降。
ARP工作流程
ARP的工作流程简单讲就是先广播询问,后单播应答。
假设两台设备在同一局域网内,A设备知道B设备的IP地址,但不知道它的MAC地址,此时就可以启动ARP协议:
- 检查缓存表:主机A先检查自己的ARP缓存表(该缓存表可以避免重复广播),查看是否已有主机B的MAC地址。如果存在,则直接使用该地址构造数据帧。如果不存在,则进入ARP请求过程。
- 广播ARP请求:主机A在局域网内广播一个ARP请求报文,该报文包含主机A的IP和MAC,以及主机B的IP,而该报文的目标MAC地址设置为
FF:FF:FF:FF:FF:FF用于广播,本地广播域内所有设备将会接收到这个请求。 - 单播ARP响应:只有主机B接收到广播并通过IP地址确定了该广播询问的是自己的MAC地址后,向主机A发送一个单播的ARP应答报文,里面包含了自己的MAC地址。
- 更新ARP缓存:主机B在接收到ARP请求后,就将主机A的MAC地址存入自己的ARP缓存。主机A在接受到主机B的应答报文后,也将主机B的MAC地址存入自己的ARP缓存。
- 正常通信:现在双方都知道了对方的MAC地址,就可以开始正常通信了,而在一段时间内,一因为双方ARP缓存都有对方的MAC地址,也无需要再次广播。
ARP报文格式
ARP时一个独立的三层协议,所以ARP报文在数据链路层不需要经过IP协议的封装,而是直接生成自己的报文。ARP报文可以分为ARP请求报文和ARP应答报文两种,但是它们的格式可以统一为同一种格式:
| 名称 | 大小(字节) | 功能 |
|---|---|---|
| 硬件类型 | 2 | 表示ARP报文可以在哪种网络上传输,值为1时表示以太网地址。 |
| 上层协议类型 | 2 | 表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800。 |
| MAC地址长度 | 1 | 标识MAC地址长度,以字节为单位,此处为6。 |
| IP地址长度 | 1 | 标识IP得知长度,以字节为单位,此处为4。 |
| 操作类型 | 2 | 指定本次ARP报文类型。1标识ARP请求报文,2标识ARP应答报文。 |
| 源MAC地址 | 6 | 发送方的MAC地址。 |
| 源IP地址 | 4 | 发送方的IP地址。 |
| 目的MAC地址 | 6 | 接收方的MAC地址。若为请求报文,因为当前不知道该地址,则此时全为0,即00:00:00:00:00:00,表示任意地址。 |
| 目的IP地址 | 4 | 接受方的IP地址。 |
ARP帧格式
ARP报文并非直接在网络层发送和使用的,还需要向下传输到数据链路层,此时需要再次封装。以以太网为例,ARP报文传输到以太网数据链路层后会形成ARP帧,ARP帧是在ARP报文前面添加了一个以太网帧头,以太网帧头如下表所示:
| 名称 | 大小(字节) | 功能 |
|---|---|---|
| 目标MAC地址 | 6 | 接收方的MAC地址。若为请求报文,则为广播帧,设置为广播地址FF:FF:FF:FF:FF:FF。 |
| 源MAC地址 | 6 | 发送方的MAC地址。 |
| 帧类型 | 2 | 表示帧封装的上层协议,ARP帧封装的ARP报文,所以此处填ARP的协议号0x0806。 |