Na počátku 90. let bylo, hlavně kvůli nedostatku IP adres, rozhodnuto o vývoji náhrady za IPv4. Protokol byl pojmenován (IP Next Generation) IPng a později přejmenován na IPv6. Hlavní důvodem byl růst počtu počítačů připojených do Internetu a s tím spojený nedostatečný adresní prostor. V současnosti se nedostatek adres často řeší pomocí NAT (Network Adress Translation). Kdy se pakety pocházející z interní sítě upravují, aby navenek vykazovaly jedinou zdrojovou adresu. Tak se přiřadí celé podsíti jedna jediná IP adresa. Počítače uvnitř podsítě tak nejde přímo adresovat z Internetu.
Další důvody pro IPv6:Adresa v IPv6 má 128 bitů. Počet adres je tedy teoreticky cca 3,4 * 1038 (340 282 366 920 938 463 463 374 607 431 768 211 456). Na jeden m2 naší planety jich připadá zhruba 6,67 * 1027. Zapisuje se jako 8 čtveřic hexadecimálních čísel oddělených dvojtečkou.
Zkracování zápisuHlavička paketu má pevnou délku 40 B. Na rozdíl od IPv4 ubyl kontrolní součet, identifikace paketu, příznaky fragmentace a fragment offset. Paket byl zjednodušen, aby se směrovač měl co nejméně práce. Implementováno tzv. řetězení hlaviček - položka "Next header". Obsahuje typ hlavičky, která následuje. Lze použít rovnou TCP nebo UDP, což znamená, že už žádné další hlavičky nejsou. Každá z rozšiřujících hlaviček má rovněž položku "Next header". Takto se hlavičky řetězí. Hlavičky, které by mohly směrovač zajímat, by měly být ze začátku.
název anglicky | název česky | bitů | komentář |
---|---|---|---|
Version | verze protokolu | 4 | vždy IPv6 |
Traffic class | třída provozu | 8 | analogie Type of service u IPv4 |
Flow label | indikace toku | 20 | identifikuje proud datagramů od jednoho odesilatele ke stejnému cíli se stejnými vlastnostmi |
Payload length | délka paketu | 16 | |
Next header | další hlavička | 8 | typ další hlavičky, co je za základní hlavičkou |
Hop limit | limit na počet skoků | 8 | analogie TTL u IPv4 |
Source address | zdrojová adresa | 128 | |
Destination address | cílová adresa | 128 | |
Data | data |
Další hlavičky zajišťují fragmentaci (Fragment header), autentizaci (Authentication Head) a šifrování (Encapsulating Security Payload), směrování předepsanou cestou (Routing header) atd.
Každý počítač má svou domácí síť a svoji IP adresu. V době nepřítomnosti ho zastupuje tzv. domácí agent, což je směrovač v domácí síti. Kterému mobilní počítač oznamuje změněnou adresu (změna vazby - musí být autentifikovaná). V připadě pokusu o komunikaci s mobilním počítačem, mu domácí agent přepošle požadavek a další komunikace už probíhá přímo mezi komunikujícími stranami.
Převod IP adres na linkové vrstvě zajišťuje protokol ARP. Nevýhoda je v přímo specifikovaná velikost linkové adresy (48 bitů). 24 bitů (indentifikace výrobce) a 24 (sériové číslo). To je použitelné jen nad Ethernetem. Řešení v IPv6: Každý linkový protokol má zobrazení svých adres do EUI-64 formátu. Řešení pro ethernet - MAC adresu: Doprostřed se vloží fffe a 7. nejvyšší bit se nastaví na 1 v případě globálně jednoznačné adresy nebo na 0 v případě lokálně jednoznačné adresy.
PříkladKonfigurace pomocí DHCPv6. Počítač pošle dotaz a DHCP server sdělí vše potřebné.
Bezstavová konfigurace
Funguje díky tzv. "neighbor discovery" (objevování sousedů). Každý směrovač v určitých intervalech rozesílá do sítě, k níž je připojen, základní informace o síti (Router Advertisement). Jde hlavně o prefixy dané sítě a info o tom, zda může sám sloužit jako default gateway, kam je schopen směrovat o jeho linkovou adresu. Počítač může při startu požádat o tyto informace, pomocí tzv. výzvy směrovači (Router Solicitation packet). K prefixu sítě, který takto obdrží, si připojí svoji adresu v upraveném EUI-64 formátu a adresa je na světě. Současně si také vytvoří tabulku implicitních směrovačů. Tohle má však dva nedostatky, jednak k dané adrese neexistuje dopředný, ani reverzní záznam a druhak jaksi chybí info o DNS serverech.
Neighbor discovery také nahrazuje ARP/RARP užívaný u IPv4. Pokud chce počítač zjistit linkovou adresu jiného počítače na téže síti, pošle "Neighbour Solicitation packet". Jako odpověď dostane "Neighbour Advertisement", který obsahuje danou adresu. Funguje to tedy stejně jako ARP. Redirect packet je ekvivalentem ICMP redirect z IPv4. Poslední vymožeností je test, zda je počítač naživu. Pokud počítač vysílá pakety a nedostává žádné zpět, tak vyšle "Neighbor Solicitation packet". Pokud nedostane jako odpověď "Neighbor Advertisement", prohlásí daný počítač za mrtvý. Využívá se hlavně u směrovačů.
Implementace NDP (Neighbor discovery protokol). Běží na směrovači. Ke stažení na v6web.litech.org. Posílá "Router Advertisement" do sítě periodicky nebo když je vyzván stanicí pomocí "Router Solicitation". Součástí je i program radvdump, který slouží k výpisu příchozích "router advertisement".
-u <uživatel> # spouštění pod nerootovským uživatelem a jeho primární skupinou -t <adresář> # spouštění v chrootovaném adresářiPovolit přeposílání IPv6 paketů:
Linux: sysctl -w net.ipv6.conf.all.forwarding=1 FreeBSD: sysctl net.inet6.ip6.forwarding=1
/etc/radvd.conf --------------- interface eth0 { # kam posíláme info (rozhraní) AdvSendAdvert on; # povolení odesílání MinRtrAdvInterval 200; # minimalni interval, mezi vyslaním nevyžádaných RA (sekundy) MaxRtrAdvInterval 600; # maximální interval, mezi vyslaním nevyžádaných RA (sekundy) prefix 3ffe:ffff:0100:f101::/64 { # prefix sítě AdvValidLifetime 3600; # platnost adresy (sekundy) }; }; ---------------
sysctl -w net.ipv6.conf.all.accept_ra=0 sysctl -w net.ipv6.conf.all.accept_eth0=0 sysctl net.inet6.ip6.accept_rtadv=0
/proc/net/if_inet6 # podle existence tohoto souboru poznáme, zda je zakompiloavaná podpora IPv6 ifconfig <název_rozhraní> inet6 [add|del] <ipv6_adresa>/<délka_prefixu> route [add|del] inet6 default <adresa_brány>
options inet6 # musí být v jádře ifconfig <název_rozhraní> inet6 <ipv6_adresa>/<délka_prefixu> [eui64] [delete] route [add|del] inet6 default <adresa_brány>
iptables -I INPUT -p ipv6 -j ACCEPT
Dopředný překlad - AAAA záznamy. (adresa je 4x delší :-))
Reverzní překlad - pseudodomény ip6.int. (6bone) a ip6.arpa. (produkční):
V budoucnosti snad všechno v ip6.arpa..
Pozor: adresa se zapisuje pozpátku po jednotlivých číslicích oddělených tečkou. Nelze zkrátit.
V Bindu 9 existuje i DNAME, což je obdoba CNAME a A6 - umožňuje přidělování podle prefixů. Ale preferují se AAAA záznamy. A DNAME označeno jako depracted.
options { ... listen-on-v6 port 53 { any; }; };
6bone je testovací IPv6 síť. Síť začala jako virtuální s pomocí tunelování IPv6 nad IPv4 a postupně pomalu přechází k nativní IPv6 síti. Jejím hlavním účelem je testování standardů a implementací nového protokolu.
Slouží k přenosu IPv6 paketů přes IPv4 síť. Toho využívá například 6bone, pro spojování sítí, které na IPv6 už fungují nativně.
# Linux ip tunnel add cervidira mode sit remote 10.0.50.1 local 10.0.50.2 ttl 255 ip link set dev cervidira up ip addr add fec0:0:0:50::2/64 dev cervidira ip route add fec0:0:0:50::/64 dev cervidira ip tunnel show # ověříme správnost # FreeBSD ifconfig gif0 create ifconfig gif0 tunnel 10.0.50.1 10.0.50.2 ifconfig gif0 inet6 fec0:0:0:50::1/64 route add -inet6 default -interface gif0 ifconfig gif0 # ověříme správnost # /etc/rc.conf gif_interfaces="gif0" gifconfig_gif0="10.0.50.1 10.0.50.2" ipv6_ifconfig_gif0="fec0:0:0:50::1/64" ipv6_defaultrouter="fec0:0:0:50::2:/64" ipv6_gateway_enable="YES"
Dle POSIX 1003.1g. Nahrazuje gethostbyname(3) a getservbyname(3). Vrací nulu v případě úspěchu.
#include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *node, /* FQDN, textový zápis adresy IPvX */ const char *service, /* jméno podle /etc/services nebo čislo portu */ const struct addrinfo *hints, /* struktura addrinfo */ struct addrinfo **res); /* tady se uloží vysledek */ void freeaddrinfo(struct addrinfo *res); struct addrinfo { int ai_flags; /* příznaky v hints; dají se spojovat logickým součtem */ int ai_family; /* PF_INET či PF_INET6 */ int ai_socktype; /* SOCK_STREAM, SOCK_DGRAM, ... */ int ai_protocol; /* IPPROTO_TCP či SOCK_UDP */ size_t ai_addrlen; /* délka adresy soketu */ struct sockaddr *ai_addr; /* adresa soketu */ char *ai_canonname; /* kanonické jméno */ struct addrinfo *ai_next; /* následující prvek seznamu nebo NULL */ }; Libovolná adresová rodina ai_family AF_UNSPEC Libovolný typ soketu ai_socktype 0 Libovolný protokol ai_protocol 0
Jinak, v takovém případě je samozřejmě lepší NULL.