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


10
$ 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

Answers:


10

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

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

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

现在,除非同时获得新的有效ARP响应,否则该条目将很快被完全删除。在这种情况下,即使将其删除而不是被标记为不完整,该条目仍将被重新添加。因此,此行为没有实际的利弊。

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


还有没有办法真正删除它,以致随后需要知道目的地会触发“新” ARP查询?
Skaperen

1
但是,这里就是这种情况。如果有任何查找到标记为“不完整”的条目,则发送新的ARP请求。如果已回答,则条目将更新并且不再“不完整”。如果没有答案,则一段时间后,该条目将从列表中删除。(这就是为什么我认为手动“-删除”条目几乎没有用。如果计算机运行了,条目将被刷新。如果确实消失了,那么为什么仍然要手动“-删除”条目?)
Karma Fusebox

……我想到您可能想“更改” IP地址的ARP地址。在这种特殊情况下,您可以手动“-删除”,并使下一个ARP请求返回新地址。但是对于这种情况,将条目从列表中明显移除或标记为“不完整”根本不重要。对于所涉及的技术,它是相同的。
Karma Fusebox

@KarmaFusebox您知道此缓存在哪里吗?它在进程内存中吗?如果是这样,哪个过程?还是由内核维护?在磁盘上的文件中?别处?
JamesThomasMoon1979年

@KarmaFusebox如果条目也是手动添加的(因此设置了永久标记),则删除条目是有意义的
cha5on


3

除了其他好的答案外,值得一提的是,有可能通过删除arp缓存来完全根除它。较不痛苦的方法之一是:

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

这将删除所有条目,无论它们处于任何状态。

可供选择的方法包括缩小和增大接口,以及使arp缓存完全删除并重新创建的类似方法。


1
这是正确的答案。我确实需要这个。不仅仅是将某些条目标记为“不完整”或“一段时间未到达”。谢谢。
约翰·汉密尔顿,

0

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

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

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

它将仅显示现有/活动的缓存条目。
我认为它一直是POSIX兼容命令。如果需要的话,它是一种可编写脚本的方法。


我正在寻找一个合理的解释,为什么arp会这样。似乎很奇怪。可能arp会被迫删除<incomplete>条目吗?
JamesThomasMoon1979年

好吧,@ JamesThomasMoon1979,我想说的是,在似乎没有这种行为的系统(即Windows控制台)上,它们确实是。唯一的区别是它们不在incompletearp cache list命令上显示条目。
Sopalajo de Arrierez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.