跳到主要内容

ARP 协议

image.png

位于数据链路层

概述

地址解析协议,即 ARP(Address Resolution Protocol),是 根据 IP 地址获取物理地址 的一个协议。(IP 地址和 MAC 地址的转换)

网络上任意两台计算机之间的信息传递必须先把 32 位的 IP 地址转成 48 位的以太网地址,即从逻辑 Internet 地址到对应的物理地址需要进行翻译,而这个 ARP 协议就是用于把物理地址与 IP 地址关联起来的一个协议(IP地址在OSI模型的第三层,MAC地址在第二层)。

工作过程

简述 ARP 工作过程

ARP 协议的工作主要采用动态绑定方式,即通过 ARP 动态广播地址转换请求,只在本地维护一个动态的高速缓存来实现地址映射数据的存放。

  1. 上层应用产生数据
  2. 每个主机都有一个 ARP 高速缓存,这个缓存存放了最近的 IP 地址到物理地址之间的映射记录,当发送端封装 IP 分组时,要先在高速缓存中查找相关的地址映射记录
  3. 当找不到 IP 对应的 MAC 地址时,目的 IP 到目的 MAC 的封装映射会失败(三层到二层的封装失败)这时 ARP 就会产生一个 ARP Request 去广播(0xFFFF-FFFF-FFFF)
  4. 目的主机的 ARP 层收到这份广播报文后,识别出这是发送端在询问它的 IP 地址,于是发送一个包含 IP 地址及对应物理地址的 ARP Reply 去应答这个 ARP Request。
  5. 收到应答后,发送方就可以传送 IP 数据报了。同时将该 IP 地址和物理地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源。

虽然高速缓存提高了 ARP 的效率,但是对 ARP 缓存必须建立一种超时机制,使缓存中的数据在超时后自动失联,以保证协议的可靠运行。(因为网络设备不是一成不变的)所以一般的 ARP 协议使用计时器方法,当计时器超时后会删除地址绑定数据(一般是 20 分钟),但是如果超时前又有请求发过来会自动刷新超时时间

注意:新机入网时或主机更换网卡时,会主动广播地址绑定信息,以免其他主机对其进行 ARP 请求,这就是免费 ARP(gratuitous ARP)

注:ARP 缓存表和 MAC 表的区别

ARP 缓存表:三层设备的,阐述 IP 地址与 MAC 地址的对应关系 MAC 表:二层设备的,阐述接口和 MAC 的对应关系(交换机一个接口可以对应多个 MAC 地址,例如使用 HUB,但是一个 MAC 只能对应在一个接口上)

免费 ARP

免费 ARP 是指主机发送 ARP 请求查找自己的 IP 地址。这时 ARP 请求报文中发送端的 IP 地址和目的端的 IP 地址是一样的,同时这个 ARP 请求不希望得到 ARP 应答,因为这个免费 ARP 的目的是测试网络上是否存在重复的 IP,如果有另一台主机响应这个 ARP 请求,则说明该 IP 地址已经存在了,那么表示网络上的 IP 地址出现了冲突,即该主机就不能初始化自己的 TCP/IP 栈。

一般新机入网时或主机更换网卡时,都会主动发送免费 ARP

代理 ARP

代理 ARP(proxy ARP)是指如果 ARP 请求是从一个网络的主机发往另一个网络的主机(跨网段需要使用路由器的那种),那么连接这两个网络的路由器回答该请求,这个过程称为代理 ARP

实验拓扑图

image.png 注:这个 PC3 是 192.168.2.20/16 所以网络号是 192.168.0.0

如果 PC3 上对 192.168.1.11/24 进行通信(例如 Ping)PC3 上的 IP 协议栈会用自己的网络号来判断是否和目标主机是在同一网络上,这里是位于一个网络(子网掩码是 16),所以 PC3 会将 IP 数据包发出。但是为了构造数据链路层的帧,PC3 需要先发出一个 ARP 请求,以获取 PC1 的 MAC 地址

此时,路由器 Router0 收到这个 ARP 请求帧,因为路由器不转发广播帧,所以这个 ARP 请求会给路由器接收,但是不能被 PC1 收到。此时路由器知道目标地址 192.168.1.11 在自己连接的另一个子网中,它就会以自己的 F0/4 接口的 MAC 地址回答 PC3

当 PC3 接收到路由器的回答后,将更新 MAC 地址表,把 IP 地址 192.168.1.11 和 F0/4 接口的 MAC 地址进行绑定。从此,PC3 就把所有发给 PC1 的请求全部抛给 F0/4 接口(所以可以认为路由器 Router0 欺骗了发起 ARP 请求的 PC3,使其误认为路由器就是目的主机)

代理 ARP 欺骗

通常在局域网交换环境中使用 Sniffer Pro 一类的嗅探工具除了抓到自己的包以外,是不能抓到其他主机通信的包的,但是利用 ARP 欺骗就可以抓到。

同样以上面的拓扑图为例。 PC0、PC1 和 PC2 是位于同一个交换环境的局域网中的主机,假定 PC0 是局域网中的网关,局域网中的每一个节点向外的通信都要通过它。PC1 想要监听主机 PC2 的通信,则需要先使用 ARP 欺骗,让主机 PC2 认为它就是主机 PC0。此时 PC1 可以一个 IP 为 192.168.1.10,物理地址为自己的 MAC 的 ARP 响应包给主机 PC2。这样 PC2 就会以为 PC1 是 PC0 每次请求都发给 PC1 从而达到 ARP 欺骗

报文格式

+0--------------7--------------15----------------23----------------31
| Ethernet Address of Destination(0-47) |
+ +--------------------------------|
| | |
+----------------------------------+ |
| Ethernet Address of Sender(0-47) |
+----------------------------------|--------------------------------|
| Frame Type | Hardware Type |
+----------------------------------|----------------|---------------|
| Protocol Type | Hardware Length|Protocol Length|
+----------------------------------|--------------------------------|
| OP | |
+----------------------------------+ |
| Ethernet Address of Sender(0-47) |
+-------------------------------------------------------------------|
| IP Address of Sender |
+-------------------------------------------------------------------|
| Ethernet Address of Destination(0-47) |
+ +--------------------------------|
| | IP Address of Destination(0-15)|
+----------------------------------|--------------------------------|
| IP Address of Destination(16-31) |
+----------------------------------|
字段长度(bit)含义
Ethernet Address of Destination48比特目的MAC地址。发送ARP请求时,为广播的MAC地址,0xFFFF-FFFF-FFFF。
Ethernet Address of Sender48比特源MAC地址。
Frame Type16比特表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。
Hardware Type16比特表示硬件地址的类型。对于以太网,该类型的值为“1”。
Protocol Type16比特表示发送方要映射的协议地址类型。对于IP地址,该值为0x0800。
Hardware Length8比特表示硬件地址的长度,单位是字节。对于ARP请求或应答来说,该值为6。
Protocol Length8比特表示协议地址的长度,单位是字节。对于ARP请求或应答来说,该值为4。
OP16比特操作类型: 1 ARP请求、2 ARP应答、3 RARP请求、4 RARP应答
Ethernet Address of Sender48比特发送方以太网地址。这个字段和ARP报文首部的源以太网地址字段是重复信息。
IP Address of Sender32比特发送方的IP地址。
Ethernet Address of Destination48比特接收方的以太网地址。发送ARP请求时,该处填充值为0x00.00.00.00.00.00。
IP Address of Destination32比特接收方的IP地址。

请求报文示例

Ethernet II, Src: 00:ac:27:96:47:87 (00:ac:27:96:47:87), Dst: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
Destination: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
Address: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Source: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
Address: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Type: ARP (0x0806)
Address Resolution Protocol (request)
Hardware type: Ethernet (1)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
[Is gratuitous: False]
Sender MAC address: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
Sender IP address: 10.60.23.77 (10.60.23.77)
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Target IP address: 10.60.254.254 (10.60.254.254)

应答报文

Ethernet II, Src: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1), Dst: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
Destination: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
Address: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Source: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
Address: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Type: ARP (0x0806)
Trailer: 000000000000000000000000000000000000
Address Resolution Protocol (reply)
Hardware type: Ethernet (1)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply (2)
[Is gratuitous: False]
Sender MAC address: 04:f9:38:d7:d4:a1 (04:f9:38:d7:d4:a1)
Sender IP address: 10.60.254.254 (10.60.254.254)
Target MAC address: 00:ac:27:96:47:87 (00:ac:27:96:47:87)
Target IP address: 10.60.23.77 (10.60.23.77)

免费 ARP 请求报文(源IP地址和目的IP地址相同)

Ethernet II, Src: PaloAlto_00:01:1a (00:1b:17:00:01:1a), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Address: Broadcast (ff:ff:ff:ff:ff:ff)
.... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
.... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
Source: PaloAlto_00:01:1a (00:1b:17:00:01:1a)
Address: PaloAlto_00:01:1a (00:1b:17:00:01:1a)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: ARP (0x0806)
Trailer: 110200000000000000000000ffff00000000
Address Resolution Protocol (request/gratuitous ARP)
Hardware type: Ethernet (1)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
[Is gratuitous: True]
Sender MAC address: PaloAlto_00:01:1a (00:1b:17:00:01:1a)
Sender IP address: 172.30.129.254 (172.30.129.254)
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Target IP address: 172.30.129.254 (172.30.129.254)

参考资料

参考资料 TCP/IP 协议分析教程与实验 参考资料 计算机网络教程-第四版 华为官网提供的-协议地图-可以点进去看每个协议的报文结构