Multiplexing e Demultiplexing
In questo articolo vedremo il concetto di multiplexing, cioè come il servizio di trasporto da host a host fornito dal livello di rete possa diventare un servizio di trasporto da processo a processo per le applicazioni in esecuzione sugli host.
Per semplificare, tratteremo questo servizio di base del livello di trasporto nel contesto di Internet, anche se il servizio di multiplexing e demultiplexing è presente in tutte le reti di calcolatori.
Nell’host destinatario, il livello di trasporto riceve segmenti dal livello di rete immediatamente sottostante.
Il livello di trasporto ha il compito di consegnare i dati di questi segmenti al processo applicativo appropriato in esecuzione nell’host.
Consideriamo un esempio; supponiamo che vi troviate di fronte al vostro pc e che stiate scaricando pagine web mentre sono in esecuzione una sessione FTP e due Telnet.
Avrete pertanto quattro processi applicativi in esecuzione: due Telnet, uno FTP e uno HTTP. Quando il livello di trasporto nel vostro calcolatore riceve dati dal livello di rete sottostante, deve indirizzare i dati ricevuti a uno di questi quattro processi.
Vediamo come viene realizzata tale operazione.
Innanzitutto ricordiamo che un processo può presentare una o più socket, porte attraverso le quali i dati fluiscono dalla rete al processo e viceversa.
Di conseguenza, il livello di trasporto nell’host di ricezione in realtà non trasferisce i dati direttamente a un processo, ma piuttosto a una socket intermedia.
Siccome, a ogni dato istante, può esserci più di una socket nell’host di ricezione, ciascuna avrà un identificatore univoco il cui formato dipende dal fatto che si tratti di socket UDP o TCP.
Consideriamo ora come l’host in ricezione indirizzi verso la socket appropriata il segmento a livello di trasporto in ingresso.
Ciascun segmento a livello di trasporto ha vari campi deputati allo scopo. Sul lato di ricezione, il livello di trasporto esamina questi campi per identificare la socket di ricezione e quindi vi dirige il segmento.
Il compito di trasportare i dati dei segmenti a livello di trasporto verso la giusta socket viene detto demultiplexing.
Il compito di radunare le porzioni di dati presso l’host origine a partire da diverse socket, incapsularle con informazioni di intestazione per formare segmenti e passarli al livello di rete, viene detto multiplexing.
Si noti che il livello di trasporto nell’host centrale della figura deve effettuare il demultiplexing dei segmenti che arrivano dal livello di rete sottostante ai processi P1 e P2; ciò avviene indirizzando i dati del segmento in ingresso alla corrispondente socket di processo.
Il livello di trasporto nell’host centrale deve, inoltre raccogliere i dati in uscita da queste socket, formare i segmenti a livello di trasporto e passarli al livello di rete.
Sebbene abbiamo introdotto il multiplexing e il demultiplexing nel contesto dei protocolli di trasporto Internet, è importante rendersi conto che queste funzioni hanno uno specifico interesse ogni volta che un singolo protocollo a un certo livello (trasporto o qualsiasi altro) è utilizzato da vari protocolli di livello immediatamente superiore.
Per mostrare il compito del multiplexing e del demultiplexing, immaginiamo che Luca effettua un’operazione di multiplexing quando raccoglie le lettere dai mittenti e le imbuca.
Nel momento in cui Marco riceve le lettere dal postino, effettua un’operazione di demultiplexing, leggendo il nome riportato sopra la busta e consegnando ciascuna missiva al rispettivo destinatario.
Ora che abbiamo compreso i ruoli del multiplexing e del demultiplexing a livello di trasporto, esaminiamo come vengono realizzati negli host.
Multiplexing e Demultiplexing in un Host
Da quanto visto in precedenza, sappiamo che il multiplexing a livello di trasporto richiede:
- che le socket abbiano identificatori unici
- che ciascun segmento presenti campi che indichino la socket cui va consegnato il segmento.
Questi sono il campo numero di porta origine e il campo numero di porta destinazione.
I segmenti TCP e UDP presentano anche altri campi.
I numeri di porta sono di 16 bit e vanno da 0 a 65535, quelli che vanno da 0 a 1023 sono chiamati numeri di porta noti (well-known port number) e sono riservati ai protocolli applicativi quali HTTP (porta 80) e FTP (porta 21).
Quando sviluppiamo una nuova applicazione, occorre assegnarle un numero di porta.
Ora dovrebbe essere chiaro come il livello di trasporto possa implementare il servizio di demultiplexing: ogni socket nell’host deve avere un numero di porta, e quando un segmento arriva all’host il livello di trasporto esamina il numero di porta destinazione e dirige il segmento verso la socket corrispondente.
I dati del segmento passano quindi, dalla socket al processo assegnato. Questo è fondamentalmente il modo in cui agisce UDP, mentre il multiplexing/demultiplexing in TCP è ancora più raffinato.