arp --delete non sta eliminando una voce; contrassegna semplicemente la voce come "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

Dopo non --deletemi aspettavo di entrare 10.10.7.30. Inaspettatamente, la voce rimane ed è contrassegnata <incomplete>.

Usando Ubuntu 10.04 .

Risposte:


10

La voce verrà rimossa, sii paziente.

(Se si desidera la risposta più breve possibile: incompleta == eliminata)

Diciamo che "elimina" è la parola sbagliata per l'azione. Ciò che sta realmente accadendo qui è che la voce è impostata manualmente sullo stato "richiesta inviata, nessuna risposta" (quindi processo ARP "incompleto") come se la macchina fosse davvero irraggiungibile.

Ora, la voce verrà completamente rimossa presto a meno che nel frattempo non ottenga una nuova risposta ARP valida. In tal caso la voce verrebbe nuovamente aggiunta comunque anche se fosse rimossa invece di essere contrassegnata come incompleta. Quindi non ci sono pro o contro reali in questo comportamento.

Ma tieni presente che stiamo parlando di una cache. L'eliminazione di oggetti dalla cache è difficile e costosa. È molto più efficiente invalidare una voce e attendere se viene sostituita prima che venga finalmente rimossa. Ma per il sistema non fa assolutamente differenza se la voce è scomparsa dall'elenco o è semplicemente contrassegnata come incompleta.


E non c'è modo di eliminarlo davvero in modo che una successiva necessità di conoscere la destinazione possa innescare una "nuova" query ARP?
Skaperen,

1
Ma è esattamente così. Se qualcosa cerca una voce contrassegnata come "incompleta", viene inviata una nuova richiesta ARP. Se viene data risposta, la voce viene aggiornata e non è più "incompleta". Se non viene restituita alcuna risposta, la voce viene rimossa dall'elenco dopo qualche tempo. (Ecco perché penso che sia abbastanza inutile "--eliminare" manualmente una voce. Se la macchina è viva, la voce verrà aggiornata. Se è davvero sparita, allora perché "--delete" la voce manualmente comunque?)
Karma Fusebox

... mi viene in mente che potresti voler "cambiare" l'indirizzo ARP per un indirizzo IP. In questo caso speciale è possibile "- eliminare" manualmente e fare in modo che la successiva richiesta ARP restituisca il nuovo indirizzo. Ma per questo scenario, non importa affatto se la voce viene visibilmente rimossa dall'elenco o contrassegnata come "incompleta". Per la tecnologia coinvolta, è lo stesso.
Karma Fusebox

@KarmaFusebox sai dove esiste questa cache? È nella memoria di processo? In tal caso, quale processo? o è gestito dal kernel? In un file su disco? altrove?
JamesThomasMoon1979,

@KarmaFusebox L'eliminazione di una voce ha senso se anche le voci sono state aggiunte manualmente (e quindi hanno impostato il flag permanente)
cha5on

7

Solo per completare tutte le altre risposte, ho trovato questo link molto utile .

In alcuni casi l'utilizzo ipè più appropriato, come il comando:

# ip -s -s neigh flush all

I risultati possono dipendere dal kernel di Linux.


Ha funzionato perfettamente per me. Chiunque abbia problemi con altre risposte dovrebbe provarlo.
jackgu1988,

3

A parte le altre belle risposte, vale la pena ricordare che è possibile eliminare completamente la cache arp rimuovendola. Uno dei modi meno dolorosi è:

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

Questo dovrebbe rimuovere tutte le voci, siano esse in qualunque stato.

I metodi alternativi includono il downing e il potenziamento dell'interfaccia e metodi simili per rendere la cache arp completamente rimossa e ricreata.


1
Questa è la risposta corretta Avevo bisogno esattamente di questo. Non solo contrassegnare una voce per "incompleto" o "non è stato raggiunto per un po '". Grazie.
John Hamilton,

0

So che potrebbe sembrare ovvio, ma, per coloro che non erano abituati a lavorare con la shell, questo è il mio suggerimento:

A partire dalla risposta di @KarmaFusebox, perché non semplicemente grep i risultati ...? :

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

Ti mostrerà solo le voci della cache esistenti / attive.
Penso che continui ad essere un comando conforme a POSIX . Ed è un metodo gestibile da script , se è quello che ti serve.


Sto cercando una spiegazione ragionevole del perché arpsi comporti in questo modo. Sembra strano. Tangenzialmente, potrebbe arpessere costretto a rimuovere le <incomplete>voci?
JamesThomasMoon1979,

Bene, @ JamesThomasMoon1979, preferirei dire che, su sistemi che sembrano non comportarsi in questo modo (ad esempio: console di Windows), lo sono davvero. L'unica differenza è che non mostrano le incompletevoci nel comando elenco cache arp.
Sopalajo de Arrierez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.