当目标机器离线时,Windows 10 arp 缓存在尝试失败后卡住

Ada*_*dam 5 networking arp windows-10

将我们的开发团队从 7 升级到 Windows 10 后,我们遇到了 ARP 缓存问题,其中一台机器缓存了正确的 IP-MAC 映射,但由于在目标机器的电源循环期间连接失败,类型无效。在 Windows 10 上,但不是 Windows 7,在清除 ARP 缓存之前无法连接到目标计算机。我可以按如下方式重现该问题,其中 10.10.10.10 是正确的 IP 地址,01:23:45:67:89:AB 是相关目标机器的正确 MAC 地址:

  1. 从关闭目标机器的电源开始,并通过整个测试对其进行 ping:

    ping -t 10.10.10.10
    
    Run Code Online (Sandbox Code Playgroud)

Ping 正在回复“请求超时”并且 ARP 缓存包含,正如预期的那样

10.10.10.10    00:00:00:00:00:00    invalid
Run Code Online (Sandbox Code Playgroud)
  1. 打开目标机器的电源。Ping 开始收到回复,并且 ARP 缓存更新为

    10.10.10.10    01:23:45:67:89:AB    dynamic
    
    Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

  1. 关闭目标机器。Ping 开始报“Request timed out”,ARP 缓存依然存在

    10.10.10.10    01:23:45:67:89:AB    dynamic
    
    Run Code Online (Sandbox Code Playgroud)
  2. 大约40秒后,ping 1次请求回复“Destination host unreachable”,然后返回上报“Request timed out”,ARP缓存变为

    10.10.10.10    01:23:45:67:89:AB    invalid
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开目标机器的电源,在您清除 ARP 缓存或至少删除具有无效类型的正确 IP-MAC 映射的违规条目之前,ping(以及任何其他连接)将无法找到它。

考虑到开发环境中的目标机器在开发过程中确实需要重启电源,我该如何防止 ARP 缓存进入这种状态?手动操作 ARP 缓存是不可持续的,在迁移到 Windows 10 之前没有人报告过这个问题。

Windows 7 的功能正如人们所期望的那样,也就是说,我们想要的是:ARP 缓存经历与上述相同的阶段。Ping 在目标启动前回复“目标主机无法访问”,这与 Windows 10 的“请求超时”相反,并在关闭电源后不断返回“目标主机无法访问”,而不是 Windows 10 只报告一次. 机器上电后立即建立连接,ARP缓存返回

10.10.10.10    01:23:45:67:89:AB    dynamic
Run Code Online (Sandbox Code Playgroud)

无需先清除任何条目。

开发人员的特定设置是一个 Windows 工作站,通过一个简单的非托管 8 端口千兆交换机连接到几个 Beaglebone Black(运行 Linux 的基于 ARM 的小型嵌入式板)。IP 地址由保留的 DHCP 分配,每次 Beaglebones 上电时都会成功获取地址。当一台 Windows 10 机器有需要删除的无效 ARP 条目时,ARP 缓存中没有 Beaglebone 的其他机器可以成功连接到目标机器。

小智 0

这么多年过去了还是一样。做嵌入式开发的时候很烦人。

至少我找到了一些半解决方案。

当链路断开时,Win10 会立即删除接口上的所有 ARP 缓存。因此,在嵌入式设备断电时,这会刷新缓存。这不是问题。

当 Windows 在设备能够响应之前尝试对其进行 ARP 时,就会出现问题。这会将 ARP 缓存设置为失败(“不完整”)。即使设备上线并响应 ARP 请求,一段时间内也不会发出此类请求。这种情况要么需要另一次硬链接断开并重新 ARP,这相当于 ARP 缓存刷新,要么在 Win10 重新 ARP 之前等待一分钟。

一个简单但通常令人烦恼的解决方案是添加静态 ARP 条目。这很令人恼火,因为 a) 您需要提前知道这一点,b) 您需要成为 PC 管理员才能执行此操作。

另一个修复方法是在线路中安装一个以太网交换机,以保护 Win10 PC 免受链路丢失的影响,并通过(以管理员身份)禁用邻居无法访问检测:

netsh 接口 ipv4 设置接口 nud=禁用 存储=持久

现在,尝试访问启动设备失败不会将缓存降至“不完整”。

这些解决方案都不令人满意,但它们确实能让您走得更远。

哈皮