7. Risoluzione degli indirizzi e rilevazione di irraggiungibilità del vicino (Address Resolution and Neighbor Unreachability Detection)
Questa sezione descrive la risoluzione degli indirizzi e la rilevazione di irraggiungibilità del vicino. La risoluzione degli indirizzi è il processo attraverso il quale un nodo determina l'indirizzo di livello di collegamento di un vicino dato solo il suo indirizzo IP. La Neighbor Unreachability Detection (NUD) è il processo di tracciamento dello stato di raggiungibilità del percorso verso un vicino.
7.1. Risoluzione degli indirizzi (Address Resolution)
La risoluzione degli indirizzi viene eseguita solo su indirizzi che sono determinati essere on-link. Non viene mai eseguita su indirizzi multicast.
Quando un nodo ha un pacchetto IPv6 da inviare, esamina prima il Destination Cache per determinare l'indirizzo del next-hop per la destinazione. Se il Destination Cache non contiene una voce per la destinazione, il nodo utilizza l'algoritmo di determinazione del next-hop (vedere Sezione 5.2) per determinare l'indirizzo del next-hop.
Una volta noto l'indirizzo IP del next-hop, il mittente esamina il Neighbor Cache per informazioni sul livello di collegamento sul next-hop. Se non esiste alcuna voce, il mittente ne crea una, imposta il suo stato su INCOMPLETE, avvia la risoluzione degli indirizzi e mette in coda il pacchetto dati in attesa del completamento della risoluzione degli indirizzi.
Per i pacchetti multicast, il next-hop è sempre l'indirizzo di destinazione (multicast) ed è considerato on-link. La procedura per determinare l'indirizzo di livello di collegamento corrispondente a un indirizzo IP multicast è descritta in un documento separato che copre il funzionamento di IP su un particolare tipo di collegamento (ad esempio, [IPv6-ETHER]).
Per i pacchetti unicast, la risoluzione degli indirizzi viene eseguita come segue. Il mittente crea una voce Neighbor Cache per l'indirizzo del next-hop (se non esiste già), imposta il suo stato su INCOMPLETE e avvia la risoluzione degli indirizzi inviando un messaggio Neighbor Solicitation all'indirizzo multicast solicited-node corrispondente all'indirizzo target. La sollecitazione viene inviata da un indirizzo assegnato all'interfaccia da cui viene inviata la sollecitazione.
L'indirizzo Target della Neighbor Solicitation viene impostato sull'indirizzo del next-hop. Se il mittente ha un indirizzo assegnato all'interfaccia da cui viene inviata la Neighbor Solicitation, l'opzione Source Link-Layer Address DOVREBBE (SHOULD) essere inclusa. Se il mittente non ha un indirizzo assegnato all'interfaccia da cui viene inviata la sollecitazione (ad esempio, durante l'inizializzazione), il mittente NON DEVE (MUST NOT) includere l'opzione Source Link-Layer Address.
In attesa del completamento della risoluzione degli indirizzi, il mittente DEVE (MUST), per ciascun vicino, mantenere una piccola coda di pacchetti in attesa del completamento della risoluzione degli indirizzi. La coda DEVE (MUST) contenere almeno un pacchetto e PUÒ (MAY) contenerne di più. Tuttavia, il numero di pacchetti in coda per vicino DOVREBBE (SHOULD) essere limitato a un numero piccolo. Una volta completata la risoluzione degli indirizzi, il nodo trasmette tutti i pacchetti in coda.
In attesa del completamento della risoluzione degli indirizzi, il mittente continua a inviare Neighbor Solicitations. Le Neighbor Solicitations per la risoluzione degli indirizzi vengono inviate ogni RetransTimer millisecondi fino a quando non viene ricevuto un Neighbor Advertisement o fino a quando non è stato inviato il numero massimo di Neighbor Solicitations (MAX_MULTICAST_SOLICIT). Se non viene ricevuto alcun Neighbor Advertisement dopo MAX_MULTICAST_SOLICIT sollecitazioni, la risoluzione degli indirizzi è fallita. Il mittente DEVE (MUST) liberare qualsiasi copia in cache del pacchetto e DOVREBBE (SHOULD) restituire indicazioni ICMP destination unreachable con codice 3 (Address Unreachable) per ciascun pacchetto in coda in attesa di risoluzione degli indirizzi.
7.2. Rilevazione di irraggiungibilità del vicino (Neighbor Unreachability Detection)
7.2.1. Conferma di raggiungibilità (Reachability Confirmation)
Un vicino è considerato raggiungibile se il nodo ha ricevuto di recente una conferma che i pacchetti inviati di recente al vicino sono stati ricevuti dal suo livello IP. La conferma positiva può essere raccolta in due modi: suggerimenti dai protocolli di livello superiore che indicano che una connessione sta facendo "progressi in avanti", o ricezione di un messaggio Neighbor Advertisement che è una risposta a un messaggio Neighbor Solicitation.
Una connessione fa "progressi in avanti" se i pacchetti ricevuti da un peer remoto possono arrivare solo se i pacchetti recenti inviati a quel peer lo stanno effettivamente raggiungendo. In TCP, ad esempio, la ricezione di un (nuovo) acknowledgement indica che i dati precedentemente inviati hanno raggiunto il peer. Allo stesso modo, l'arrivo di nuovi dati (non duplicati) indica che gli acknowledgement precedenti stanno raggiungendo il peer remoto. Se i pacchetti stanno raggiungendo il peer, devono anche raggiungere il livello IP del peer, che è il requisito per la Neighbor Unreachability Detection.
Per destinazioni off-link, i progressi in avanti implicano che il router di primo hop è raggiungibile. Quando tale conferma esiste, un'implementazione PUÒ (MAY) aggiornare la voce Neighbor Cache per il router di primo hop e impostare il suo stato di raggiungibilità su REACHABLE. Se un'implementazione non traccia i progressi in avanti, DOVREBBE (SHOULD) presumere che i progressi in avanti vengano effettuati quando i pacchetti continuano ad essere ricevuti da un peer remoto.
La Neighbor Unreachability Detection opera in parallelo con le applicazioni che stanno inviando pacchetti. L'invio di un pacchetto a un vicino non conferma la sua raggiungibilità; la ricezione dell'acknowledgement corrispondente lo fa. Un'implementazione NON DEVE (MUST NOT) concludere che un vicino è raggiungibile semplicemente perché viene utilizzato attivamente.
Quando un nodo deve eseguire la risoluzione degli indirizzi su un indirizzo vicino ma ha già una voce Neighbor Cache per l'indirizzo nello stato STALE, il nodo aggiorna lo stato su DELAY anziché INCOMPLETE e invia una Neighbor Solicitation per confermare la raggiungibilità. Il nodo attende quindi DELAY_FIRST_PROBE_TIME secondi. Se non viene ricevuta alcuna conferma di raggiungibilità entro quel tempo, lo stato della voce viene cambiato in PROBE e inizia la Neighbor Unreachability Detection.
7.2.2. Stati delle voci Neighbor Cache (Neighbor Cache Entry States)
Una voce Neighbor Cache per un vicino a cui viene inviato traffico può essere in uno dei cinque stati possibili:
INCOMPLETE (incompleto) - La risoluzione degli indirizzi è attualmente in corso sulla voce. Specificamente, una Neighbor Solicitation è stata inviata all'indirizzo multicast solicited-node del target, ma il Neighbor Advertisement corrispondente non è ancora stato ricevuto.
REACHABLE (raggiungibile) - È stata ricevuta una conferma positiva negli ultimi ReachableTime millisecondi che il percorso in avanti verso il vicino funzionava correttamente. Mentre è REACHABLE, non viene eseguita alcuna azione speciale quando vengono inviati pacchetti.
STALE (obsoleto) - Sono trascorsi più di ReachableTime millisecondi dall'ultima conferma positiva ricevuta che il percorso in avanti funzionava correttamente. Mentre è stale, non viene eseguita alcuna azione fino a quando non viene inviato un pacchetto.
Lo stato STALE viene inserito alla ricezione di un messaggio Neighbor Discovery non sollecitato che aggiorna l'indirizzo di livello di collegamento in cache. La ricezione di tale messaggio non conferma la raggiungibilità e l'ingresso nello stato STALE garantisce che i guasti del percorso vengano rilevati rapidamente. Tuttavia, la raggiungibilità non viene effettivamente verificata fino a quando la voce non viene utilizzata.
DELAY (ritardo) - Sono trascorsi più di ReachableTime millisecondi dall'ultima conferma positiva ricevuta che il percorso in avanti funzionava correttamente, e un pacchetto è stato inviato negli ultimi DELAY_FIRST_PROBE_TIME secondi. Se non viene ricevuta alcuna conferma di raggiungibilità entro DELAY_FIRST_PROBE_TIME secondi dall'ingresso nello stato DELAY, inviare una Neighbor Solicitation unicast e cambiare lo stato in PROBE.
Lo stato DELAY è un'ottimizzazione che fornisce ai protocolli di livello superiore tempo aggiuntivo per fornire conferma di raggiungibilità in quei casi in cui sono trascorsi ReachableTime millisecondi dall'ultima conferma a causa della mancanza di traffico recente. Senza questa ottimizzazione, l'apertura di una connessione TCP dopo una pausa del traffico avvierebbe probe anche se la successiva stretta di mano a tre vie fornirebbe una conferma di raggiungibilità quasi immediatamente.
PROBE (sonda) - Una conferma di raggiungibilità viene attivamente cercata ritrasmettendo Neighbor Solicitations unicast ogni RetransTimer millisecondi fino a quando non viene ricevuta una conferma di raggiungibilità o fino a quando non è stato inviato il numero massimo di probe (MAX_UNICAST_SOLICIT). Se non viene ricevuta alcuna risposta dopo l'invio di MAX_UNICAST_SOLICIT sollecitazioni, le ritrasmissioni cessano e la voce DOVREBBE (SHOULD) essere eliminata. Il traffico successivo verso quel vicino ricreerà la voce ed eseguirà nuovamente la risoluzione degli indirizzi.
Si noti che tutte le Neighbor Solicitations sono limitate in velocità su base per vicino. Un nodo NON DEVE (MUST NOT) inviare Neighbor Solicitations allo stesso target più frequentemente di una volta ogni RetransTimer millisecondi.
7.2.3. Comportamento del nodo (Node Behavior)
L'algoritmo Neighbor Unreachability Detection opera in modo diverso a seconda che la voce venga utilizzata per inoltrare pacchetti.
Quando viene ricevuta una conferma di raggiungibilità (tramite consiglio di livello superiore o un Neighbor Advertisement sollecitato), lo stato di una voce cambia in REACHABLE. L'unica eccezione è che il consiglio di livello superiore non ha effetto sulle voci nello stato INCOMPLETE (ad esempio, per le quali non è stato memorizzato nella cache alcun indirizzo di livello di collegamento).
Quando un nodo invia un pacchetto a un vicino la cui voce è STALE, il nodo aggiorna lo stato della voce su DELAY e imposta un timer per scadere in DELAY_FIRST_PROBE_TIME secondi. Se la voce è ancora nello stato DELAY quando il timer scade, lo stato della voce cambia in PROBE e viene inviata una Neighbor Solicitation unicast. La Neighbor Solicitation viene inviata utilizzando l'indirizzo di livello di collegamento in cache. Le sollecitazioni successive (se presenti) vengono inviate utilizzando lo stesso indirizzo di livello di collegamento in cache. Le Neighbor Solicitations vengono ritrasmesse ogni RetransTimer millisecondi fino a quando non viene ricevuta una conferma di raggiungibilità o fino a quando non sono state inviate MAX_UNICAST_SOLICIT sollecitazioni.
Se viene ricevuto un Neighbor Advertisement in risposta a una Neighbor Solicitation unicast e il flag Solicited del Neighbor Advertisement è impostato, lo stato della voce cambia in REACHABLE. Se il flag Solicited non è impostato, la voce rimane nello stato PROBE.
Se viene ricevuta una conferma di raggiungibilità nello stato PROBE, lo stato della voce cambia in REACHABLE. Se il numero massimo di probe è stato inviato senza ricevere una conferma di raggiungibilità, la voce DOVREBBE (SHOULD) essere eliminata e il traffico futuro verso quel vicino richiederà di eseguire nuovamente la risoluzione degli indirizzi. Un'implementazione PUÒ (MAY) raccogliere voci obsolete in qualsiasi momento. Tuttavia, le voci nello stato INCOMPLETE NON DOVREBBERO (SHOULD NOT) essere eliminate fino a quando la risoluzione degli indirizzi non è fallita (cioè, MAX_MULTICAST_SOLICIT Neighbor Solicitations sono state inviate e non è stata ricevuta alcuna risposta).
7.3. Protocollo di rilevazione di irraggiungibilità del vicino (Neighbor Unreachability Detection Protocol)
Questa sezione fornisce una panoramica di come opera l'algoritmo Neighbor Unreachability Detection.
7.3.1. Eventi di conferma di raggiungibilità (Reachability Confirmation Events)
I seguenti eventi causano la riconferma di un indirizzo di livello di collegamento in cache come REACHABLE:
-
Ricezione di un Neighbor Advertisement sollecitato per una voce in qualsiasi stato eccetto INCOMPLETE.
-
Ricezione di una conferma di raggiungibilità di livello superiore (ad esempio, acknowledgement TCP positivo) per una voce in qualsiasi stato eccetto INCOMPLETE.
-
Per una voce nello stato STALE, DELAY o PROBE, invio di una Neighbor Solicitation e ricezione di un Neighbor Advertisement sollecitato.
7.3.2. Transizioni di stato (State Transitions)
Le transizioni di stato si verificano come segue:
INCOMPLETE -> REACHABLE: Quando viene ricevuto un Neighbor Advertisement valido che contiene l'opzione Target Link-Layer Address.
INCOMPLETE -> (eliminato): Quando la risoluzione degli indirizzi fallisce (cioè, MAX_MULTICAST_SOLICIT Neighbor Solicitations inviate senza risposta).
REACHABLE -> STALE: Quando trascorrono ReachableTime millisecondi senza ricevere una conferma di raggiungibilità.
STALE -> DELAY: Quando viene inviato un pacchetto a un vicino nello stato STALE.
STALE -> REACHABLE: Quando viene ricevuta una conferma di raggiungibilità.
DELAY -> PROBE: Quando trascorrono DELAY_FIRST_PROBE_TIME secondi senza ricevere una conferma di raggiungibilità.
DELAY -> REACHABLE: Quando viene ricevuta una conferma di raggiungibilità.
PROBE -> REACHABLE: Quando viene ricevuta una conferma di raggiungibilità.
PROBE -> (eliminato): Quando vengono inviate MAX_UNICAST_SOLICIT probe senza ricevere una conferma di raggiungibilità.
7.3.3. Invio di Neighbor Solicitations (Sending Neighbor Solicitations)
Quando si invia un messaggio Neighbor Solicitation allo scopo della Neighbor Unreachability Detection, si applicano le seguenti regole:
-
L'indirizzo Target della Neighbor Solicitation DEVE (MUST) essere impostato sull'indirizzo IP del vicino la cui raggiungibilità viene confermata.
-
La Neighbor Solicitation DEVE (MUST) essere inviata come pacchetto unicast utilizzando l'indirizzo di livello di collegamento in cache.
-
L'indirizzo sorgente della Neighbor Solicitation DEVE (MUST) essere un indirizzo assegnato all'interfaccia da cui viene inviata la Neighbor Solicitation.
-
La Neighbor Solicitation DOVREBBE (SHOULD) includere l'opzione Source Link-Layer Address.
7.3.4. Ricezione di Neighbor Solicitations (Receiving Neighbor Solicitations)
Quando viene ricevuta una Neighbor Solicitation, il destinatario controlla se è il target della sollecitazione. In tal caso, il destinatario DOVREBBE (SHOULD) creare o aggiornare la voce Neighbor Cache per il mittente. Se esiste già una voce Neighbor Cache per il mittente, il destinatario aggiorna l'indirizzo di livello di collegamento della voce (se diverso) e imposta lo stato della voce come segue:
-
Se la voce è in qualsiasi stato e il flag Override in un Neighbor Advertisement ricevuto è impostato, l'indirizzo di livello di collegamento della voce viene aggiornato.
-
Se la voce è nello stato INCOMPLETE, l'indirizzo di livello di collegamento della voce viene impostato sul valore nell'opzione Source Link-Layer Address (se presente) e lo stato viene impostato su STALE.
-
Se la voce è in qualsiasi stato diverso da INCOMPLETE e l'indirizzo Source Link-Layer Address ricevuto differisce dall'indirizzo di livello di collegamento in cache e il flag Override è impostato, l'indirizzo di livello di collegamento in cache viene sostituito con l'indirizzo ricevuto e lo stato della voce rimane invariato.
7.4. Invio di Neighbor Advertisements (Sending Neighbor Advertisements)
Un nodo invia Neighbor Advertisements in risposta alle Neighbor Solicitations e invia anche Neighbor Advertisements non sollecitati quando il suo indirizzo di livello di collegamento cambia.
7.4.1. Risposta alle Neighbor Solicitations (Responding to Neighbor Solicitations)
Quando viene ricevuta una Neighbor Solicitation, il nodo target DOVREBBE (SHOULD) rispondere con un Neighbor Advertisement. Il Neighbor Advertisement viene inviato all'indirizzo sorgente della Neighbor Solicitation se non è l'indirizzo non specificato; altrimenti, il Neighbor Advertisement viene inviato all'indirizzo multicast all-nodes.
L'indirizzo Target del Neighbor Advertisement viene copiato dall'indirizzo Target della Neighbor Solicitation. Il flag Solicited viene impostato a uno se il Neighbor Advertisement viene inviato in risposta a una Neighbor Solicitation; altrimenti, viene impostato a zero.
Se l'opzione Target Link-Layer Address è inclusa nella Neighbor Solicitation e l'indirizzo di livello di collegamento differisce dall'indirizzo di livello di collegamento del nodo ricevente, il flag Override viene impostato a uno; altrimenti, viene impostato secondo le circostanze.
7.4.2. Neighbor Advertisements non sollecitati (Unsolicited Neighbor Advertisements)
Un nodo può inviare Neighbor Advertisements non sollecitati per annunciare cambiamenti al suo indirizzo di livello di collegamento. Quando un nodo rileva che il suo indirizzo di livello di collegamento è cambiato (ad esempio, dopo lo scambio a caldo di un'interfaccia Ethernet), DOVREBBE (SHOULD) fare multicast di alcuni Neighbor Advertisements all'indirizzo multicast all-nodes per aggiornare rapidamente le voci Neighbor Cache dei vicini.
Per i Neighbor Advertisements non sollecitati, il flag Override DOVREBBE (SHOULD) essere impostato a uno per garantire che i vicini aggiornino i loro indirizzi di livello di collegamento in cache. Il flag Solicited DEVE (MUST) essere impostato a zero nei Neighbor Advertisements non sollecitati.