Okolo roku 1992 Internet Engineering Task Force (IETF) začalo uvažovať nad problémami súvisiacimi s protokolom IPv4, a to najmä z hľadiska globálneho vyčerpania adresného priestoru a technických nedostatkov návrhu protokolu IPv4. Takto vzišiel podnet pre vznik protokolu novej generácie (IPng - IP next generation), ktorý by tieto problémy riešil. Po niekoľkých diskusiách prišlo na svet v decembri 1993 prvé RFC pre tento návrh (RFC-1550), načo po ďalších diskusiách bola o dva roky neskôr vydaná prvá špecifikácia protokolu Internet Protocol version 6 - IPv6 (RFC-1883). Táto dostala svoju finálnu podobu v decembri 1998, a je popísaná v RFC-2460.
Medzi hlavné rozdiely protokolu IPv6 oproti protokolu IPv4 patria:
Veľký rozsah IP adresného priestoru. IPv4 používa pre adresný priestor 32 bitov (4 miliardy adries), zatiaľčo IPv6 128 bitov (~ 3,4 * 10^38 adries).
Autokonfigurácia. V IPv6 je vyžadovaná bezstavová autokonfigurácia.
Bezpečnosť. Špecifikácia protokolu IPv6 vyžaduje podporu IPSec.
Lepšia mobilita. IPv6 má lepšiu podporu pre ad-hoc networking.
IPv6 paket pozostáva z dvoch častí - z hlavičky a payloadu. Hlavička má veľkosť 40 bytov. Obsahuje zdrojovú a cieľovú adresu (každá 128 bitov), identifikáciu (verziu) protokolu (4 bity), traffic class (8 bitov, určuje prioritu paketu), flow label (20 bitov, kvôli manažmentu QoS), dĺžku payloadu (16 bitov), next header (8 bitov, odkaz na ďalšiu hlavičku) a hop limit (8 bitov, obdoba TTL). Payload môže mať veľkosť až do 64KB v štandardnom móde, alebo môže byť aj väčší (vďaka nastaveniu flagu "jumbo payload").
Adresa v IPv6 je 4x dlhšia než v IPv4. Kvôli prehľadnosti sa mení spôsob jej zápisu - zapisuje sa ako osem skupín po štyroch hexadecimálnych čísliciach, kde každá skupina je oddelená dvojbodkou:
2001:0db8:85a3:08d3:1319:8a2e:0370:7334
Ak skupina štyroch číslic obsahuje samé nuly (0000), je možné túto štvoricu vynechať:
2001:0db8:85a3:0000:1319:8a2e:0370:7344 == 2001:0db8:85a3::1319:8a2e:0370:7344
Taktiež je možné nahradiť súvislé sekvencie 4 núl za dve dvojbodky (::), ale iba raz, pretože by inak nebola zachovaná jednoznačnosť adresy:
2001:0db8:0000:0000:0000:0000:1428:57ab == 2001:0db8::1428:57ab
Úvodné nuly je možné v skupine vynechať:
2001:0db8::1428:57ab == 2001:db8::1428:57ab
V IPv6 sa pre adresovanie sietí používa beztriedna adresácia (CIDR). Zápis
2001:1234:5678:9ABC::/64 (64 je prefix v bitoch) znamená, že
táto sieť môže alokovať adresy v rozsahu
od 2001:1234:5678:9ABC::
do 2001:1234:5678:9ABC:FFFF:FFFF:FFFF:FFFF.
Broadcast adresy v IPv6 neexistujú. Nahradili ich multicast a unicast adresy.
Používa sa na generovanie link local adresy. Link local adresa sa vytvorí z MAC adresy (48 bitov, 24 bitov výrobca a 24 bitov sériové čislo) tak, že prvé 3 byty z MAC adresy sa použijú ako prvé 3 byty EUI64, štvrtý a piaty byte EUI64 bude mať hexadecimálnu hodnotu FFFE, a posledné 3 byty z MAC adresy budú posledné 3 byty EUI64. Následne sa urobí doplnok druhého najnižšieho bitu v prvom byte EUI64 identikátora. Tento bit je zvyčajne nulový, takže po doplnku má hodnotu 1. Príklad:
MAC adresa: 00:04:76:D1:C4:38 00:04:76 + FF:FE + D1:C4:38 (00:04:76ff:fed1:c438) Po doplnku: 204:76ff:fed1:c438
Autokonfigurácia môže byť stavová (za použitia protokolu DHCPv6), alebo bezstavová,
ktorá funguje na základe tzv. "neighbour discovery" (objavovanie suseda). Smerovač na sieti
v určitých intervaloch posiela do siete základné informácie o sieti (Router Advertisement).
Zariadenie pripojené na sieť môže o tieto informácie požiadať prostredníctvom tzv. výzvy k
smerovači (Router Solicitation). Obdrží prefix siete, ku ktorému pridá svoju adresu v EUI64
formáte a získa tak svoju adresu. Objavovanie suseda nahrádza aj ARP/RARP v IPv4. Pokiaľ chce
zariadenie zistiť linkovú adresu iného zariadenia na sieti, pošle tzv. Neighbour Solicitation
paket. Ako odpoveď obdrží Neighbour Advertisement od daného zariadenia.
Implementáciu NDP (Neighbour Discovery Protocol) rieši napr. démon radvd - Router Advertisement
Daemon. Do siete môže posielať Router Advertisement pakety periodicky alebo pri výzve iným
zariadením, ktoré pošle výzvu Router Solicitation.
V IPv6 je snaha o podporu mobility a to predovšetkým v umožnení adresovať mobilné zariadenia bez ohľadu na to v akej sieti sa nachádzajú. Podpora mobility sa opiera o základnú myšlienku, že i mobilné zariadenie je niekde doma, čiže je súčasťou tzv. domácej siete, kde má pridelenú aspoň jednu globálnu unicast IP adresu. Domáca adresa je nemenná a je zaregistrovaná v DNS, prostredníctvom tejto adresy je počítač trvale dostupný aj keď sa v nej práve nenachádza.
Začiatky podpory IPv6 v Linuxe sa datujú s jadrom verzie 2.1.8 v novembri 1996. Nasledoval projekt USAGI, ktorého cieľom bolo vytvoriť a neustále zdokonalovať implementáciu IPv6 stacku pre Linuxové jadro, pričom by kopíroval referenčnú implementáciu protokolu IPv6 pre BSD systémy (projekt KAME).
Pre podporu IPv6 stacku nastavíme pri konfigurácii jadra
voľbu CONFIG_IPV6=y. Netfilter v súčasnosti podporuje aj IPv6 protokol,
a pokiaľ chceme filtrovať okrem IPv4 aj IPv6 traffic, môžeme si v jadre zapnúť
podporu ip6tables (zatiaľ v experimentálnom štádiu).
Pridanie IPv6 adresy pre rozhranie eth0:
ifconfig eth0 inet6 add fec0::3
Pridanie do routovacej tabulky:
route add inet6 default fec0::1
Alebo si môžeme vytvoriť IPv6 tunel nad IPv4:
sh-3.1# iptunnel add tunnel0 mode sit local 10.0.20.2 remote 10.0.20.1 ttl 64 sh-3.1# ifconfig tunnel0 up; ifconfig tunnel0 add fec0:0:0:20::2 sh-3.1# route -A inet6 add fec0:0:0:20::/64 dev tunnel0
Pre dopredný preklad sa používa AAAA záznam, môže obsahovať aj skrátený zápis (príklad záznamu v BIND):
ipv6host IN AAAA 3ffe:80ee:64b::1
Čo sa týka reverzných prekladov, tu musíme používať neskrátený zápis, a to celý odzadu, pričom každý hexadecimálny znak je oddelený bodkou. Reverzné preklady patria pod pseudodomény ip6.int (testovací projekt 6bone) alebo ip6.arpa (produkčná prevádzka IPv6). S pomocou šikovnej utilitky ipv6calc si môžeme túto prácu uľahčiť:
sh-3.1# ipv6calc -r --in ipv6addr --out revnibbles.int 3ffe:80ee:64b::1/48 b.4.6.0.e.e.0.8.e.f.f.3.ip6.int. sh-3.1# # ^-- Co mozeme skvelo vyuzit pri pridavani zony alebo editacii rev. zaznamov ;-)"
Funkcia getaddrinfo(3) kombinuje funkcionalitu poskytovanú fciami getipnodebyname(3), getipnodebyaddr(3), getservbyname(3) a getservbyport(3) do jediného rozhrania.
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); /* node = numericka adresa (oddelena bodkami v pripade IPv4, hexadecimalny format pre IPv6) service = port sluzby hints = specifikuje preferovany typ socketu alebo protokolu res = zretazeny zoznam struktur addrinfo */ struct addrinfo { int ai_flags; int ai_family; // moze byt AF_INET, AF_INET6 alebo AF_UNSPEC (kazdy protokol) int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; };
Viac informácií je možné nájsť v manuáli (man 3 getaddrinfo), alebo v RFC-2553.