Programmazione.it v6.2
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Chat Forum
Uno studio sullo strato di rete (3/7)
Scritto da Francesco Corsentino il 10-01-2008 ore 12:32
Intel Software
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.
Precedente: Catturare il traffico di rete in Java con Jpcap
Successiva: Un metodo per integrare Erlang con Java
Copyright Programmazione.it™ 1999-2009. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.8 secondi. Sito ottimizzato per Mozilla Firefox. Powered by Kyron.