La frammentazione ha luogo in una trasmissione dati quando tra nodo di invio e nodo di destinazione esiste una differenza di MTU (Maximum transmission unit, la massima lunghezza del carico dati inviato al netto dell’header). In particolare, se il destinatario riceve dati di lunghezza massima inferiore a quella che può utilizzare il mittente, chiederà al mittente di frammentare il pacchetto inviato in spezzoni più “digeribili” che saranno riassembalti a destinazione. Questo comporta però un sovraccarico di trasmissione che è bene evitare.
La frammentazione può avere luogo anche quando dei router lungo il percorso hanno una MTU inferiore a quella di mittente e destinatario.
In IPv6 si cerca di evitare del tutto la frammentazione, verificando a priori quale sia la massima MTU che la catena trasmissiva (mittente, router intermedi, destinatario) accetta.
Questo avviene mediante l’uso di Path MTU Discovery (RFC1981), che si appoggia a messaggi ICMPv6 di tipo 2 (Packet Too Big).
Vale la pena notare che in IPv6 la frammentazione è fortemente sconsigliata, ma non vietata, esiste un apposito header per gestirla. Inoltre una implementazione di minima di IPv6 potrebbe anche semplicemente evitarla usando la MTU minima prevista da IPv6 e che tutti i nodi debbono implementare.
RFC 1883 specificava questa MTU minima a 576 ottetti. RFC2460, che rende obsoleta la precedente, alla voce packet size issues specifica: “IPv6 richiede che ogni link su internet abbia un MTU di 1280 ottetti o più. Su ogni link che non può portare pacchetti da 1280 ottetti in un solo pezzo, debbono essere previste frammentazione e riassemblaggio specifici al link, ad un livello inferiore ad IPv6″. Questo significa che in questo caso la frammentazione avviene a livello link layer, non viene in nessun modo gestita da IPv6 (a livello rete) ed è del tutto trasparente.
IPv6 richiede esplicitamente che tutti i nodi siano in grado di supportare almeno 1280 ottetti, ed è raccomandato che possa implementare la massima MTU possibile, per ragioni di prestazioni, senza incorrere in frammentazione (in IPv6 si consiglia normalmente una MTU pari a 1500).
Come funziona IPv6 MTU Discovery
Con riferimento alla figura 1, il processo viene avviato dal source node, che invia un pacchetto con MTU da 1500 byte verso la destinazione. Il primo router risponde inviando un messaggio ICMPv6 tipo 2, specificando che il massimo MTU è di 1400 byte. Il source node prova a ritrasmettere, inviando un pacchetto con MTU da 1400 byte. Il pacchetto passa attraverso il primo router senza problemi, ma sarà il secondo a indicare che l’MTU è troppo elevato, inviando a sua volta un ICMPv6 2 per chiederne la riduzione a 1300.
Ridotta a 1300 MTU il pacchetto potrà transitare senza difficolà. Al termine del processo abbiamo la max MTU per la tratta verso un determinato nodo di destinazione. Questo valore viene messo in cache. Per un router Cisco, il comando per visualizzare il valore di MTU è
Router# show ipv6 mtu
Per Microsoft
netsh interface ipv6 show destinationcache
Vediamo un esempio del risultato in figura 2. Per altri sistemi operativi, info interessanti
in questo blog (in inglese)
Problemi.
MTUD si appoggia ad ICMPv6. E’ pratica comune quanto poco consigliabile quella di bloccare sui firewall tutti I pacchetti ICMP “per ragioni di sicurezza”. E’ questa la causa principale della nascita di quelli che vengono chiamati normalmente “black hole”. Nello specifico si tratta di nodi raggiungibili con ping, che aprono la sessione TCP (il pacchetto di SYN è di dimensioni ridotte), ma che non riescono a ricevere i pacchetti di dimensioni maggiori perché dovrebbero ridurre MTU, ma le richieste di riduzione vengono bloccate lungo la linea. Nello specifico i messaggi Packet to big e Destination unreachable non dovrebbero essere bloccati, per avere un coerente ed integro funzionamento della rete.