Jedním z dobře známých problémů počítačových sítí je zjištění linkové adresy partnera. Počítač potřebuje poslat někomu data, zná jeho IP adresu a ví, že spolu sídlí v jedné lokální síti (řekněme Ethernetu). Aby mu však mohl odeslat paket, potřebuje znát právě cílovou ethernetovou adresu.
IPv4 k tomuto účelu používá samostatný protokol nazvaný Address Resolution Protokol (ARP).
V zásadě funguje tak, že odesílající rozešle na všesměrovou IP adresu 255.255.255.255 (všechny stroje v lokální síti) ARP dotaz „Kdo z vás má IP adresu XY?“
Šťastný vlastník mu pak odpoví „To jsem já a moje ethernetová adresa je HyChyKyRyDyTyNy.“
U IPv6 se rozhodli dotyčný mechanismus definovat přímo jako jednu ze základních součástí IP. A když už byli v té revoluci, rovnou vytvořili obecnější nástroj, který kromě hledání linkových adres řeší ještě celou řadu dalších problémů. Výsledek nazvali objevování sousedů (Neighbor Discovery, ND). Slouží k následujícím účelům:
-
zjišťování linkových adres uzlů ve stejné lokální síti,
-
rychlé aktualizace neplatných položek a zjišťování změn v linkových adresách,
-
hledání směrovačů,
-
přesměrování,
-
zjišťování prefixů, parametrů sítě a dalších údajů pro automatickou konfiguraci adresy,
-
ověřování dosažitelnosti sousedů,
-
detekce duplicitních adres.
Vše je definováno v RFC 4861: Neighbor Discovery for IP version 6. Pro svou činnost využívá pěti typů ICMP zpráv, dvě další k nim přidává zabezpečení nazvané SEND. Jejich přehled najdete v tabulce 1 V této kapitole popíši jen aspekty související se zjišťováním linkových adres a testováním dosažitelnosti. Automatické konfiguraci (do níž spadá většina ostatních součástí objevování sousedů) věnuji samostatnou kapitolu.
| Objevování sousedů | |
|---|---|
výzva směrovači |
router solicitation |
ohlášení směrovače |
router advertisement |
výzva sousedovi |
neighbor solicitation |
ohlášení souseda |
neighbor advertisement |
přesměrování |
redirect |
SEND |
|
žádost o certifikační cestu |
certification path solicitation |
ohlášení certifikační cesty |
certification path advertisement |
Hledání linkových adres
Zjišťování linkové adresy na základě IP se velmi podobá klasickému ARP. Změnily se vlastně jen názvy a především adresa, na kterou tazatel zasílá svůj dotaz.
Pro potřeby objevování sousedů byl definován hlouček skupinových adres, na něž se rozesílají dotazy.
Všechny mají společný prefix:
ff02::1:ff00:0/104
Uzel, který hledá linkovou adresu pro určitou IPv6 adresu, vezme posledních 24 bitů z hledané IP adresy a připojí je za výše uvedený prefix. Tím získá skupinovou adresu, na kterou zašle svůj dotaz. Takže pokud například hledá linkovou adresu pro:
2001:db8:1:1:022a:fff:fe 32:5ed1
bude se ptát na skupinové adrese:
ff02::1:ff 32:5ed1
V terminologii IPv6 se takové adrese říká adresa pro vyzývaný uzel (solicited node address). Skutečnost, že z hledané adresy se přebírá jen spodních 24 bitů, původně zmenšovala počet skupin, v nichž každý počítač musí být členem. Dokud se pro identifikátor rozhraní používalo modifikované EUI-64, býval stejný pro více různých prefixů. Pro všechny pak stačilo členství v jedné skupině. Moderní identifikátory rozhraní různých adres stejného stroje jsou ovšem odlišné, takže je nutno vstoupit do několika skupin.
Aby objevování sousedů fungovalo, musí počítač při inicializaci IP pro síťové rozhraní vstoupit do všech skupin odpovídajících adresám vyzývaného uzlu pro všechny adresy přidělené rozhraní. Závěrečné tři bajty jsou ovšem dostatečně dlouhé na to, aby ve skupině pro vyzývaný uzel byl zpravidla každý sám. I ve velmi velkých sítích najdete jen vzácně dvojice karet se shodnou hodnotou poslední trojice bajtů. To v praxi znamená, že při hledání linkové adresy nejsou zbytečně obtěžováni ostatní a zpravidla se osloví jen samotný její vlastník.
Pokud tedy počítač (dále mu budeme říkat „vyzyvatel“) shání linkovou adresu jiného, u nějž zná pouze IP adresu, postupuje následovně:
-
Z cílové IP adresy vytvoří výše popsaným postupem skupinovou adresu vyzývaného uzlu.
-
Na ni pošle speciální typ ICMP zprávy nazvaný Výzva sousedovi.
-
Pokud je počítač s danou IP adresou aktivní, bude zapojen do příslušné skupiny a výzvu obdrží. Reaguje na ni Ohlášením souseda, které pošle vyzyvateli a vloží do něj informace o své linkové adrese.
Každý uzel by si měl udržovat interní datovou strukturu nazvanou cache sousedů (neighbor cache), ve které má uloženy jejich linkové adresy. Na základě příchodu ohlášení souseda si do této cache zanese novou položku s jeho IP adresou a odpovídající linkovou adresou.

Formát Výzvy sousedovi znázorňuje obrázek 1. V podstatě obsahuje jedinou informaci – Hledanou adresu (Target address), k níž odesilatel výzvy shání linkovou. K datagramu může připojit volbu, která ohlašuje jeho vlastní linkovou adresu, aby adresát výzvy rovnou věděl, kam má odpovědět.

Na obrázku 3. najdete formát ohlášení souseda. Opět nese především IP adresu, které se dotyčné ohlášení týká (ať už bylo vyžádané nebo ne – viz níže). K datagramu se připojuje volba sdělující linkovou adresu, jež k ní náleží. Kromě toho obsahuje tři příznaky: R (Router) signalizuje, že odesilatel ohlášení je směrovač. S (Solicited) nese informaci, zda ohlášení bylo vyžádáno výzvou sousedovi či nikoli. A konečně O (Override) určuje, zda tato informace má přepsat případné dosavadní informace spojené s danou adresou.

Uzel může zaslat i nevyžádané ohlášení souseda.
Tento přístup se používá v situacích, kdy uzel ví, že došlo ke změně jeho linkové adresy a že by bylo záhodno tuto informaci sdělit ostatním.
V takovém případě zašle na skupinovou adresu pro všechny uzly na lince (ff02::1) několik ohlášení souseda, v nichž sdělí svou novou linkovou adresu.
Pokud některý z uzlů má ve své cache sousedů položku s danou IP adresou, aktualizuje si ji. Ostatní nevyžádané ohlášení souseda ignorují (jelikož nemají tuto IP adresu v cache sousedů, s odesilatelem v poslední době nekomunikovali, proto je jeho linková adresa nezajímá). Dlužno podotknout, že tento mechanismus aktualizace není zaručený a je chápán pouze jako nástroj pro zvýšení efektivity a rychlosti šíření změn. Základním nástrojem pro ověřování platnosti linkových adres je:
Detekce dosažitelnosti souseda
Heslo „důvěřuj, ale prověřuj“ je notoricky známé. IPv6 se jím řídí také. V případě práce se sousedy se konkrétně projevuje v tom, že uzel neustále aktivně sleduje stav dosažitelnosti sousedů, se kterými komunikuje.
K potvrzení, že soused je dosažitelný, poslouží dva základní mechanismy. Buď IP dostává zprávy od vyšší vrstvy (např. TCP), že komunikace zdárně pokračuje, a tudíž soused funguje. Pokud takovéto potvrzení nemá, zbývá ještě druhá možnost – ověřit si dosažitelnost vlastními silami. Zašle výzvu sousedovi a pokud dorazí jeho ohlášení, je vše v pořádku.
Základem pro zjišťování nedosažitelnosti sousedů jsou různé stavy, které se přidělují položkám v cache sousedů. Jejich shrnutí se stručnými popisy obsahuje tabulka 2 Obrázek pak znázorňuje události, které vedou ke změně položky. Tento algoritmus bude popsán v následujících odstavcích.
| nekompletní (incomplete) | linková adresa zatím není známa |
|---|---|
dosažitelná (reachable) |
cíl je považován za dosažitelný |
prošlá (stale) |
prošla platnost, ale pro cíl nemáme nic k odeslání |
odložená (delay) |
prošla platnost, čekáme, zda vyšší vrstva potvrdí dosažitelnost |
testovaná (probe) |
právě se testuje |

Stav nekompletní je velmi dočasný a položka jím projde pouze po krátkou dobu v samém začátku své existence. Znamená, že počítači byla odeslána výzva sousedovi s cílem zjistit jeho linkovou adresu a dosud nedorazila odpověď. Jakmile dojde, přejde položka do stavu dosažitelná. Pokud by snad ohlášení souseda nedorazilo, znamená to, že dotyčný soused momentálně není funkční a položka bude z cache sousedů odstraněna.
Optimálním stavem je, je-li položka považována za dosažitelnou. To znamená, že dosažitelnost souseda byla nedávno potvrzena a nemusíme si s ní dělat těžkou hlavu. Trvanlivost tohoto stavu je časově omezena. Doba, po kterou lze položku považovat za dosažitelnou, je jedním z parametrů sítě a připojeným uzlům ji oznamuje směrovač ve svém ohlášení
Pokud od posledního potvrzení dosažitelnosti uplyne tato doba, položka bude převedena do stavu prošlá, ovšem jinak se nic neděje. Uzel se začne starat až v okamžiku, kdy je třeba na danou IP adresu odeslat nějaká data. Provede to stejně, jako by položka byla normálně dosažitelná, ale její stav nyní změní na odložená. Tento stav v podstatě říká: „Dosažitelností tohoto souseda si nejsem jist. Před chvilkou jsem mu ale odeslal data a než se pustím do vlastního ověřování, chvilku počkám, jestli mi ji nepotvrdí vyšší vrstva.“
Ve stavu odložená položka nikdy nezůstane dlouho. Buď vyšší vrstva potvrdí, že dostala odpověď a cíl je tudíž dosažitelný (položka se vrátí do stavu dosažitelná). Druhou možností je, že během daného intervalu toto potvrzení nepřijde. V takovém případě musí IP vrstva dosažitelnost ověřit sama. Odešle danému cíli výzvu sousedovi a stav položky změní na testovaná. Odpoví-li, je vše v pořádku a položka se může vrátit do stavu dosažitelná.
Jestliže se odpovědi nedočká, výzvu několikrát zopakuje. Pokud soused neodpoví, je považován za nedosažitelného a jeho položka bude odstraněna z cache sousedů.
Inverzní objevování sousedů
Inverzní objevování sousedů (Inverse Neighbor Discovery, IND) má přesně opačný cíl než to klasické. Řeší situaci, kdy počítač sice zná linkovou adresu svého souseda, ale nezná jeho IPv6 adresu. Původně bylo vyvinuto především pro Frame Relay sítě, kde k takovým stavům dochází, nicméně autoři nevylučují jeho použití i v jiném prostředí s podobnými vlastnostmi. Jeho definici najdete v RFC 3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification.
Funguje velmi jednoduše. Stroj, který se chce dozvědět sousedovu adresu, mu prostřednictvím ICMP pošle Výzvu (viz obrázek 5.)
Z pohledu IP ji sice posílá na skupinovou adresu pro všechny uzly na lince ff02::1, ale na linkové úrovni ji adresuje pouze na linkovou adresu cílového stroje (kterou zná).
Odesilatel k výzvě povinně musí přiložit volby s oběma linkovými adresami (zdrojovou i cílovou) a může přidat volby se svými IPv6 adresami pro dané rozhraní a MTU linky.
Vyzvaný počítač reaguje Ohlášením, jehož základní formát se (až na typ zprávy) velmi podobá výzvě. Tentokrát je povinné přibalit volbu se zdrojovou linkovou adresou ohlášení a také seznam IPv6 adres pro odpovídající rozhraní. Navíc může přidat i volbu s MTU linky. Své Ohlášení posílá dotázaný protokolem ICMP na adresu vyzyvatele. Ten si obdržené informace zanese do cache sousedů a může je dále používat.