Questo mi ha infastidito per anni.Timeout ARP. Perché fisso periodico?
domanda di base: C'è qualche motivo ARP deve da realizzare con intervalli di tempo fissi sulle voci di cache ARP?
Faccio un sacco di lavoro in circuiti in tempo reale. Attualmente effettuiamo la maggior parte delle nostre comunicazioni tra sistemi su collegamenti UDP/IP dedicati. Questo per la maggior parte funziona in modo affidabile in tempo reale, ma per un nit: timeout delle entrate ARP.
implementazioniil tipico modo fanno ARP è la seguente:
- Quando cliente chiede di inviare un pacchetto IP a un indirizzo IP con un indirizzo MAC sconosciuta, invece di inviare quel pacchetto IP, lo stack invia un Richiesta ARP. Se un livello superiore (TCP) si reinvia, non c'è problema. Ma dal momento che usiamo UDP, il messaggio originale è perso. Al momento dell'avvio è OK, ma nel bel mezzo dell'operazione si tratta di una cosa brutta ™.
- (Dinamico) Le voci della tabella ARP vengono rimosse periodicamente dalla tabella ARP, anche se abbiamo ottenuto un pacchetto da quel sistema un millesimo di secondo. Ciò significa che il Bad Thing ™ si verifica regolarmente nel nostro sistema.
La soluzione ovvia (che usiamo religiosamente) è rendere statiche tutte le voci ARP. Tuttavia, questo è un PITA reale (in particolare su RTOS in cui trovare l'indirizzo MAC di un'interfaccia non è sempre questione di un paio di semplici clic della GUI).
Indietro quando scrivemmo il nostro stack IP, ho risolto questo problema senza mai (mai) il timeout delle voci della tabella ARP. Ciò ha ovvi inconvenienti. Una soluzione più robusta e perfettamente ragionevole potrebbe essere quella di aggiornare il timeout della voce ogni volta che viene visualizzato un pacchetto dalla stessa combinazione MAC/IP. In questo modo una voce sarebbe scaduta solo se non fosse stata comunicata con lo stack in quel lasso di tempo.
Ma ora stiamo usando lo stack IP del nostro fornitore e siamo tornati agli stupidi timeout ARP. Abbiamo abbastanza leva con questo fornitore che forse potrei farli usare uno schema meno sfavorevole. Tuttavia, l'universalità di questo algoritmo di timeout cerebrale mi porta a credere che potrebbe essere una parte necessaria dell'implementazione.
Questa è la domanda. Questo comportamento è in qualche modo richiesto?
Direi che il comportamento di eliminare il pacchetto e invece di eseguire una procedura arp è piuttosto brutto. per esempio. Windows memorizza solo 1 pacchetto durante l'arp, mentre molti altri OS fa la cosa più sana e memorizza i pacchetti nel normale buffer del socket durante l'arp. – nos
@nos - In uscita o in entrata? Per quanto posso dire, i pacchetti * TCP * in uscita sono bufferizzati (perché è così che funziona TCP, per garantire l'affidabilità). I pacchetti UDP in uscita vengono semplicemente eliminati. –
Qualsiasi pacchetto IP in uscita (per la destinazione), che si tratti di TCP o UDP. Naturalmente, TCP rileverà e ritrasmetterà i pacchetti scartati. – nos