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 地址:
从关闭目标机器的电源开始,并通过整个测试对其进行 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)
打开目标机器的电源。Ping 开始收到回复,并且 ARP 缓存更新为
10.10.10.10 01:23:45:67:89:AB dynamic
Run Code Online (Sandbox Code Playgroud)到现在为止还挺好。
关闭目标机器。Ping 开始报“Request timed out”,ARP 缓存依然存在
10.10.10.10 01:23:45:67:89:AB dynamic
Run Code Online (Sandbox Code Playgroud)大约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)打开目标机器的电源,在您清除 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=禁用 存储=持久
现在,尝试访问启动设备失败不会将缓存降至“不完整”。
这些解决方案都不令人满意,但它们确实能让您走得更远。
哈皮
| 归档时间: |
|
| 查看次数: |
3601 次 |
| 最近记录: |