Primárním důvodem, proč se o IPv6 začalo mluvit, byl strach z nedostatku IP adres. V dnes především používaném IPv4 jsou adresy 32bitové a máme tak k dispozici jen 232 unikátních adres (tedy zhruba 4,3 miliardy). Ve skutečnosti je to ještě méně, protože musíme odečíst privátní rozsahy adres, které nemohou být použity v internetu, a některé speciální adresy. Jak se dnes ukazuje, díky různým obezličkám typu NAT apod. se tento nedostatek dá částečně řešit. Přináší to sice různá omezení, nicméně nikomu se nechce měnit něco, co je tak široce rozšířené a navíc to celkem funguje. Díky výše uvedenému jsme se tedy masového nasazení IPv6 zatím nedočkaly a kdy k tomu dojde je velká otázka.
IPv6 byl přijat skupinou Internet Engineering Task Force v roce 1994 (a byl nazýván IP Next Generation, zkráceně IPng). Jak bylo uvedeno výše, hlavním důvodem vypracování IPv6 byla původně snaha rozšířit adresní prostor. IPv6 tedy používá 128bitové adresy, které poskytují dostatečný počet adres (zhruba 3,4 × 1038) „navždy“. (I když to si o 640 KiB operační paměti někteří lidé mysleli taky...)
Když už se ale bude muset změnit IP protokol, byla by škoda nevyužít toho a neprovést i další vylepšení. IPv6 tedy přináší mnoho změn i v dalších oblastech. Přináší např.
Proč ale IPv6? Proč ne IPv5? Protokol IPv5 také existuje. Nicméně se nejedná o žádnou náhradu IP protokolu. IPv5 je experimentální flow-oriented streamovací protokol určený pro podporu audia a videa. V praxi ale nebyl nikdy pořádně použit.
128bitové adresy IPv6 by bylo nepohodlné zapisovat stejným způsobem
jako mnohem kratší adresy IPv4. Zápis se tedy provádí
v šestnáctkové soustavě, kdy jsou vždy čtyři číslice odděleny
dvojtečkou. Navíc je povoleno několik zkratek zápisu. IPv6 adresa
tedy může vypadat např. takto:
2001:0db8:0000:0000:0000:0000:1428:57ab
Jak bylo uvedeno výše, při zápisu adresy je možno použít i několik zkratek. Dále uvedené adresy jsou ekvivalentní k adrese výše, pouze zapsané zkrácenou formou:
2001:db8:0000:0000:0000:0000:1428:57ab
–
vedoucí nuly v každé skupině je možno vynechat
2001:0db8::1428:57ab
– několik po sobě
jdoucích skupin samých nul je možno nahradit sekvencí
::
; kvůli jednoznačnosti je toto možné udělat
v adrese pouze jednou
2001:0db8:00:00:00:00:1428:57ab
– dvojici
nul je možno nahradit nulou jednou
2001:0db8:0:0:0:0:1428:57ab
– skupinu samých
nul je možno nahradit jednou nulou
2001:0db8:0000:0000:0000:0000:20.40.87.171
–
poslední 4 byty je možno psát v desítkovém tvaru odděleném
tečkami. Tento zápis je vhodný pro zápis adres kompatibilních
s IPv4.
Jednotlivé zkratky je samozřejmě možné libovolně kombinovat.
V URL se IPv6 adresa uvádí v hranatých závorkách.
http://[2001:0db8:0000:0000:0000:0000:1428:57ab]/page.html
http://[2001:0db8:0000:0000:0000:0000:1428:57ab]:8080/page.html
Tento zápis umožňuje snadnou analýzu adresy bez matení uvedením čísla portu.
Adresa zpětnovazebného rozhraní, tedy adresa
127.0.0.1
v IPv4, je v IPv6 adresa
0000:0000:0000:0000:0000:0000:0000:0001
.
Adresa typu „kdokoli“, tedy adresa
0.0.0.0
v IPv4, je v IPv6 adresa
0000:0000:0000:0000:0000:0000:0000:0000
.
Adresa přiřazená uzlu, který pracuje pouze s IPv4
adresami, má tvar ::ffff:a.b.c.d
, kde
a.b.c.d
je IPv4 adresa.
Adresa přiřazená uzlu, který pracuje s IPv4
i IPv6 adresami, má tvar ::a.b.c.d
, kde
a.b.c.d
je IPv4 adresa.
Speciální typ adresy, který je platný pouze na lince rozhraní. Packet s touto adresou jako cílovou nebo zdrojovou nikdy nesmí projít přes router.
Tato adresa je používána např. za účelem dotazu, zda se na lince nachází jiné zařízení apod.
Prefix těchto adres je fe8x:
(v současnosti jediný používaný prefix),
fe9x:
, feax:
nebo febx:
, kde x
je
hexadecimální číslice (normálně 0).
| 10 bits | n bits | (118 - n) bits | +----------+-------------------------+----------------------------+ |1111111010| 0 | INTERFACE ID | +----------+-------------------------+----------------------------+
Tyto adresy jsou obdobou privátních rozsahů adres
v IPv4 (168.192.x.x
apod.).
Prefix těchto adres je fecx:
(nejběžnější), fedx:
,
feex:
nebo
fefx:
, kde x
je
hexadecimální číslice (normálně 0).
Tento typ adres je dnes zavržený ve prospěch unikátních lokálních adres.
| 10 bits | n bits | m bits | (118 - n - m) bits | +----------+---------+---------------+----------------------------+ |1111111011| 0 | SUBNET ID | INTERFACE ID | +----------+---------+---------------+----------------------------+
Nový typ lokáních adres, který má oproti site local adresám tu výhodu, že adresy jsou unikátní nejen v rámci podsítě, ale globálně. Pokud tedy později dojde ke sloučení podsítí, nedojde k žádným kolizím a není třeba provádět změny adres.
Prefix těchto adres je fcxx:
nebo
fdxx:
, kde x
je
hexadecimální číslice.
| 7 bits |1| 40 bits | 16 bits | 64 bits | +--------+-+------------+-----------+----------------------------+ | PREFIX |L| GLOBAL ID | SUBNET ID | INTERFACE ID | +--------+-+------------+-----------+----------------------------+
40bitové pole GLOBAL ID je generováno pseudonáhodnou funkcí. Je tak velmi nepravděpodobné, že by se objevili dvě shodné adresy.
Toto jsou ty „hlavní“ IP adresy, tzn. globálně v internetu využitelné, určené k jednoznačné celosvětové identifikaci rozhraní.
Prefix těchto adres je 2xxx:
nebo
3xxx:
, kde x
je
hexadecimální číslice.
| | | | | | (125-n-m-o-p) | | 3 | n bits | m bits | o bits | p bits | bits | +---+-------------+--------------+---------------+-----------+---------------+ |010| REGISTRY ID | PROVIDER ID | SUBSCRIBER ID | SUBNET ID | INTERFACE ID | +---+-------------+--------------+---------------+-----------+---------------+
Tyto adresy jsou přiřazovány hierarchicky, pole REGISTRY ID, PROVIDER ID, SUBSCRIBER ID a SUBNET ID mají postupně na starosti podřízené organizace, které si pomocí nich dělí adresní prostor za jim přiděleným prefixem. To je velmi výhodné a snižuje to velikost tabulek globálních směrovačů.
Anycast adresa je nový typ adresy zavedený v IPv6, který nemá obdobu v IPv4. Slouží k identifikaci skupiny uzlů, které mají stejný účel a data mohou být vyměňována s kterýmkoli z nich. Typické užití je např. pro nalezení DNS serveru apod. Data zaslaná na anycast adresu budou doručena právě jednomu „nejbližšímu“ uzlu ze skupiny.
Anycast adresy jsou obsaženy v bloku globálních unicast adres a syntakticky se od nich nedají odlišit. Anycast adresa nesmí být nikdy uvedená jako zdrojová adresa packetu.
Multicast adresa je speciální adresa přidělená skupině uzlů. Data zaslaná na tuto adresu budou doručena všem uzlům, které do této skupiny patří. Každý uzel může patřit do libovolného množství multicast skupin.
Formát multicast adresy je následující:
| 8 bits | 4 b. | 4 b. | 112 bits | +--------+------+------+---------------------------------------------+ |11111111| FLGS | SCOP | GROUP ID | +--------+------+------+---------------------------------------------+
Prefix osmi jedniček vyznačuje multicast adresu, ze
čtyřbitového pole FLGS je zatím použit pouze čtvrtý bit,
ostatní jsou nulové. Hodnota FLGS 0000
značí
permanentní „well known“ adresu přidělenou
globální autoritou, hodnota 0001
značí dočasnou
adresu.
Pole SCOP značí rozsah platnosti multicast skupiny, tzn.
jak daleko se skupina bude šířit. Hodnoty jsou
následující:
0 – Reserved
1 – Node-local scope
2 – Link-local scope
5 – Site-local scope
8 – Organization-local scope
E – Global scope
F – Reserved
Ostatní možné hodnoty nejsou přiřazeny.
Zbývajících 112 bitů slouží jako identifikátor skupiny.
Za účelem umožnění autokonfigurace se spodních 64 bitů adresy obvykle využívá pro identifikaci hostitele. Těchto spodních 64 bitů adresy tedy může být určeno nějakým automatickým způsobem (stateless autokonfigurací vestavěnou přímo do IPv6, DHCPv6...), případně ručně.
Adresování sítí je obdobné jako u IPv4. Tedy zápis
2001:0db8:0000:0000::/64
udává prefix sítě, která
obsahuje adresy 2001:0db8:0000:0000:0000:0000:0000:0000
až 2001:0db8:0000:0000:ffff:ffff:ffff:ffff
.
Pro účely autokonfigurace je možné použít EUI-64 formát hostitelské
části adresy. Při zapojení do sítě se zařízení link local
multicastem dotáže routeru na prefix sítě. Když dostane odpověď,
použije pro sestavení své IP adresy právě tento prefix. Zbývajících
64 bitů potom určí ze své fyzické adresy (pro Ethernet
z MAC adresy). Např. na Ethernetové síti by si zařízení ze své
MAC adresy s hodnotou 00:D0:B7:6B:4A:B2
vytvořilo
sufix adresy takto:
Mezi třetí a čtvrtý byte MAC adresy (tedy na hranici mezi
identifikátorem výrobce a identifikátorem konkrétního exempláře
síťové karty) se vloží vzorek fffe
. Výsledkem tedy je
sufix 00d0:b7ff:fe6b:4ab2
. Ten se ale ještě nepoužije,
v takto vzniklém sufixu se provede doplněk 15. nejvyššího
bitu. Výsledný sufix použitý pro sestavení IP adresy v našem
příkladu by tedy byl 02d0:b7ff:fe6b:4ab2
.
Právě tento démon se stará o odpovědi na dotazy připojených nenakonfigurovaných zařízení. Na jejich dotaz jim odešle prefix sítě, ze kterého si výše uvedeným způsobem vytvoří vlastní IP adresu.
Po instalaci je třeba démona nakonfigurovat. Nastavení se provádí
v konfiguračním souboru, který může být např. v souboru
/etc/radvd/radvd.conf
. Velmi jednoduchá konfigurace
může vypadat např. takto:
interface eth0 # Konfigurace pro rozhrani eth0. { AdvSendAdvert on; # Demon bude odpovidat na dotazy. prefix 2001:db8:0:1::/64 # Jako odpoved bude zasilan prefix 2001:db8:0:1:: { AdvAutonomous on; # Prefix muze byt pouzit pro autonomni autokonfiguraci. }; };
GNU/Linux má podporu pro IPv6 přímo v jádře. První kód byl přidán do jádra 2.1.8 v roce 1999. Standard se však rychle vyvíjel a podpora IPv6 přímo v jádře zaostávala za aktuálním stavem standardu. V roce 2000 byl v Japonsku založen projekt USAGI, který pomohl implementovat potřebné chybějící funkce a aktualizovat ty zastaralé.
Se začátkem vývoje jádra 2.5.x byly USAGI patche příliš velké na to, aby je bylo možno plně začlenit do 2.4.x jader a tento stav se již nikdy nepodařilo zlepšit.
V současné době je mnoho USAGI patchů standardní součástí jader 2.6.x. Vývoj dalších funkcí v USAGI projektu pokračuje a čas od času jsou začleněny do vanilla jádra.
Pro FreeBSD existuje projekt KAME, který se stará o podporu IPv6 v tomto systému. Minimálně v minulosti byla jeho podpora IPv6 na vyšší úrovní než v GNU/Linuxu.
Pro zapnutí podpory IPv6 v GNU/Linuxu je třeba mít jádro
zkompilované s jeho podporou (volba
CONFIG_IPV6=[y | m]
). Pak stačí přiřadit rozhraní
IPv6 adresu a nastavit směrování.
ifconfig eth0 inet6 add fec0::2
route -A inet6 add default fec0::1
V současné době neexistuje žádná globální IPv6 síť. Pro účely testování tedy vznikají různé virtuální IPv6 sítě, které tunely skrz IPv4 sítě spojují různé IPv6 sítě do jediné virtuální globální sítě. Jednou z nejznámějších byla páteřní virtuální IPv6 síť 6bone. Ta je od 6. června 2006 ve stádiu ukončování činnosti.
Tunelování probíhá tak, že na rozhraní mezi IPv6 a IPv4 sítí existují routery, které při odesílání dat balí IPv6 pakety do IPv4 paketů a ty posílají protějším hraničním routerům. Ty IPv6 packet zase vybalí a pošlou je do své IPv6 sítě.
iptunnel add mujtunel mode sit remote 10.0.20.1 local 10.0.20.2 ttl 16
ifconfig mujtunel up
ifconfig mujtunel add fec0:0:0:20::2
route -A inet6 add fec0:0:0:20::/64 dev mujtunel
Pokud chceme psát programy, které budou bez problémů fungovat nejen nad současnými IPv4 sítěmi, ale bez nutnotsti zásahu do kódu i po přechodu na IPv6, je nutné používat správné funkce pro práci se sítí.
Funkce getipnodebyname(3)
, getipnodebyaddr(3)
,
getservbyname(3)
a getservbyport(3)
byly
zavrženy a nahrazeny společným rozhraním
getaddrinfo(3)
. To umí pracovat jak nad IPv4, tak nad IPv6
sítěmi.