arp --delete não está excluindo uma entrada; apenas marca a entrada como "incompleta"


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

Depois --deletenão esperava entrada para 10.10.7.30. Inesperadamente, a entrada permanece e está marcada <incomplete>.

Usando o Ubuntu 10.04 .

Respostas:


10

A entrada será removida, apenas seja paciente.

(Se você deseja a resposta mais curta possível: incompleto == excluído)

Digamos que "excluir" é a palavra errada para a ação. O que realmente está acontecendo aqui é que a entrada é configurada manualmente para o estado "solicitação enviada, sem resposta" (portanto, processo ARP "incompleto") como se a máquina estivesse realmente inacessível.

Agora, a entrada será completamente removida em breve, a menos que obtenha uma nova resposta válida do ARP nesse meio tempo. Nesse caso, a entrada seria adicionada novamente mesmo que fosse removida em vez de ser marcada como incompleta. Portanto, não há nenhum benefício ou vantagem real nesse comportamento.

Mas lembre-se de que estamos falando de um cache. Excluir coisas de caches é difícil e caro. É muito mais eficiente invalidar uma entrada e aguardar se ela for substituída antes de finalmente ser removida. Mas, para o sistema, não há diferença se a entrada sair da lista ou apenas marcada como incompleta.


E não há como realmente excluí-lo, para que uma necessidade subsequente de saber o destino desencadeie uma "nova" consulta ARP?
7133 Skaperen

1
Mas exatamente esse é o caso aqui. Se algo procurar uma entrada marcada como "incompleta", uma nova solicitação ARP será enviada. Se for respondida, a entrada é atualizada e não é mais "incompleta". Se nenhuma resposta retornar, a entrada será removida da lista após algum tempo. (É por isso que eu acho que é bastante inútil "--delete" uma entrada manualmente Se a vida da máquina, a entrada será atualizada se ele é realmente ido embora, então por "--delete" a entrada de qualquer forma manualmente..?)
Karma Fusebox

... me vem à mente que você pode querer "alterar" o endereço ARP para um endereço IP. Nesse caso especial, você pode "- excluir" manualmente e a próxima solicitação ARP retornará o novo endereço. Mas para esse cenário, não importa se a entrada é visivelmente removida da lista ou marcada como "incompleta". Para a tecnologia envolvida, é a mesma coisa.
Karma Fusebox

@KarmaFusebox você sabe onde esse cache existe? Está na memória do processo? Em caso afirmativo, qual processo? ou é mantido pelo kernel? Em um arquivo em disco? em outro lugar?
JamesThomasMoon1979 06/06

@KarmaFusebox Excluindo uma entrada faz sentido se as entradas também foram adicionados manualmente (e, portanto, tem um sinalizador permanente)
cha5on

7

Apenas para complementar todas as outras respostas, achei este link muito útil .

Em alguns casos, usar ipé mais apropriado, como o comando:

# ip -s -s neigh flush all

Os resultados podem depender do seu kernel Linux.


Isso funcionou perfeitamente para mim. Qualquer pessoa que esteja tendo problemas com outras respostas deve tentar.
jackgu1988

3

Além das outras boas respostas, vale ressaltar que é possível eredicar completamente o cache do arp removendo-o. Uma das maneiras menos dolorosas é:

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

Isso deve remover todas as entradas, estejam elas em qualquer estado.

Os métodos alternativos incluem baixar e atualizar a interface e maneiras semelhantes de tornar o cache do arp completamente removido e recriado.


1
Essa é a resposta correta. Eu precisava exatamente disso. Não apenas marcar uma entrada como "incompleta" ou "não foi alcançada por um tempo". Obrigado.
John Hamilton

0

Eu sei que isso pode parecer óbvio, mas, para aqueles que não costumavam trabalhar com o shell, esta é minha sugestão:

A partir da resposta da @KarmaFusebox, por que não simplesmente saudar os resultados ...? :

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

Ele mostrará apenas as entradas de cache existentes / ativas.
Eu acho que continua sendo um comando compatível com POSIX . E é um método programável , se é isso que você precisa.


Estou procurando uma explicação razoável de por que arpse comporta dessa maneira. Parece peculiar. Tangencialmente, poderia arpser forçado a remover as <incomplete>entradas?
JamesThomasMoon1979

Bem, @ JamesThomasMoon1979, eu prefiro dizer que, em sistemas que parecem não se comportar dessa maneira (ou seja: console do Windows), eles realmente são. A única diferença é que eles não mostrar incompleteentradas sobre o comando lista de cache arp.
Sopalajo de Arrierez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.