Appearance
Appearance
Gratuitous ARP(RFC 5227)既可以指 gratuitous ARP request,也可以指 gratuitous ARP reply。在这里,Gratuitous 的意思是:根据 ARP 规范(RFC 826)通常并不需要、但在某些情况下可以使用的 request/reply。gratuitous ARP request 是一种 AddressResolutionProtocol request 数据包,其中源 IP 和目标 IP 都设置为发出该数据包的机器的 IP,目标 MAC 设置为广播地址 ff:ff:ff:ff:ff:ff。通常不会产生 reply 数据包。gratuitous ARP reply 则是没有对应 request 的 reply。
Gratuitous ARP 有四个用途:
它们可以帮助检测 IP 冲突。当一台机器收到一个 ARP request,其中包含的源 IP 与其自身 IP 匹配时,它就知道存在 IP 冲突。
它们有助于更新其他机器的 ARP 表。集群解决方案在将一个 IP 从一个 NIC 移动到另一个 NIC,或从一台机器移动到另一台机器时会使用这一点。其他机器维护一个 ARP 表,其中包含与某个 IP 关联的 MAC。当集群需要将该 IP 移动到不同的 NIC 时,无论是在同一台机器上还是在不同机器上,它都会相应地重新配置 NIC,然后广播一个 gratuitous ARP reply,以告知相邻机器该 IP 的 MAC 已发生变化。收到该 ARP 数据包的机器随后会用新的 MAC 更新其 ARP 表。
它们会告知交换机某个交换机端口上的机器的 MAC 地址,使交换机知道应当在该交换机端口上传输发送到该 MAC 地址的数据包。
每当一个 IP 接口或链路变为 up 时,该接口的驱动通常会发送一个 gratuitous ARP,以预加载所有其他本地主机的 ARP 表。因此,一个 gratuitous ARP 会告诉我们该主机刚刚发生了链路 up 事件,例如链路抖动、机器刚刚重启,或者该主机上的用户/系统管理员刚刚将接口配置为 up。如果我们频繁看到来自同一主机的多个 gratuitous ARP,这可能表明存在不良的 Ethernet 硬件/线缆,导致频繁的链路抖动。
许多操作系统中的网络栈会在网络接口的 IP 或 MAC 地址发生变化时发出 gratuitous ARP,以通知网络中的其他机器该变化,使它们能够报告 IP 地址冲突、让其他机器更新其 ARP 表,并告知交换机该机器的 MAC 地址。许多操作系统中的网络栈也会在某个接口的链路每次进入 up 状态时,在该接口上发出 gratuitous ARP。此时,gratuitous ARP 用于在所有本地主机上预加载 MAC 地址与 IP 地址之间可能的新映射(对于不接管 MAC 地址的 failover cluster),或者让交换机重新学习某个 MAC 地址位于哪个端口之后(对于同时也会接管 MAC 地址的 failover cluster,或者当你只是将网络线缆从一个端口移动到普通非集群主机上的另一个端口时)。
High-Availability Linux Project 使用一个名为 send_arp 的命令行工具来执行其 failover 过程中所需的 gratuitous ARP。一个典型的集群场景可能如下:
集群中的两个节点被配置为共享一个公共 IP 地址 192.168.1.1。节点 A 的硬件地址为 01:01:01:01:01:01,节点 B 的硬件地址为 02:02:02:02:02:02。
假设节点 A 当前已经在其 NIC 上配置了 IP 地址 192.168.1.1。此时,相邻设备知道应使用 MAC 01:01:01:01:01:01 来联系 192.168.1.1。
通过 heartbeat 协议,节点 B 确定节点 A 已经失效。
节点 B 使用 ifconfig eth0:1 192.168.1.1 在一个接口上配置 secondary IP。
节点 B 使用 send_arp eth0 192.168.1.1 02:02:02:02:02:02 192.168.1.255 发出 gratuitous ARP。所有收到该 ARP 的设备都会更新其表,将 IP 地址 192.168.1.1 指向 02:02:02:02:02:02。
Ethernet II, Src: 02:02:02:02:02:02, Dst: ff:ff:ff:ff:ff:ff Destination: ff:ff:ff:ff:ff:ff (Broadcast) Source: 02:02:02:02:02:02 (02:02:02:02:02:02) Type: ARP (0x0806) Trailer: 000000000000000000000000000000000000Address Resolution Protocol (request/gratuitous ARP) Hardware type: Ethernet (0x0001) Protocol type: IP (0x0800) Hardware size: 6 Protocol size: 4 Opcode: request (0x0001) Sender MAC address: 02:02:02:02:02:02 (02:02:02:02:02:02) Sender IP address: 192.168.1.1 (192.168.1.1) Target MAC address: ff:ff:ff:ff:ff:ff (Broadcast) Target IP address: 192.168.1.1 (192.168.1.1)0000 ff ff ff ff ff ff 02 02 02 02 02 02 08 06 00 01 ................0010 08 00 06 04 00 01 02 02 02 02 02 02 c0 a8 01 01 ................0020 ff ff ff ff ff ff c0 a8 01 01 00 00 00 00 00 00 ................0030 00 00 00 00 00 00 00 00 00 00 00 00 ............什么样的示例 MAC 是好的选择?我选择了 02:02:02:02:02:02。有没有更好的?-- RandyMcEoin (201115 - RFC7042 - "IANA Considerations and IETF Protocol and Documentation Usage for IEEE 802 Parameters") 00-00-5E-00-53-00 到 00-00-5E-00-53-FF:分配用于文档。
-MAC 开头的 '02' 字节表示这是一个由本地用户或系统设置的“locally administered address”。大多数普通 Ethernet 设备分配到的 MAC 最高有效字节为 00。
我更新了这篇文章,以区分 gratuitous ARP request 和 reply。
请注意,有些设备会响应 gratuitous request,而有些设备会响应 gratuitous reply。如果有人正在编写用于在所有路由器、交换机和 IP 栈上都能移动 IP 地址的软件,最好同时发送 request 和 reply。这些在 RFC 2002 和 RFC 826 中有记录。实现 gratuitous ARP 功能的软件可以在 Linux-HA 源码树中找到。request 之前可以先发送 probe,以避免污染地址空间。对于 ARP Probe,Sender IP address 字段为 0.0.0.0。原始 ARP RFC 并未考虑 ARP probe。
-request 中的 target MAC address 是否重要?我理解 Solaris 在其标准 ARP request 中使用 ff:ff:ff:ff:ff:ff,而大多数其他 OS 使用 00:00:00:00:00:00。上面 target address 中使用 ff:ff:ff:ff:ff:ff MAC 是否有任何重要意义?显然,destination address 为 ff:ff:ff:ff:ff:ff 是关键。是的
RFC 3927 基于 Gratuitous ARP,它为 target MAC 指定 00:00:00:00:00:00。不过,许多简单的 TCP/IP 栈有一个 API,只允许指定一个 MAC 值;当 Ethernet Destination 字段设置为 'broadcast' 时,ARP target 也会被设置为 'broadcast'。注意:普通 ARP request 的 ARP Packet Target MAC address 与 Ethernet Destination 字段中的值相同。
Imported from https://wiki.wireshark.org/Gratuitous_ARP on 2020-08-11 23:14:20 UTC