“Questo pro­to­col­lo Internet è una com­po­nen­te ir­ri­nun­cia­bi­le sia per Internet che per le reti in locale. Per far sì che riesca il trasporto di in­for­ma­zio­ni digitali e che i pacchetti dati inviati rag­giun­ga­no l’host o gli host de­si­de­ra­ti, l’NDP necessita di altri pro­to­col­li di aiuto e di routing: per questo si parla anche di “famiglia di pro­to­col­li Internet” o di “Internet Protocol Stack”. Mentre il Dynamic Host Con­fi­gu­ra­tion Protocol (DHCP) fa sì che ai client vengano assegnati gli indirizzi di rete adatti durante la con­nes­sio­ne agli Internet Protocol, il Neighbor Di­scor­ve­ry Protocol (NDP) serve tra le altre cose all’intera co­mu­ni­ca­zio­ne degli host limitrofi nelle reti locali così come alla ricerca del router gateway.

De­fi­ni­zio­ne del Neighbor Discovery Protocol

Il Neighbor Discovery Protocol viene uti­liz­za­to in com­bi­na­zio­ne con la nuova versione del pro­to­col­lo Internet IPv6. Il suo utilizzo prin­ci­pa­le consiste nella ri­tra­smis­sio­ne degli indirizzi IPv6 in indirizzi MAC validi, i quali stanno alla base degli indirizzi hardware del di­spo­si­ti­vo in uso. Nell’IPv4 questa funzione è ancora assunta dall’Address Re­so­lu­tion Protocol (ARP). Tutti gli indirizzi in­di­vi­dua­ti vengono salvati come in­for­ma­zio­ni nella Neighbor Cache. Questa cache informa l’utente della rete non solo sugli indirizzi locali dei client vicini, ma piuttosto fornisce anche in­for­ma­zio­ni ag­giun­ti­ve ne­ces­sa­rie ad esempio per il controllo della rag­giun­gi­bi­li­tà. Inoltre, come già accennato, il NDP è cor­re­spon­sa­bi­le anche per il processo di at­tri­bu­zio­ne del gateway standard. Con l’aggiunta del Router Ad­ver­ti­se­ment Protocol (RA) si possono stabilire anche il router standard e i prefissi di rete validi – due parametri ele­men­ta­ri della con­fi­gu­ra­zio­ne di rete. Infine il pro­to­col­lo di rete serve anche allo scambio di dati all’interno di una rete, anche come pro­to­col­lo di supporto per la con­fi­gu­ra­zio­ne dinamica degli indirizzi. Ci si riferisce a questo processo anche come Stateless Automatic Address Con­fi­gu­ra­tion (SLAAC).

Come funziona il NDP?

Ogni di­spo­si­ti­vo che ricorre al Neighbor Discovery Protocol per la co­mu­ni­ca­zio­ne all’interno della rete, am­mi­ni­stra au­to­no­ma­men­te la propria Neighbor Cache, o cache dei vicini. All’interno di questa cache sono elencati tutti i di­spo­si­ti­vi della rete a esso co­no­sciu­ti e quindi iden­ti­fi­ca­bi­li per mezzo dei loro univoci indirizzi di di­spo­si­ti­vo (MAC). Così facendo è possibile stabilire se l’indirizzo in memoria ap­par­tie­ne a un semplice client o se al contrario a un router. La Neigbor Cache non è tuttavia l’unica, piuttosto è una di quattro memorie in­ter­me­dia­rie che servono al fun­zio­na­men­to del pro­to­col­lo NDP. Le tre altre com­po­nen­ti, che allo stesso modo vengono uti­liz­za­te se­pa­ra­ta­men­te da ogni di­spo­si­ti­vo, sono le seguenti:

  • Cache delle de­sti­na­zio­ni: questa cache raccoglie dati riguardo a tutti gli host della rete ai quali sono già stati inviati dei pacchetti dati. Ognuna di queste im­mis­sio­ne dati rimanda tramite link a un indirizzo contenuto all’interno della Neighbor Cache, il quale deve essere uti­liz­za­to come prossimo Hop (salto) al momento dell’invio di pacchetti dati all’host di de­sti­na­zio­ne de­si­de­ra­to.
  • Lista dei prefissi: nella cache con­te­nen­te la lista dei prefissi vengono gestititi tutti i prefissi utili per la rete in cui si trova il client. Tale lista è da una parte ne­ces­sa­ria perché supporta l’IPv6 Mul­tho­ming, ovvero la rag­giun­gi­bi­li­tà della rete at­tra­ver­so due provider distinti, e dall’altra permette la sud­di­vi­sio­ne dell’Address Space in vari prefissi. Grazie ai record in questa cache il NDP ga­ran­ti­sce che l’host di de­sti­na­zio­ne si trovi nella stessa sottorete. Ogni prefisso, eccezione fatta per l’indirizzo MAC (anche Link Layer Address), possiede una durata di validità pre­sta­bi­li­ta, così che la cache sia sempre ag­gior­na­ta.
  • Lista dei router: la lista dei router di default raccoglie tutti i router co­no­sciu­ti che entrano re­go­lar­men­te in contatto con il di­spo­si­ti­vo. Ogni record all’interno di questa lista è collegato con un record all’interno della cache dei vicini. Il fatto che siano elencati solamente i router attivi lo si deve al fatto che per ognuno di essi viene definito un tempo ultimo. L’esten­sio­ne o il rinvio di tale scadenza avviene solo ri­chia­man­do il router in questione.

Per creare le varie cache per il NDP si utilizza un altro pro­to­col­lo di Internet, co­no­sciu­to come ICMPv6 (“Internet Control Message Protocol for the Internet Protocol Version 6”).

I cinque tipi di ICMPv6 sui quali si basa il NDP

Nell’attuale versione della famiglia dei pro­to­col­li di Internet l’ICMPv6 serve so­li­ta­men­te come tra­smet­ti­to­re delle co­mu­ni­ca­zio­ni di avviso o di errore, ma viene preso anche in con­si­de­ra­zio­ne dal Neighbor Discovery Protocol sotto forma di cinque diversi tipi di ICMPv6. In base al tipo vengono uti­liz­za­ti diversi messaggi tramite l’aiuto dei quali prendono forma le cache e le liste contenute al loro interno.

Tipo 134: Router Ad­ver­ti­se­ment

A in­ter­val­li regolari i router mandano dei co­sid­det­ti Router Ad­ver­ti­se­ment – messaggi ICMPv6 del tipo 134 – con lo scopo di informare gli utenti della rete della loro presenza. Tra le altre cose essi con­di­vi­do­no le loro in­for­ma­zio­ni di routing e i parametri necessari per la con­fi­gu­ra­zio­ne au­to­ma­ti­ca dell’IP. Di norma l’obiettivo del messaggio è l’indirizzo multicast standard “ff02::01”, at­tra­ver­so il quale ci si rivolge a tutti gli host nel campo di ap­pli­ca­zio­ne rilevante. In questo modo essi ottengono anche l’indirizzo del router (gateway standard) e il prefisso globale. Qui di seguito vi mostriamo lo schema che segue un Routing Ad­ver­ti­se­ment:

Di norma questo tipo di messaggio ha una lunghezza di 128 bit, con la pos­si­bi­li­tà di ag­giun­ge­re ulteriori bit per le opzioni. Come opzioni valide sono di­spo­ni­bi­li gli indirizzi MAC del router, i dati riguardo alla di­men­sio­ne massima di un pacchetto (“Maximum Tran­smis­sion Unit”), così come tutte le in­for­ma­zio­ni di prefisso rilevanti.

Il campo “Tipo” viene impostato su 134, il campo “Codice” sempre su 0 (zero). A seguire ci sono 16 bit per il Checksum ICMP e in­for­ma­zio­ni per un totale di 8 bit riguardo al limite dei salti, che ogni stazione dovrebbe adottare per i propri pacchetti, valore con­si­glia­to dal router.

Inoltre seguono dei singoli bit che for­ni­sco­no in­for­ma­zio­ni riguardo a:

  • Se gli indirizzi IP possono essere adottati tramite un DHCPv6 dinamico (M)
  • E se altre in­for­ma­zio­ni di indirizzo possono essere adottate at­tra­ver­so il DHCPv6 dinamico (O).

Il campo “Riservato” rimane inu­ti­liz­za­to e viene ignorato dal de­sti­na­ta­rio. Inoltre il Router Ad­ver­ti­se­ment contiene dati numerici riguardo:

  • Il tempo, in secondi, che un router può essere mantenuto nella lista dei router (tempo di vita del router, 16 bit, valore massimo 65535);
  • Il tempo, in mil­li­se­con­di, di quanto debba rimanere di­spo­ni­bi­le un indirizzo nella cache dei vicini una volta stabilita la rag­giun­gi­bi­li­tà (tempo di rag­giun­gi­bi­li­tà; 32 bit, massimo 50 giorni);
  • Così come quanto bisogna aspettare prima che venga rinviato un messaggio Neighbor So­li­ci­ta­tion (tempo di ri­tra­smis­sio­ne, 32 bit).

Tipo 133: Router So­li­ci­ta­tion

I Router So­li­ci­ta­tion sono dei messaggi at­tra­ver­so i quali un host può esortare tutti i router della rete a inviare i Router Ad­ver­ti­se­ment pre­ce­den­te­men­te men­zio­na­ti. Questi rispondo poi a loro volta con un messaggio di tipo 134, destinato o esclu­si­va­men­te all’host re­spon­sa­bi­le della richiesta (unicast) o a tutti i membri della rete (multicast). Ad esempio, nel caso di una nuova con­nes­sio­ne, grazie all’utilizzo di questi tipi di messaggi un host non deve attendere la co­mu­ni­ca­zio­ne au­to­ma­ti­ca del router di rete. Questa tipologia di messaggi ICMPv6 è strut­tu­ra­ta nel seguente modo:

La struttura standard di un messaggio NDP ICMPv6 del tipo 133, prevede una lunghezza minima di 64 bit. Al campo “Tipo” viene assegnato il valore di Router So­li­ci­ta­tion 133, mentre “Codice” viene impostato su 0. Gli altri due campi ob­bli­ga­to­ri sono “Checksum” (16 bit) e “Riservato”, che deve rimanere inu­ti­liz­za­to, e che ha una lunghezza di 32 bit.

L’unica opzione che potete decidere se allegare al messaggio è l’indirizzo MAC del mittente.

Tipo 135: Neighbor So­li­ci­ta­tion

I client della rete inviano i messaggi di Neighbor So­li­ci­ta­tion, per scoprire l’indirizzo MAC dell’host di de­sti­na­zio­ne ed even­tual­men­te co­mu­ni­ca­re a loro volta il proprio indirizzo. I messaggi ICMPv6 di questo tipo possono co­mu­ni­ca­re coi di­spo­si­ti­vi sia tramite un invio multicast, nel caso in cui vogliano co­mu­ni­ca­re un indirizzo, o unicast, se al contrario lo scopo è uni­ca­men­te quello di testare la rag­giun­gi­bi­li­tà di un vicino.

Come tutti i tipi di messaggi ICMPv6 iniziano anche i Neighbor So­li­ci­ta­tion con una etichetta per la de­fi­ni­zio­ne del tipo di messaggio, in questo caso il “Tipo” ha il valore 135. Segue il codice con i suoi 8 bit, che va impostato sullo 0, e i 15 bit dell’Internet Control Message Protocol. Come per tutti gli altri messaggi già pre­sen­ta­ti, “Riservato” rimane vuoto.

Con 128 bit l’indirizzo IP de­sti­na­ta­rio, che non può essere un indirizzo multicast, co­sti­tui­sce la parte maggiore del messaggio; il quale ha in totale una lunghezza minima di 192 bit. Anche questo tipo di messaggio vitale per il Neighbor Discovery Protocol permette di indicare in aggiunta anche l’indirizzo MAC del mittente.

Tipo 136: Neighbor Ad­ver­ti­se­ment

L’invio di Neighbor Ad­ver­ti­se­ment da parte dei di­spo­si­ti­vi di rete è da un lato una reazione ai messaggi Neighbor So­li­ci­ta­tion, ovvero una reazione di risposta, e dall’altro servono per informare i membri di una rete riguardo ai cam­bia­men­ti in atto nella con­fi­gu­ra­zio­ne degli indirizzi. La struttura di tali messaggi è la seguente:

I primi 32/192esimi di bit del Neighbor Ad­ver­ti­se­ment seguono il tipico schema dei messaggi ICMPv6 come visto finora: con il valore 136 per il campo “Tipo” e 0 per il “Codice”, che col­le­zio­na­no 8 bit a testa, e i consueti 16 bit per la Checksum. Il codice prosegue con 3 bit singoli, per le seguenti com­po­nen­ti:

  • R: il bit legato a “R” sta­bi­li­sce se il messaggio viene inviato da un router.
  • S: se il messaggio contiene il bit di “S”, si tratta di una risposta a un Neighbor So­li­ci­ta­tion unicast, con la quale viene con­fer­ma­ta la rag­giun­gi­bi­li­tà alla com­po­nen­te della rete che ha inviato la domanda. In risposta a richieste multicast o a Neighbor Ad­ver­ti­se­ment da voi stessi prodotti, questo bit non può essere impostato.
  • O: il campo “o” ordina al de­sti­na­ta­rio del messaggio di so­vra­scri­ve­re il record presente nella cache.

Gli ultimi 29 bit sono riservati al modello già pre­sen­ta­to: rimangono quindi inu­ti­liz­za­ti e gli viene at­tri­bui­to il valore 0, venendo così ignorati dal de­sti­na­ta­rio. L’indirizzo target con i suoi 128 bit di lunghezza rap­pre­sen­ta la maggior parte del messaggio: si tratta o di un indirizzo IP, dal quale viene richiesto il Neighbor Ad­ver­ti­se­ment, o di un indirizzo per il quale deve essere spe­ci­fi­ca­to un nuovo indirizzo MAC. Al­tri­men­ti come opzione il router può nominare il proprio indirizzo: questo è ob­bli­ga­to­rio quando si tratta di una risposta a una richiesta multicast.

Tipo 137: Re­di­re­zio­ne (Redirect)

router hanno la pos­si­bi­li­tà di informare la stazione inviante riguardo a un salto diverso, ma migliore, verso l’indirizzo target de­si­de­ra­to. A questo scopo essi inviano i messaggi NDP ICMPv6 Redirect, che si con­trad­di­stin­guo­no per il seguente schema:

Con una lunghezza minima di 320 bit, i Redirect sono i messaggi ICMPv6 di maggiore di­men­sio­ne tra quelli che servono per il fun­zio­na­men­to del Neighbor Discovery Protocol. La struttura tipica co­sti­tui­ta dalla suc­ces­sio­ne di “Tipo” (valore: 137), “Codice” (0), “Checksum” e un campo “Riservato” non uti­liz­za­to (32 bit), è seguita dall’indirizzo del salto con­si­glia­to e infine dall’indirizzo per il quale è con­si­glia­ta la modifica, per un totale di 256 bit (128 ciascuno). Even­tual­men­te il pacchetto del messaggio può contenere l’indirizzo MAC del target così come l’header del pacchetto deviato.

Pa­no­ra­mi­ca dei compiti e delle pos­si­bi­li­tà del NDP

Sono molti i mec­ca­ni­smi di caching e i mezzi di co­mu­ni­ca­zio­ne del Neighbor Discovery Protocol in com­bi­na­zio­ne con l’Internet Control Message Protocol. I suc­ces­si­vi scenari relativi al NDP chia­ri­sco­no la coo­pe­ra­zio­ne e il fun­zio­na­men­to di entrambi questi pro­to­col­li:

  • Ri­co­no­sce­re router e prefisso di rete: tutti i router di una rete tra­smet­to­no per multicast i Router Ad­ver­ti­se­ment a tutti i membri della rete a in­ter­val­li regolari. Tra le altre cose questi con­ten­go­no in­for­ma­zio­ni come l’indirizzo, il prefisso di rete e il routing, che servono per la creazione della Default Router List così come per la Prefix List. In base a questi dati i client co­mu­ni­ca­no perciò gli Standard Gateway e le maschere di sottorete. Essendo che tutti i record di­spon­go­no di una durata di validità limitata, solo i router realmente attivi rimangono re­gi­stra­ti. Gli Ad­ver­ti­se­ment dei router possono essere anche ottenuti for­za­ta­men­te grazie all’utilizzo dei router So­li­ci­ta­tion.
  • In­di­vi­dua­re i parametri im­por­tan­ti per la tra­smis­sio­ne dei pacchetti: all’evenienza i Router Ad­ver­ti­se­ment possono contenere anche in­for­ma­zio­ni riguardo a quali parametri debbano essere uti­liz­za­ti per la tra­smis­sio­ne dei pacchetti da parte dei client facenti parte della rete. I dati contenuti possono essere molto concreti, come le di­men­sio­ni massime del pacchetto, ma anche parametri Internet di ben più ampia portata come il limite di salti stabilito per i pacchetti in uscita.
  • Stabilire il salto suc­ces­si­vo: se deve essere inviato un pacchetto, il pro­to­col­lo NDP verifica se la cache di de­sti­na­zio­ne contenga già un record dati per l’host di de­sti­na­zio­ne. Se questo non dovesse essere il caso, il pro­to­col­lo comunica il prossimo salto in base alle in­for­ma­zio­ni presenti nella lista dei prefissi e in quella dei router di default. Suc­ces­si­va­men­te la cache di de­sti­na­zio­ne viene ag­gior­na­ta in base alle nuove in­for­ma­zio­ni ottenute, così che sia di­spo­ni­bi­le sin da subito nel caso di una nuova richiesta. Se all’interno della cache dei vicini non c’è nessun record dati cor­ri­spon­den­te, verrà allora creato in au­to­ma­ti­co e seguirà la ri­so­lu­zio­ne dell’indirizzo.
  • Ri­so­lu­zio­ne degli indirizzi IP e MAC: al fine di riuscire a iden­ti­fi­ca­re l’indirizzo MAC di un dato host all’interno di una rete, l’host ottiene una Neighbor So­li­ci­ta­tion tramite IPv6-Multicast presso il suo specifico indirizzo multicast. A questa unica com­bi­na­zio­ne di indirizzi può ri­spon­de­re uni­ca­men­te l’host tramite l’invio di un messaggio Neighbor Ad­ver­ti­se­ment con­te­nen­te l’indirizzo MAC, che viene perciò salvato dal cliente di origine nella Neighbor Cache. In questo modo il Neighbor Discovery Protocol viene uti­liz­za­to sia per iden­ti­fi­ca­re i vicini che il router.
  • De­ter­mi­na­re l’ir­rag­giun­gi­bi­li­tà di un vicino: l’attualità di tutti gli indirizzi MAC salvati nella Neighbor Cache deve essere re­go­lar­men­te con­trol­la­ta. Fin quando vengono inviati dati TCP/IP o conferme di ri­ce­vi­men­ti TCP/IP da parte di un indirizzo presente nella cache, questo viene chia­ra­men­te con­si­de­ra­to attivo e l’host associato rag­giun­gi­bi­le. Se invece è da tempo che non avviene nessuno scambio di dati con il di­spo­si­ti­vo in­te­res­sa­to e la durata di validità di un record è scaduta nel frattempo, allora questo viene segnato come desueto. Per ve­ri­fi­ca­re però che sia ef­fet­ti­va­men­te così, e che quindi l’host non sia rag­giun­gi­bi­le, viene inviato un pacchetto dati all’indirizzo salvato in memoria. Se non si ottiene risposta, viene fatto un ultimo tentativo tramite l’Unicast Neighbor So­li­ci­ta­tion. Se anche questo test conferma l’ir­rag­giun­gi­bi­li­tà, il record viene eliminato dalla cache dei vicini.
  • Ri­co­no­sce­re gli indirizzi doppi: se un di­spo­si­ti­vo ha ottenuto un indirizzo per au­to­con­fi­gu­ra­zio­ne, il NDP lo clas­si­fi­ca ini­zial­men­te come “tentative”, ovvero come prov­vi­so­rio. Infatti per far sì che l’indirizzo diventi veramente effettivo deve prima essere com­pro­va­ta la sua unicità. A questo scopo il cliente di rete appena collegato invia un Neighbor So­li­ci­ta­tion all’indirizzo tem­po­ra­neo, con un indirizzo mittente a sua volta tem­po­ra­neo e non specifico. Se un altro host utilizza già l’indirizzo, allora esso ri­spon­de­rà per mezzo di un messaggio Neighbor Ad­ver­ti­se­ment a tutti gli indirizzi multicast. In questo modo anche il client che ha inviato la richiesta viene a co­no­scen­za del nuovo indirizzo.
  • Informare at­tra­ver­so le opzioni redirect: con il messaggio redirect il Neighbor Discovery Protocol fornisce ai router la pos­si­bi­li­tà di ot­ti­miz­za­re il percorso dei pacchetti dati verso l’host di de­sti­na­zio­ne de­si­de­ra­to. Come men­zio­na­to pre­ce­den­te­men­te, questi possono uti­liz­za­re l’ICMPv6 tipo 137 per fornire consigli per salti migliori e più adatti al percorso, i quali vengono poi raccolti nella cache di de­sti­na­zio­ne. 

Come sot­to­por­re a un controllo la Neighbor Cache sul vostro sistema

Tutti i sistemi operativi moderni, Windows, macOS, Linux, iOS o Android, sup­por­ta­no l’IPv6 e sono quindi nella con­di­zio­ne di disporre delle pos­si­bi­li­tà di NDP nelle reti Ethernet. At­tra­ver­so il comando apposito potete ri­chia­ma­re in ogni momento la cache dei vicini creata per il vostro di­spo­si­ti­vo.

Ad esempio con Windows viene uti­liz­za­to il programma netsh (network shell) e il seguente comando per elencare i vostri vicini di rete:

netsh interface ipv6 show neighbors

Con la maggior parte delle di­stri­bu­zio­ni Linux si utilizza il tool iproute2 e il seguente comando per ottenere la presa di visione della Neighbor Cache.

ip -6 neigh

Con macOS e le altre di­stri­bu­zio­ni BSD ri­chia­ma­te i dati salvati nella cache nel seguente modo:

ndp -a
Vai al menu prin­ci­pa­le