ARP 是地址解析协议,如 RFC 826 中所述。联网机器使用 ARP 来解析同一本地网络上另一台机器的硬件位置/地址。互联网上的机器通常以其名称为人所知,这些名称解析为 IP 地址。这就是 foo.com 网络上的机器能够与 bar.net 网络上的另一台机器通信的方式。但是,IP 地址无法告诉您机器的物理位置。这就是 ARP 发挥作用的地方。
让我们来看一个非常简单的例子。假设我有一个由多台机器组成的网络。目前在我的网络上的两台机器分别是 foo,IP 地址为 10.0.0.1,以及 bar,IP 地址为 10.0.0.2。现在 foo 想要 ping bar 以查看它是否在线,但不幸的是,foo 不知道 bar 在哪里。因此,当 foo 决定 ping bar 时,它需要发送一个 ARP 请求。这个 ARP 请求类似于 foo 在网络上大喊:“Bar (10.0.0.2)!你在哪里?” 结果,网络上的每台机器都会听到 foo 的喊叫,但只有 bar (10.0.0.2) 会响应。然后,Bar 将直接向 foo 发送一个 ARP 回复,这类似于 bar 说:“Foo (10.0.0.1),我在这里,地址是 00:60:94:E9:08:12。” 在这个用于在网络上找到他的朋友的简单事务之后,foo 就可以与 bar 通信了,直到他(他的 ARP 缓存)忘记 bar 在哪里为止(通常在 Unix 上是 15 分钟后)。
现在让我们看看这是如何工作的。您可以像这样查看您机器当前的 ARP/邻居缓存/表
[root@espa041 /home/src/iputils]# ip neigh show 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable |
如您所见,我的机器 espa041 (9.3.76.41) 知道在哪里可以找到 espa042 (9.3.76.42) 和 espagate (9.3.76.1)。现在让我们向 ARP 缓存添加另一台机器。
[root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043 PING espa043.austin.ibm.com (9.3.76.43) from 9.3.76.41 : 56(84) bytes of data. 64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms --- espa043.austin.ibm.com ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.9/0.9/0.9 ms [root@espa041 /home/src/iputils]# ip neigh show 9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable |
由于 espa041 尝试联系 espa043,espa043 的硬件地址/位置现已添加到 ARP/邻居缓存中。因此,在 espa043 的条目超时之前(由于两者之间没有通信),espa041 知道在哪里可以找到 espa043,并且无需发送 ARP 请求。
现在让我们从我们的 ARP 缓存中删除 espa043
[root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0 [root@espa041 /home/src/iputils]# ip neigh show 9.3.76.43 dev eth0 nud failed 9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable 9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale |
现在 espa041 再次忘记了在哪里可以找到 espa043,并且下次需要与 espa043 通信时需要发送另一个 ARP 请求。您还可以从上面的输出中看到 espagate (9.3.76.1) 已更改为“stale”状态。这意味着显示的位置仍然有效,但必须在与该机器的第一次事务时进行确认。