arp --delete 不会删除条目;仅将条目标记为“不完整”

arp --delete 不会删除条目;仅将条目标记为“不完整”
$ sudo arp -avn
? (10.10.7.30) at 00:cc:cc:bb:dd:86 [ether] on eth0
...

$ sudo arp --delete 10.10.7.30

$ sudo arp -avn
? (10.10.7.30) at <incomplete> [ether] on eth0

我以为--delete不会有 的条目10.10.7.30。出乎意料的是,该条目仍然存在,并被标记为<incomplete>

使用Ubuntu 10.04

答案1

该条目将被删除,请耐心等待。

(如果你想要最简短的答案:不完整==已删除)

假设“删除”不是该操作的错误用词。实际发生的情况是,该条目被手动设置为状态“请求已发送,尚无答复”(因此 ARP 过程“不完整”)就好像该机器真的无法访问一样。

现在,除非在此期间收到新的有效 ARP 响应,否则该条目将很快被完全删除。在这种情况下,即使条目被删除,它仍会被重新添加,而不是被标记为不完整。所以这种行为实际上没有好处或坏处。

但请记住,我们谈论的是缓存。从缓存中删除内容既困难又昂贵。使条目无效并等待其被替换后再最终删除,这种方式效率更高。但对于系统而言,条目从列表中消失或只是标记为不完整完全没有区别。

答案2

为了补充所有其他答案,我发现这个链接非常有用

在某些情况下使用ip更合适,例如以下命令:

# ip -s -s neigh flush all

结果可能取决于您的 Linux 内核。

答案3

除了其他不错的答案之外,值得一提的是,可以通过删除 arp 缓存来彻底消除它。其中一种不太麻烦的方法是:

ip link set arp off dev eth0 ; ip link set arp on dev eth0

这应该删除所有条目,无论它们处于何种状态。

替代方法包括关闭和启动接口以及类似方法,以完全删除和重新创建 arp 缓存。

答案4

我知道这听起来很明显,但是对于那些不习惯使用 shell 的人来说,这是我的建议:

从@KarmaFusebox 的回答开始,为什么不简单地grep 结果...? :

arp -a | grep "incomplet" -i -v

它只会显示现有/活动的缓存条目。
我认为它一直是符合 POSIX 标准命令。这是可编写脚本方法,如果这是您所需要的。

相关内容