正如 Ron Maupin 所说,这通常是一种错误配置(或者偶尔是一种过渡情况。)
如果如您所描述的,A 认为 B 是邻居,但 B 认为 A 不是邻居,并且它们已连接(例如通过交换机),则有许多情况与它们如何实现 ARP 有关。如果您发现自己的配置如此不匹配,那么了解会发生什么对于调试非常有用。请注意,嵌入式设备 IP 实施的质量与主要路由器和主机操作系统实施的质量不同。
ARP RFC 826是在分类寻址成为标准时发布的(1982 年),早在RFC 1519(1993 年)引入 CIDR 之前。因此,它不包括同一网络上具有不同网络掩码的两台主机的情况,即使子网划分当时很常见。很明显,请求者不应该请求超出其范围的 IP 地址(尽管某些操作系统确实这样做了)。但是,如果主机从自己网络之外的 IP 地址(由接收者的网络掩码定义)接收到 ARP 请求,应该怎么做?ARP RFC 和后续的主机要求 RFC 均未涵盖此内容。
使用当前 Cisco 和 Ubuntu 进行的测试表明,它们不会从接收器网络外部响应 ARP。但肯定有可能某些操作系统仍然“草率”并在不查看本地网络掩码的情况下回答 ARP 请求。(实际上,某些操作系统可能会更新 B 的 ARP 表,从而使 B 认为 A 是本地的,尽管网络掩码说了什么。)
- 如果 A 没有 B 的现有 ARP 条目,它将发送一个 ARP 请求
- B收到ARP请求
- 如果 B 是“严格的”,它将忽略该请求;如果“马虎”,它将发送 ARP 回复
- 如果 A 期望 ARP 回复但没有得到回复,它可能会重试
- 如果 A(现在)有 B 的 ARP 条目
- A将IP数据包发送给B
- B收到数据包
- 如果 B 有合适的本地路由器 R,将向 R 发送回复
可以使用 A 上 B 的静态 ARP 条目进行测试。
我通常忽略代理 ARP,因为它只是将问题转换为“如果 A 认为 P 是邻居但 P 认为 A 不是邻居”。