# IPv6

IPv6 è la versione dell'Internet Protocol designata come successore dell'IPv4. Tale protocollo introduce alcuni nuovi servizi e semplifica molto la configurazione e la gestione delle reti IP.
La sua caratteristica più importante è l'ampio spazio di indirizzamento:
* IPv6 riserva 128 bit per gli indirizzi IP e gestisce $2^{128}$ (circa 3,4×10$^{38}$) indirizzi;
* IPv4 riserva 32 bit per l'indirizzamento e gestisce $2^{32}$ (circa 4,3×10$^9$) indirizzi.
Quantificando con un esempio, per ogni metro quadrato di superficie terrestre, ci sono 655 570 793 348 866 943 898 599 indirizzi IPv6 unici (cioè 655 571 miliardi di miliardi o 655 triliardi), ma solo 0,000007 IPv4 (cioè solo 7 IPv4 ogni chilometro quadrato). Per dare un'idea delle grandezze in uso, se si paragona l'indirizzo singolo a un Quark (grandezza nell'ordine di 1 attometro), con IPv4 si raggiungerebbe il diametro dell'elica del DNA (di pochi nanometri), mentre con IPv6 si raggiungerebbe il centro della Via lattea dalla Terra (tre decine di millenni-luce). L'adozione su vasta scala di IPv6 e quindi del formato per gli indirizzi IP risolverebbe indefinitamente il problema dell'esaurimento degli indirizzi IPv4.

## Storia

L'ICANN rese disponibile il protocollo IPv6 sui root nameserver dal 20 luglio 2004, ma solo dal 4 febbraio 2008 iniziò l'inserimento dei primi indirizzi IPv6 nel sistema di risoluzione dei nomi. Il 3 febbraio 2011 la IANA ha assegnato gli ultimi blocchi di indirizzo IPv4 ai cinque RIR (un blocco /8 ciascuno), anche se il protocollo IPv4 verrà utilizzato fino al 2025 circa, per dare il tempo necessario ad adeguarsi.

### Tappe

* Nel 1999 viene implementato il primo tunnel IPv6 da Ivano Guardini presso lo CSELT, autore anche dell'RFC 3053.
* Nel 2003 Nihon Keizai Shimbun (come citato dallo staff di CNET Asia, nel 2003) ha segnalato che il Giappone, la Cina e la Corea del Sud hanno annunciato di essere determinati a diventare le principali nazioni nello sviluppo e utilizzo della tecnologia di Internet, partendo con lo sviluppo di IPv6 e terminando nel 2005 con la sua completa adozione.
* Il 20 luglio 2004 l'ICANN ha annunciato l'integrazione della nuova versione del protocollo Internet nei root server che gestiscono il traffico in rete. Entusiasta Vinton Cerf, padre del TCP/IP e presidente dell'ICANN che afferma: «Maggiore stabilità per il grande network». L'ICANN ha inoltre annunciato che i nameserver dei record IPv6 di tipo AAAA per i domini nazionali ccTLD (country code Top Level Domain) del Giappone (.jp) e Corea del Sud (.kr) sono diventati visibili nei file di zona dei root server di DNS con il numero di serie 2004072000. È stato previsto che i record IPv6 per la Francia (.fr) verranno aggiunti presto. Ciò ha reso IPv6 pubblicamente operativo.
* L'8 giugno 2011 è stato organizzato il World IPv6 Day in cui le maggiori aziende hanno utilizzato il nuovo protocollo per un giorno e non si sono registrati particolari problemi durante questo test.
* Il 6 giugno 2012 è stato organizzato il World IPv6 Launch in occasione del quale alcune delle maggiori aziende operanti su web sono migrate definitivamente al nuovo protocollo.

## Descrizione

Il motivo più pressante dietro l'adozione del protocollo IPv6 è stato l'insufficienza di spazio per l'indirizzamento dei dispositivi in rete, in particolar modo nei paesi altamente popolati dell'Asia come l'India e la Cina.
Oltre a rispondere a questa esigenza l'IPv6 incorpora alcuni protocolli che prima erano separati, come l'ARP, ed è in grado di configurare automaticamente alcuni parametri di configurazione della rete, come per esempio il default gateway. Inoltre supporta nativamente la qualità di servizio e introduce l'indirizzamento anycast, che permette a un computer in rete di raggiungere automaticamente il più vicino server disponibile di un dato tipo (un DNS, per esempio) anche senza conoscerne a priori l'indirizzo.
Per quanto riguarda i grandi gestori di telecomunicazioni, le principali migliorie sono:
* header di lunghezza fissa (40 byte);
* pacchetti non frammentabili dai router;
* eliminazione del campo checksum, già presente negli altri strati dello stack protocollare e perciò ridondante.
Queste tre novità alleggeriscono molto il lavoro dei router, migliorando l'instradamento e il throughput (pacchetti instradati al secondo). Insieme all'IPv6 inoltre viene definito anche l'ICMPv6, molto simile all'ICMPv4 ma che ingloba il vecchio protocollo IGMP, assumendosi anche il compito di gestire le connessioni multicast.
IPv6 è la seconda versione dell'Internet Protocol a essere ampiamente sviluppata e costituirà la base per la futura espansione di Internet.

## Caratteristiche
### L'indirizzamento in IPv6

$7\times 10^{23}$
(Andrew S. Tanenbaum)
Il cambiamento più rilevante nel passaggio dall'IPv4 all'IPv6 è la lunghezza dell'indirizzo di rete. L'indirizzo IPv6, come definito nel RFC 2373 e nel RFC 2374 è lungo 128 bit, cioè 32 cifre esadecimali, che sono normalmente utilizzate nella scrittura dell'indirizzo come descritto più avanti.
Questo cambiamento porta il numero di indirizzi esprimibili dall'IPv6 a $2^{128}=16^{32}\approx 3,4\times 10^{38}$.
Una delle critiche allo spazio di indirizzamento di 128 bit è che potrebbe essere ampiamente sovradimensionato. Bisogna considerare che la ragione di un indirizzamento così ampio non è da associare alla volontà di assicurare un numero sufficiente di indirizzi, quanto al tentativo di porre rimedio alla frammentazione dello spazio di indirizzamento IPv4, conseguenza, tra le altre cose, della limitazione dello spazio di indirizzamento e della poca possibilità di prevedere a medio-lungo termine la richiesta di indirizzi. È infatti possibile che un singolo operatore di telecomunicazione abbia assegnati numerosi blocchi di indirizzi non contigui.
Come per IPv4 anche IPv6 prevede che l'instradamento sia realizzato sulla base di prefissi (oggetto delle rotte) di lunghezza variabile. Normalmente tali prefissi sono non più lunghi di 64 bit, in modo da consentire l'impiego dei 64 bit meno significativi con il solo ruolo di identificare un terminale. Questo vale anche per l'accesso a Internet di una normale abitazione, a cui verrebbero assegnati almeno $2^{64}$ (1,8×10$^{19}$) indirizzi pubblici, mentre per realtà che dispongono di una struttura di rete articolata in più segmenti di LAN occorre assegnare un arco di indirizzi ancora più grande (ad esempio un prefisso di 56 bit, vedi RFC 6177). I primi 10 bit dell'indirizzo IPv6 descrivono genericamente il tipo di computer e l'uso che questo fa della connessione (telefono VoIP, PDA, data server, telefonia mobile ecc.)
Questa caratteristica svincola virtualmente il protocollo IPv6 dalla topologia della rete fisica, permettendo per esempio di avere lo stesso indirizzo IPv6 a prescindere dal particolare Internet service provider (ISP) che si sta usando (il cosiddetto IP personale) rendendo quindi l'indirizzo IPv6 simile a un numero di telefono. Queste nuove caratteristiche complicano però il routing IPv6 che deve tenere conto di mappe di instradamento più complesse rispetto all'IPv4; proprio le nuove proprietà dell'indirizzamento rappresentano anche i potenziali talloni d'Achille del protocollo.

#### Notazione per gli indirizzi IPv6

Gli indirizzi IPv6 sono composti di 128 bit e sono rappresentati come 8 gruppi, separati da due punti, di quattro cifre esadecimali (ovvero otto word di 16 bit ciascuna) in cui le lettere vengono scritte in forma minuscola. Per esempio 2001:0db8:85a3:0000:1319:8a2e:0370:7344 rappresenta un indirizzo IPv6 valido.
Se uno dei gruppi – come nell'esempio – è composto da una sequenza di quattro zeri può essere contratto a un solo zero: 2001:0db8:85a3:0:1319:8a2e:0370:7344
Inoltre, una sequenza di zeri contigui (e una soltanto) composta da due o più gruppi può essere contratta con la semplice sequenza :: ovvero 2001:0db8:0000:0000:0000:8a2e:0370:7344 corrisponde a 2001:0db8:0:0:0:8a2e:0370:7344 o ancora più sinteticamente a 2001:0db8::8a2e:0370:7344
Seguendo le regole prima menzionate, se più sequenze simili si susseguono, è possibile ometterle tutte; di seguito vengono riportate varie rappresentazioni dello stesso indirizzo:
Tuttavia 2001:0db8::25de::cade non è un indirizzo valido, poiché non è possibile definire quante sequenze siano presenti nelle due lacune.
Inoltre possono essere omessi anche gli zeri iniziali di ogni gruppo: 2001:0db8:02de::0e13 corrisponde a 2001:db8:2de::e13
Gli ultimi 32 bit possono essere scritti in decimale (nella notazione dotted decimal):
è uguale a
ma diverso da:
o da:
rendendo così la sintassi IPv6 retrocompatibile con quella IPv4 con evidenti benefici.
La forma di scrittura ::ffff:1.2.3.4 è chiamata IPv4-mapped address.
Il formato ::1.2.3.4 è un IPv4-compatible address, tuttavia l'uso di questo formato è sconsigliato in quanto esso è stato deprecato
Gli indirizzi IPv4 sono facilmente trasformabili in formato IPv6. Ad esempio, se l'indirizzo decimale IPv4 è 135.75.43.52 (in esadecimale, 874B2B34), può essere convertito in 0000:0000:0000:0000:0000:FFFF:874b:2b34 [oppure in notazione ibrida 0000:0000:0000:0000:0000:FFFF:135.75.43.52] o più brevemente ::ffff:874b:2b34. Anche in questo caso è possibile l'uso della notazione ibrida (IPv4-compatible address), usando la forma ::ffff:135.75.43.52.

#### Indirizzi speciali

È stato definito un certo numero di indirizzi con significati particolari. La tabella seguente ne elenca alcuni nella notazione CIDR.
* ::/128 - l'indirizzo composto da tutti zeri, detto unspecified address, viene utilizzato per indicare l'assenza di indirizzo e viene utilizzato esclusivamente a livello software, corrisponde a 0.0.0.0 in IPv4;
* ::1/128 - l'indirizzo di loopback è un indirizzo associato al dispositivo di rete che ripete come eco tutti i pacchetti che gli sono indirizzati. Corrisponde a 127.0.0.1 in IPv4;
* ::/96 - è utilizzato per interconnettere le due tecnologie IPv4/IPv6 nelle reti ibride. Gli indirizzi IPv4 compatibili sono stati deprecati in favore degli indirizzi IPv4-Mapped address;
* ::ffff:0:0/96 - l'indirizzo IPv4-mapped address è utilizzato nei dispositivi dual stack;
* fe80::/10 - il prefisso link-local specifica che l'indirizzo è valido esclusivamente sullo specifico link fisico;
* fec0::/10 - il prefisso site-local specifica che l'indirizzo è valido esclusivamente all'interno dell'organizzazione locale. Il suo uso è stato sconsigliato nel settembre del 2004 con il RFC 3879 e i sistemi futuri non ne dovrebbero implementare il supporto;
* fc00::/7 - il prefisso unique local addresses (ULA) è valido esclusivamente all'interno dell'organizzazione. Il suo uso è analogo alle classi private della versione IPv4 (gli IP ULA non vengono ruotati su internet). Sostituiscono gli indirizzi site-local deprecati. Non esiste nessuna registrazione formale degli indirizzi privati presso organizzazioni RIR anche se esistono siti non istituzionali che tengono traccia dei vari ULA per evitare sovrapposizioni;
* ff00::/8 - il prefisso di multicast è utilizzato per gli indirizzi di multicast.

### Il pacchetto IPv6

Il pacchetto IPv6, come ogni altro pacchetto di un altro strato protocollare, si compone di due parti principali: l'header e il payload.
L'header è costituito dai primi 40 byte del pacchetto e contiene otto campi, cinque in meno rispetto all'IPv4. I campi sono inseriti col byte più significativo messo per primo (notazione big-endian) e all'interno dei singoli byte il bit più significativo è il primo (quello di indice 0).
| + | Bit 0–3 | Bit 0–3 | Bit 0–3 | Bit 0–3 | 4–11 | 4–11 | 4–11 | 4–11 | 4–11 | 4–11 | 4–11 | 4–11 | 12–15 | 12–15 | 12–15 | 12–15 | 16–23 | 16–23 | 16–23 | 16–23 | 16–23 | 16–23 | 16–23 | 16–23 | 24–31 | 24–31 | 24–31 | 24–31 | 24–31 | 24–31 | 24–31 | 24–31 |
| 0-31 | Version | Version | Version | Version | Traffic class | Traffic class | Traffic class | Traffic class | Traffic class | Traffic class | Traffic class | Traffic class | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label | Flow label |
| 32-63 | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Payload length | Next header | Next header | Next header | Next header | Next header | Next header | Next header | Next header | Hop limit | Hop limit | Hop limit | Hop limit | Hop limit | Hop limit | Hop limit | Hop limit |
| 64 - 191 | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) | Source address (128 bit) |
| 192 - 319 | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) | Destination address (128 bit) |
* Version [4 bit] - Indica la versione del datagramma IP: per IPv6, ha valore 6 (da qui il nome IPv6).
* Traffic class [8 bit] - Si traduce come "classe di traffico", permette di gestire le code by priority assegnando a ogni pacchetto una classe di priorità rispetto ad altri pacchetti provenienti dalla stessa sorgente. Viene usata nel controllo della congestione.
* Flow label [20 bit] - Usata dal mittente per etichettare una sequenza di pacchetti come se fossero nello stesso flusso. Supporta la gestione del QoS (Quality of Service), consentendo ad esempio di specificare quali etichette abbiano via libera rispetto ad altre. Al momento, questo campo è ancora in fase sperimentale.
* Payload length [16 bit] - È la dimensione del payload, ovvero il numero di byte di tutto ciò che viene dopo l'header. Da notare che eventuali estensioni dell'header (utili ad esempio per l'instradamento o per la frammentazione) sono considerate payload, e quindi conteggiate nella lunghezza del carico. Se il suo valore è 65535 byte, si tratta di un pacchetto di dimensione massima, anche detto Jumbogram.
* Next header [8 bit] - Indica quale tipo di intestazione segue l'header di base IPv6. Molto simile al campo protocol dell'header IPv4, del quale usa gli stessi valori.
* Hop limit [8 bit] - È il limite di salti consentito, praticamente il Time to live. Il suo valore viene decrementato di 1 ogni volta che il pacchetto passa da un router: quando arriva a zero viene scartato.
* Source address [128 bit] - Indica l'indirizzo IP del mittente del pacchetto.
* Destination address [128 bit] - Indica l'indirizzo IP del destinatario del pacchetto.
La parte successiva contiene il carico utile (in inglese payload) lungo come minimo 1280 byte o 1500 byte se la rete supporta un MTU variabile. Il carico utile può raggiungere i 65535 byte in modalità standard o può essere di dimensioni maggiori in modalità jumbo payload.
Esistono due versioni di IPv6 lievemente diverse tra loro: la versione iniziale (ora obsoleta, descritta nel RFC 1883) differisce da quella attuale (descritta nel RFC 2460) per un campo. Si tratta della classe di traffico la cui dimensione è stata portata da 4 a 8 bit. Tutte le altre differenze sono minime.

### IPv6 e i Domain Name System

Gli indirizzi IPv6 sono rappresentati nel Domain Name System dal Record AAAA (detto anche record quadruplo-A) per il forward lookup (analogamente al Record A del IPv4); la risoluzione DNS inversa si appoggia sulla zona ip6.arpa (precedentemente ip6.int). Questo schema di funzionamento viene descritto nel RFC 3596.
Lo schema della quadrupla A è uno dei due proposti in fase di design del protocollo IPv6. La proposta alternativa aveva record A6 per il reverse lookup e altre innovazioni quali le bit-string labels e i record DNAME è descritta nel RFC 2874 (sperimentale) e nei documenti collegati.
Sebbene lo schema AAAA sia una semplice generalizzazione dei DNS IPv4, lo schema A6 sarebbe stato un'estensione più generica, ma anche più complessa:
* i record A6 avrebbero permesso a un singolo indirizzo IPv6 di essere diviso in diverse sezioni gestite in zone differenti. Questo avrebbe permesso, ad esempio, di ridistribuire in maniera rapida la numerazione di un network.
* la delega degli indirizzi attraverso l'uso dei record NS sarebbe stata ampiamente sostituita dall'uso dei record DNAME (similmente agli attuali record CNAME, ma costituendo un intero albero di indirizzi). Questo avrebbe permesso la gestione unitaria dei lookup diretti e inversi.
* Un nuovo tipo di dato chiamato bit label veniva introdotto nei nomi di dominio, principalmente per scopi di lookup inverso.
Lo schema AAAA è stato standardizzato nell'agosto del 2002 nel RFC 3363 (nel RFC 3364 sono valutati tutti i pro e i contro di entrambi gli schemi proposti).

## La transizione all'IPv6

Nel luglio 2007 è stato presentato un Internet Draft che presenta il piano di transizione per trasformare la rete Internet, principalmente basata su protocollo IPv4, in una nuova forma principalmente basata su IPv6. Dal momento che è praticamente certo che molti vecchi calcolatori rimarranno online senza venire aggiornati, e macchine IPv6 e IPv4 conviveranno sulla rete per decenni, il meccanismo adottato per gestire questo periodo transitorio è il cosiddetto dual stack: ogni sistema operativo che supporta IPv6 comunicherà con le macchine IPv4 grazie a un secondo stack di protocolli IPv4 che opera in parallelo a quello IPv6. Quando il computer si connetterà a un'altra macchina in Internet, il DNS assieme all'indirizzo di rete comunicherà anche l'informazione riguardo quale stack usare (v4 o v6) e quali protocolli sono supportati dall'altra macchina.
Vantaggi:
* Transizione morbida: possibilità di liquidare gli investimenti già fatti in hardware/software senza dover sostenere nuove spese prima del necessario;
* Piena compatibilità fra vecchie e nuove macchine e applicazioni;
Svantaggi:
* Necessità di supportare in maniera estesa l'IPv4 nella Internet e negli apparati connessi.
* Essere raggiungibili dall'universo IPv4 durante la fase di transizione costringe a mantenere un indirizzo IPv4 o una qualche forma di NAT nei gateway router. Si aggiunge quindi un livello di complessità che rende la teorica disponibilità di indirizzi non immediata.
* Problemi architetturali: in particolare non sarà possibile supportare pienamente il multihoming IPv6.

### Meccanismi di transizione

Sino a quando la connettività non sarà largamente disponibile e supportata nativamente in IPv6 dall'infrastruttura di rete, è necessario utilizzare un meccanismo di trasporto dei pacchetti IPv6 su rete IPv4 tramite la tecnologia del tunneling. Questo può essere realizzato con:
* Tunnel IPv6 in IPv4 configurati staticamente per l'interconnessione di sottoreti IPv6 remote.
* Tunneling automatico 6to4, per interconnettere le reti IPv6 tra di loro attraverso una rete IPv4 comune, Internet ad esempio. L'interconnessione è automatica grazie all'automatismo del tunneling 6to4: avviene direttamente tra reti con indirizzamento IPv6 via 6to4, oppure tramite un 6to4 relay router per le destinazioni con indirizzo IPv6 nativo.
Questi tunnel funzionano tramite l'incapsulamento dei pacchetti IPv6 in pacchetti IPv4 con il campo next-layer (protocol-type) impostato a 41 da cui il nome di proto-41. Similarmente, l'ISATAP permette la trasmissione di traffico IPv6 su infrastrutture IPv4. Anche questo protocollo usa il proto-41.
Quando la connettività IPv6 è richiesta da una rete nascosta da un apparato che implementa NAT e che solitamente blocca il traffico del protocollo 41, è possibile usare il protocollo Teredo che incapsula l'IPv6 all'interno di datagrammi UDP su IPv4. È anche possibile usare proxy IPv6-to-IPv4 e IPv6-to-IPv6, sebbene questi siano solitamente specifiche dell'application-layer (come il protocollo HTTP).

## Gruppi di lavoro IETF affini

* IPv6 Backbone (concluso)
* IP Next Generation (concluso)
* IP Version 6 (concluso)
* IPv6 MIB (concluso)
* Site Multihoming in IPv6 (concluso)
* IPv6 Operations

## IPv6 in Italia

* Fastweb ha annunciato nel 2015 l'iniziale disponibilità di indirizzi IPv6 per i suoi clienti residenziali.
* TIM, il più importante ISP italiano, ha offerto sin dal 2017 un servizio pilota al fine di dare ai propri clienti la possibilità di connettersi con IPv6. In ogni caso, all'inizio del 2022 diversi utenti hanno iniziato a segnalare la rimozione del profilo PPPoE utilizzato per fornire IPv6, sembra che TIM abbia completamente abbandonato IPv6 nella propria rete.
* Sky Wifi fornisce il servizio IPv6. SkyWiFi ha iniziato a utilizzare il dual stack, ma passerà a una rete solo IPv6 utilizzando MAP-T per la connettività IPv4
* Dimensione fornisce IPv6 assegnando un /48 tramite DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
* Pianeta Fibra fornisce IPv6 assegnando un /56 tramite DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
* ConnectLife fornisce IPv6 assegnando un /56 tramite DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
* Navigabene fornisce IPv6 assegnando un /56 tramite DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
* Iliad fornisce IPv6 assegnando un /60 tramite DHCPv6 Prefix Delegation in Dual Stack cMAP-E per connettività IPv4.
* Aruba.it Fibra fornisce IPv6 assegnando un /56 tramite IPv6 su PPPoE con IPv4 Dual Stack.
* Spadhausen fornisce IPv6 assegnando un /48 via DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
* Convergenze, operatore multiutility di fibra, telefonia ed energia, fornisce IPv6 assegnando un /64 via DHCPv6 Prefix Delegation con IPv4 in Dual Stack.
Secondo le statistiche fornite da Google, l'Italia aveva un IPv6 adoption rate dell'8,49% a gennaio 2023.