Nel precedente articolo avevamo accennato al problema — che è al contempo un requisito — dell'eterogeneità. Qui ci basta dire che ogni tipo di rete che un
datagram attraversa lungo il percorso da sorgente a destinazione può avere delle proprie regole, differenti rispetto alle altre reti. Il problema in sé è il fatto che un
datagram viene incapsulato in un pacchetto dello strato di collegamento e ogni rete attraversata può usare un differente protocollo di collegamento.
Ad esempio, una differenza consiste nel limite fissato per un pacchetto, limite che un
datagram deve rispettare. Ma tale limite non è conosciuto a priori e quindi può capitare di trovarsi di fronte un
datagram più grosso della dimensione massima consentita: come si fa? La soluzione è frammentare il
datagram, creandone di più piccoli tali da poter essere incapsulati tranquillamente in un pacchetto dello strato di collegamento. Da quel punto in poi circoleranno i vari frammenti del
datagram originale, i quali, giunti a destinazione, devono essere riordinati e assemblati a formare il
datagram originale: una sorta di ricostruzione attuata dal
receiver. Analizziamo i dettagli di queste operazioni.
Ogni tipo di rete definisce una unità massima trasmissibile,
MTU, ossia la quantità di dati massima per ogni
datagram. Se il protocollo dello strato di trasporto fornisce all’IP un pacchetto di dimensione maggiore a
MTU, allora l'host sorgente frammenterà tale pacchetto. Di questo pacchetto esisteranno in rete vari
datagram (appunto i frammenti del pacchetto originale da riassemblare, come detto). I progettisti di
IPv4 hanno fissato le seguenti semplici regole:
- un router si occupa di frammentare un pacchetto;
- dato che il riassemblaggio comporta un certo overhead di tempo di elaborazione e dato che il pacchetto originale ha senso soltanto per i terminali destinatari, allora l'operazione di riassemblaggio è eseguita solo da tali terminali.
Ma come fa un host ad accorgersi se ha ricevuto
datagram interi o frammenti? E come fa a ricostruirli visto che il modello di servizio di IP è inaffidabile? Infatti, dobbiamo sin da subito scartare l'ipotesi di affidarci ai tempi di consegna dei frammenti e all'ordine di consegna: il protocollo IP non garantisce né l'uno né l'altro. Qui entrano in gioco i campi
ident,
flags e
offset, contenuti nell'
header di ogni
datagram. Quando l'host sorgente crea i suoi
datagram, contrassegna ciascuno di essi con un numero di identificazione, che viene incrementato ad ogni
datagram spedito.
Qualora un router abbia necessità di frammentare il
datagram, esso lascerà inalterato il numero di identicazione e agirà sul
flag M (o
bit more) impostandolo ad 1 a significare che a quel
datagram ne seguiranno altri, ossia che si tratta di frammenti di un singolo pacchetto. L'ultimo
datagram ha il
flag M impostato a 0. Con il campo
offset il router informa quale parte del pacchetto originario il
datagram copre. In verità, il campo
offset conta spezzoni di 8 byte e il motivo è il seguente: i progettisti di
IPv4 decisero che il confine della frammentazione doveva avvenire ad un valore multiplo di 8 byte. Vedremo un esempio chiarificatore nel prossimo articolo.