在至少一种实现中,对 ARP 表的容量存在硬限制。当 ARP 缓存已满并且数据包提供的目的地(或下一跳)未缓存时会发生什么?幕后发生了什么,对服务质量有什么影响?
例如,Brocade NetIron XMR 和 Brocade MLX 路由器具有可配置的ip-arp
系统最大值。这种情况下的默认值为 8192;/19 子网的大小。从文档中不清楚这是针对每个接口还是针对整个路由器,但出于这个问题的目的,我们可以假设它是针对每个接口的。
很少有网络人员会故意在接口上配置 /19 子网,但事实并非如此。我们正在将核心路由器从 Cisco 型号迁移到 Brocade。Cisco 和 Brocade 之间的众多差异之一是 Cisco 接受使用出站接口和下一跳地址定义的静态路由,但 Brocade 坚持其中之一。我们丢弃了下一跳地址并保留了接口。后来,我们知道了我们的方式的错误,并从接口更改为下一跳地址,但最初似乎一切正常。
+----+ iface0 +----+
| R1 |-----------| R2 |---> (10.1.0.0/16 this way)
+----+.1 .2+----+
10.0.0.0/30
在迁移之前,R1 是 Cisco,并且有以下路由。
ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2
迁移后,R1是Brocade,有如下路由。
ip route 10.1.0.0 255.255.0.0 iface0
R2是Cisco路由器,Cisco路由器默认执行代理ARP。这是生产中的(错误)配置,它为结果是 ARP 缓存溢出奠定了基础。
- R1 接收发往 10.1.0.0/16 网络的数据包。
- 在静态接口路由的基础上,R1 上的目的 ARP
iface0
- R2 认识到它可以到达目的地,并使用自己的 MAC 响应 ARP。
- R1 缓存将远程网络中的 IP 与 R2 的 MAC 组合在一起的 ARP 结果。
对于 10.1.0.0/16 中的每个不同目的地,都会发生这种情况。因此,即使 /16 在 R2 之外进行了正确的子网划分,并且连接 R1 和 R2 的链路上只有两个节点,R1 仍会遭受 ARP 缓存过载,因为它导致 R2 表现得好像所有 65k 地址都直接连接一样。
我问这个问题的原因是因为我希望它可以帮助我理解导致我们最终导致 ARP 缓存溢出的网络服务故障报告(几天后)。本着 StackExchange 模型的精神,我试图将其提炼为一个我认为可以客观回答的清晰、具体的问题。
编辑 1为明确起见,我问的是数据链路(第 2 层)和网络(第 3 层)之间的粘合层的一部分,而不是数据链路层内的 MAC 转发表。主机或路由器构建前者以将 IP 地址映射到 MAC 地址,而交换机构建后者以将 MAC 地址映射到端口。
编辑 2虽然我很欣赏响应者为解释为什么某些实现不受 ARP 缓存溢出影响所做的努力,但我认为解决这些问题对这个问题很重要。问题是“什么时候会发生什么”,而不是“供应商X 是否容易受到影响”。我现在已经通过描述一个具体的例子完成了我的工作。
编辑 3另一个问题不是“如何防止 ARP 缓存溢出?”