3. Frammentazione e Scoperta dell'MTU del Percorso
-
Frammentazione e Scoperta dell'MTU del Percorso
Proprio come è possibile ricevere un datagramma IP non etichettato che è troppo grande per essere trasmesso sul suo collegamento di uscita, è possibile ricevere un pacchetto etichettato che è troppo grande per essere trasmesso sul suo collegamento di uscita.
È anche possibile che un pacchetto ricevuto (etichettato o non etichettato) che era originariamente abbastanza piccolo da essere trasmesso su quel collegamento diventi troppo grande in virtù dell'avere una o più etichette aggiuntive inserite nel suo stack di etichette. Nel label switching, un pacchetto può crescere di dimensione se vengono inserite etichette aggiuntive. Quindi, se si riceve un pacchetto etichettato con un carico utile del frame di 1500 byte, e si inserisce un'etichetta aggiuntiva, è necessario inoltrarlo come frame con un carico utile di 1504 byte.
Questa sezione specifica le regole per l'elaborazione dei pacchetti etichettati che sono "troppo grandi". In particolare, fornisce regole che garantiscono che gli host che implementano la Scoperta dell'MTU del Percorso (Path MTU Discovery) [4], e gli host che utilizzano IPv6 [7,8], saranno in grado di generare datagrammi IP che non necessitano di frammentazione, anche se quei datagrammi vengono etichettati mentre attraversano la rete.
In generale, gli host IPv4 che non implementano la Scoperta dell'MTU del Percorso [4] inviano datagrammi IP che non contengono più di 576 byte. Poiché gli MTU in uso sulla maggior parte dei collegamenti dati oggi sono 1500 byte o più, la probabilità che tali datagrammi debbano essere frammentati, anche se vengono etichettati, è molto piccola.
Alcuni host che non implementano la Scoperta dell'MTU del Percorso [4] genereranno datagrammi IP contenenti 1500 byte, purché gli indirizzi IP Sorgente e Destinazione siano sulla stessa sottorete. Questi datagrammi non passeranno attraverso i router e quindi non verranno frammentati.
Sfortunatamente, alcuni host genereranno datagrammi IP contenenti 1500 byte, purché gli indirizzi IP Sorgente e Destinazione abbiano lo stesso numero di rete classful. Questo è l'unico caso in cui c'è un rischio di frammentazione quando tali datagrammi vengono etichettati. (Anche così, la frammentazione non è probabile a meno che il pacchetto non debba attraversare una ethernet di qualche tipo tra il momento in cui viene etichettato per la prima volta e il momento in cui viene de-etichettato.)
Questo documento specifica procedure che consentono di configurare la rete in modo che i grandi datagrammi provenienti da host che non implementano la Scoperta dell'MTU del Percorso vengano frammentati solo una volta, quando vengono etichettati per la prima volta. Queste procedure rendono possibile (assumendo una configurazione adeguata) evitare qualsiasi necessità di frammentare pacchetti che sono già stati etichettati.
3.1. Terminologia
Rispetto a un particolare collegamento dati, possiamo utilizzare i seguenti termini:
- Carico Utile del Frame (Frame Payload):
Il contenuto di un frame del collegamento dati, escludendo qualsiasi intestazione o coda del livello di collegamento dati (ad es., intestazioni MAC, intestazioni LLC, intestazioni 802.1Q, intestazione PPP, sequenze di controllo frame, ecc.).
Quando un frame trasporta un datagramma IP non etichettato, il Carico Utile del Frame è semplicemente il datagramma IP stesso. Quando un frame trasporta un datagramma IP etichettato, il Carico Utile del Frame è costituito dalle voci dello stack di etichette e dal datagramma IP.
- Dimensione Massima Convenzionale del Carico Utile del Frame (Conventional Maximum Frame Payload Size):
La dimensione massima del Carico Utile del Frame consentita dagli standard del collegamento dati. Ad esempio, la Dimensione Massima Convenzionale del Carico Utile del Frame per ethernet è 1500 byte.
- Dimensione Massima Reale del Carico Utile del Frame (True Maximum Frame Payload Size):
La dimensione massima del carico utile del frame che può essere inviata e ricevuta correttamente dall'hardware dell'interfaccia collegato al collegamento dati.
Su reti ethernet e 802.3, si ritiene che la Dimensione Massima Reale del Carico Utile del Frame sia 4-8 byte più grande della Dimensione Massima Convenzionale del Carico Utile del Frame (purché non sia presente né un'intestazione 802.1Q né un'intestazione 802.1p, e purché nessuna delle due possa essere aggiunta da uno switch o un bridge mentre un pacchetto è in transito verso il suo prossimo hop). Ad esempio, si ritiene che la maggior parte delle apparecchiature ethernet potrebbe inviare e ricevere correttamente pacchetti che trasportano un carico utile di 1504 o forse anche 1508 byte, almeno, purché l'intestazione ethernet non abbia un campo 802.1Q o 802.1p.
Sui collegamenti PPP, la Dimensione Massima Reale del Carico Utile del Frame può essere praticamente illimitata.
- Dimensione Massima Effettiva del Carico Utile del Frame per Pacchetti Etichettati (Effective Maximum Frame Payload Size for Labeled Packets):
Questa è o la Dimensione Massima Convenzionale del Carico Utile del Frame o la Dimensione Massima Reale del Carico Utile del Frame, a seconda delle capacità dell'apparecchiatura sul collegamento dati e della dimensione dell'intestazione del collegamento dati utilizzata.
- Datagramma IP Inizialmente Etichettato (Initially Labeled IP Datagram):
Supponiamo che un datagramma IP non etichettato venga ricevuto in un particolare LSR, e che l'LSR inserisca un'etichetta prima di inoltrare il datagramma. Tale datagramma sarà chiamato un Datagramma IP Inizialmente Etichettato in quell'LSR.
- Datagramma IP Precedentemente Etichettato (Previously Labeled IP Datagram):
Un datagramma IP che era già stato etichettato prima di essere ricevuto da un particolare LSR.
3.2. Dimensione Massima del Datagramma IP Inizialmente Etichettato
Ogni LSR che è in grado di
a) ricevere un datagramma IP non etichettato,
b) aggiungere uno stack di etichette al datagramma, e
c) inoltrare il pacchetto etichettato risultante,
DOVREBBE supportare un parametro di configurazione noto come "Dimensione Massima del Datagramma IP Inizialmente Etichettato", che può essere impostato su un valore non negativo.
Se questo parametro di configurazione è impostato a zero, non ha alcun effetto.
Se è impostato a un valore positivo, viene utilizzato nel seguente modo. Se:
a) viene ricevuto un datagramma IP non etichettato, e
b) quel datagramma non ha il bit DF impostato nella sua intestazione IP, e
c) quel datagramma deve essere etichettato prima di essere inoltrato, e
d) la dimensione del datagramma (prima dell'etichettatura) supera il valore del parametro,
allora a) il datagramma deve essere rotto in frammenti, ciascuno dei quali ha una dimensione non superiore al valore del parametro, e
b) ogni frammento deve essere etichettato e poi inoltrato.
Ad esempio, se questo parametro di configurazione è impostato a un valore di 1488, allora qualsiasi datagramma IP non etichettato contenente più di 1488 byte verrà frammentato prima di essere etichettato. Ogni frammento sarà in grado di essere trasportato su un collegamento dati da 1500 byte, senza ulteriore frammentazione, anche se vengono inserite fino a tre etichette nel suo stack di etichette.
In altre parole, impostare questo parametro a un valore diverso da zero consente di eliminare tutta la frammentazione dei Datagrammi IP Precedentemente Etichettati, ma può causare una frammentazione non necessaria dei Datagrammi IP Inizialmente Etichettati.
Si noti che l'impostazione di questo parametro non influisce sull'elaborazione dei datagrammi IP che hanno il bit DF impostato; quindi il risultato della scoperta dell'MTU del percorso non è influenzato dall'impostazione di questo parametro.
3.3. Quando i Datagrammi IP Etichettati sono Troppo Grandi?
Un datagramma IP etichettato la cui dimensione supera la Dimensione Massima Convenzionale del Carico Utile del Frame del collegamento dati su cui deve essere inoltrato PUÒ essere considerato "troppo grande".
Un datagramma IP etichettato la cui dimensione supera la Dimensione Massima Reale del Carico Utile del Frame del collegamento dati su cui deve essere inoltrato DEVE essere considerato "troppo grande".
Un datagramma IP etichettato che non è "troppo grande" DEVE essere trasmesso senza frammentazione.
3.4. Elaborazione dei Datagrammi IPv4 Etichettati che sono Troppo Grandi
Se un datagramma IPv4 etichettato è "troppo grande", e il bit DF non è impostato nella sua intestazione IP, allora l'LSR PUÒ scartare silenziosamente il datagramma.
Si noti che scartare tali datagrammi è una procedura sensata solo se la "Dimensione Massima del Datagramma IP Inizialmente Etichettato" è impostata a un valore diverso da zero in ogni LSR nella rete che è in grado di aggiungere uno stack di etichette a un datagramma IP non etichettato.
Se l'LSR sceglie di non scartare un datagramma IPv4 etichettato che è troppo grande, o se il bit DF è impostato in quel datagramma, allora DEVE eseguire il seguente algoritmo:
1. Rimuovere le voci dello stack di etichette per ottenere il datagramma IP.
2. Sia N il numero di byte nello stack di etichette (cioè, 4 volte il numero di voci dello stack di etichette).
3. Se il datagramma IP NON ha il bit "Don't Fragment" impostato nella sua intestazione IP:
a. convertirlo in frammenti, ciascuno dei quali DEVE essere almeno N byte inferiore alla Dimensione Massima Effettiva del Carico Utile del Frame.
b. Preporre a ogni frammento la stessa intestazione di etichetta che sarebbe stata sul datagramma originale se la frammentazione non fosse stata necessaria.
c. Inoltrare i frammenti
4. Se il datagramma IP ha il bit "Don't Fragment" impostato nella sua intestazione IP:
a. il datagramma NON DEVE essere inoltrato
b. Creare un Messaggio ICMP Destination Unreachable:
i. impostare il suo campo Codice [3] su "Fragmentation Required and DF Set",
ii. impostare il suo campo Next-Hop MTU [4] sulla differenza tra la Dimensione Massima Effettiva del Carico Utile del Frame e il valore di N
c. Se possibile, trasmettere il Messaggio ICMP Destination Unreachable alla sorgente del datagramma scartato.
3.5. Elaborazione dei Datagrammi IPv6 Etichettati che sono Troppo Grandi
Per elaborare un datagramma IPv6 etichettato che è troppo grande, un LSR DEVE eseguire il seguente algoritmo:
1. Rimuovere le voci dello stack di etichette per ottenere il datagramma IP.
2. Sia N il numero di byte nello stack di etichette (cioè, 4 volte il numero di voci dello stack di etichette).
3. Se il datagramma IP contiene più di 1280 ottetti (senza contare le voci dello stack di etichette), o se non contiene un'intestazione di frammento, allora:
a. Creare un Messaggio ICMP Packet Too Big, e impostare il suo campo Next-Hop MTU sulla differenza tra la Dimensione Massima Effettiva del Carico Utile del Frame e il valore di N
b. Se possibile, trasmettere il Messaggio ICMP Packet Too Big alla sorgente del datagramma.
c. scartare il datagramma IPv6 etichettato.
4. Se il datagramma IP non è più grande di 1280 ottetti, e contiene un'intestazione di frammento, allora
a. Convertirlo in frammenti, ciascuno dei quali DEVE essere almeno N byte inferiore alla Dimensione Massima Effettiva del Carico Utile del Frame.
b. Preporre a ogni frammento la stessa intestazione di etichetta che sarebbe stata sul datagramma originale se la frammentazione non fosse stata necessaria.
c. Inoltrare i frammenti.
Il riassemblaggio dei frammenti sarà fatto all'host di destinazione.
3.6. Implicazioni rispetto alla Scoperta dell'MTU del Percorso
Le procedure descritte sopra per la gestione dei datagrammi che hanno il bit DF impostato, ma che sono "troppo grandi", hanno un impatto sulle procedure di Scoperta dell'MTU del Percorso della RFC 1191 [4]. Gli host che implementano queste procedure scopriranno un MTU che è abbastanza piccolo da consentire l'inserimento di n etichette sui datagrammi, senza necessità di frammentazione, dove n è il numero di etichette che vengono effettivamente inserite lungo il percorso attualmente in uso.
In altre parole, i datagrammi provenienti da host che utilizzano la Scoperta dell'MTU del Percorso non avranno mai bisogno di essere frammentati a causa della necessità di inserire un'intestazione di etichetta, o di aggiungere nuove etichette a un'intestazione di etichetta esistente. (Inoltre, i datagrammi provenienti da host che utilizzano la Scoperta dell'MTU del Percorso hanno generalmente il bit DF impostato, e quindi non verranno comunque frammentati.)
Si noti che la Scoperta dell'MTU del Percorso funzionerà correttamente solo se, nel punto in cui deve verificarsi la frammentazione di un Datagramma IP etichettato, è possibile far instradare un messaggio ICMP Destination Unreachable all'indirizzo sorgente del pacchetto. Vedere la sezione 2.3.
Se non è possibile inoltrare un messaggio ICMP dall'interno di un "tunnel" MPLS all'indirizzo sorgente di un pacchetto, ma la configurazione di rete rende possibile per l'LSR all'estremità trasmittente del tunnel ricevere pacchetti che devono passare attraverso il tunnel, ma sono troppo grandi per passare attraverso il tunnel non frammentati, allora:
- L'LSR all'estremità trasmittente del tunnel DEVE essere in grado di determinare l'MTU del tunnel nel suo complesso. PUÒ farlo inviando pacchetti attraverso il tunnel all'endpoint ricevente del tunnel ed eseguendo la Scoperta dell'MTU del Percorso con quei pacchetti.
- Ogni volta che l'endpoint trasmittente del tunnel deve inviare un pacchetto nel tunnel, e quel pacchetto ha il bit DF impostato, e supera l'MTU del tunnel, l'endpoint trasmittente del tunnel DEVE inviare il messaggio ICMP Destination Unreachable alla sorgente, con codice "Fragmentation Required and DF Set", e il Campo Next-Hop MTU impostato come descritto sopra.