Vrstvy ISO/OSI a teorie síťování
L3 - IPv4 a IPv6
ARP a NDP
Funkci protokolu ARP jsme vysvětlili v podstatě dostatečně už o dva odstavce výše tím, že v okamžiku odesílání IP datagramu přes multi-access L2, tedy například přes Ethernet, potřebujeme znát L2 adresu, která odpovídá IP adrese, o které víme, že je dostupná přímo přes danou L2 konektivitu.
ARP je protokol velmi jednoduchý - potřebujeme znát MAC adresu pro danou IP adresu a tak se zkrátka zeptáme všech stanic v daném ethernetovém segmentu broadcastem. Stanice, která danou adresu má, nám odpoví (unicastem). ARP dotazy i odpovědi se posílají přímo v ethernetových rámcích.
Záznamy v ARP cache mají omezenou životnost a po jejím vypršení se záznam smaže. Pokud bude po smazání záznam znovu zapotřebí, tak se musíme zeptat znovu ARP dotazem. Doba životnosti záznamů se dá zpravidla nastavit, nicméně default hodnota se hodně liší na různých operačních systémech. V Linuxu to je maličko složitější, protože Linux se snaží minimalizovat počet zbytečných ARP dotazů a zároveň pružně reagovat na situaci, kdy informace v ARP cache přestane být pravdivá. Detaily jsou popsány v https://man7.org/linux/man-pages/man7/arp.7.html. S jistou mírou zjednodušení se dá ale říct, že v Linuxu bude životnost neplatného záznamu v řadu několika minut.
Naproti tomu Cisco IOS a i novější Cisco systémy mají ARP timeout v řádu hodin. To může být někdy překvapení, pokud založíme strategii migrace IP adres z jednoho serveru na jiný na předpokladu, že ARP záznamy vyprší za pár minut a najednou to není pravda. Má to řešení v podobě rozeslání „nevyžádané“ ARP odpovědi - gratuitous ARP.
Pro IPv6 byl vytvořen zcela nový protokol NDP, který je svojí funkcí podobný, avšak je mnohem elegantnější. NDP dotazy se nerozesílají pouhým broadcastem jako payloady ethernetových rámců. Místo toho je NDP jen typem zpráv protokolu ICMPv6 a místo ethernetového broadcastu se posílají NDP requesty IPv6 multicastem. Na první pohled to vypadá složitě, nicméně je to mnohem elegantnější, než ARP, protože IPv6 zavádí linkové adresy - IPv6 adresy odvozené od MAC adresy pomocí prefixu fe80::/64 a mechanismu EUI-64 (spodních 64 bitů IPv6 adresy se na ethernetovém rozhraní odvodí z jeho ze 48-bitové MAC adresy a přidá se konstantní padding ff:fe). Tuto linkovou adresu má interface jakmile se zapne a tato adresa je z definice unikátní v rámci ethernetového segmentu, protože MAC adresa musí být unikátní. Když by náhodou došlo ke kolizi MAC adres v ethernetovém segmentu, nebude fungovat pro kolidující stanice nejen protokol NDP, ale ani ARP a vlastně skoro nic v obou protokolech IP. O multicastu se teď nebudeme rozepisovat, ale je dobré o něm vědět, že uzel sítě může být členem mnoha multicastových skupin. Ke členství se musí přihlásit (protokolem IGMP pro IPv4 resp. MLD pro IPv6) a switche v dané síti mohou přihlašování do skupin využívat k optimalizaci multicastového trafficu, tedy že neposílají multicastové rámce na porty, kde není přihlášen odběr dané skupiny. V případě, že switche IGMP resp. MLD neakceptují, tak se k multicastu chovají, jako by to byl broadcast. Pro NDP se používá ještě trik navíc: NDP nemá jednu konkrétní multicastovou adresu (skupinu), kterou by oslovovala všechny stanice v síti, ale používá takzvanou Solicited-node multicast address, kdy se do multicastové adresy z prefixu ff02::1:ff00:0/104 zakóduje část adresy, na kterou se dotazujeme. Tím se dá ještě urychlit zpracování dotazů na straně stanic, které dotaz dostanou, ale nejsou adresátem. Pro detaily přidávám odkazy na relevantní stránky na Wikipedii. Bohužel, mnohé z nich nemají české heslo a tak nezbývá, než Wikipedie anglická.
Odkazy:
- https://wiki.wireshark.org/Gratuitous_ARP
- https://en.wikipedia.org/wiki/Address_Resolution_Protocol
- https://cs.wikipedia.org/wiki/ICMPv6
- https://cs.wikipedia.org/wiki/Internet_Group_Management_Protocol
- https://en.wikipedia.org/wiki/Multicast_Listener_Discovery
- https://en.wikipedia.org/wiki/Solicited-node_multicast_address