22.5 Reti per trasmissione dati
In questa sezione illustriamo le particolarità legate alla trasmissione dati, e come possa essere vantaggiosamente sfruttata per conseguire la maggiore efficienza che i sistemi di servizio a coda presentano rispetto a quelli orientati alla perdita. Le particolari modalità e funzioni legate alle trasmissioni dati saranno classificate secondo uno schema che ne consente il confronto in termini di prestazioni e vincoli sulla realizzazione della rete. Infine, verranno formalizzati modelli operativi volti alla soluzione dei problemi di trasmissione dati, introducendo i concetti legati alle architetture protocollari, assieme ad alcuni esempi reali.
Le trasmissioni dati si prestano bene a comunicazioni in cui siano possibili ritardi temporali variabili, attuando una filosofia di tipo ad immagazzinamento e rilancio (store and forward) basata sul suddividere il messaggio in unità informative elementari denominate pacchetti, che possono essere inoltrati sulla rete di comunicazione assieme a quelli prodotti da altre trasmissioni. L’applicazione della stessa metodologia a trasmissioni (ad esempio) vocali non è scontato, in quanto la presenza di un ritardo variabile per la trasmissione dei pacchetti comporta problemi non trascurabili, a meno di attuare speciali meccanismi di priorità e prenotazione della banda.
22.5.1 Il pacchetto dati
Discutiamo brevemente, in termini generali, i possibili contenuti di un pacchetto dati; il suo formato effettivo dipenderà dal particolare protocollo di trasmissione adottato.
La prima osservazione da fare è che suddividendo il messaggio in pacchetti è necessario prevedere un aumento delle informazioni da trasmettere, dato che ognuni pacchetto dovrà contenere informazioni addizionali per consentire un suo corretto recapito e la sua ricombinazione con gli altri pacchetti dello stesso messaggio. Occorre inoltre affrontare gli ulteriori problemi tipici di una comunicazione dati, ovvero come contrastare gli errori di trasmissione, e come gestire le risorse di rete.
In termini generali, un pacchetto è composto da una
intestazione (
header), dalla parte di messaggio che trasporta (
dati), e da un campo
codice di parità (
crc) necessario a rivelare l’occorrenza di errori di trasmissione. L’
header a sua volta può essere suddiviso in campi, in cui trovano posto (tra le altre cose) gli
indirizzi del destinatario e della sorgente, un
codice di controllo che causa in chi lo riceve l’esecuzione di una procedura specifica, un
numero di sequenza che identifica il pacchetto all’interno del messaggio originale, ed un campo che indica la
lunghezza del pacchetto. Nonostante la presenza delle informazioni aggiuntive, la trasmissione a pacchetto consegue una efficienza maggiore di quella a circuito, in quanto è attuata mediante sistemi a coda.
Può sembrare vantaggioso mantenere la dimensione dei pacchetti elevata, riducendo così la rilevanza delle informazioni aggiuntive, ma si verificano controindicazioni. Infatti, suddividere messaggi lunghi in pacchetti più piccoli garantisce l’inoltro di (altre) comunicazioni più brevi durante la trasmissione di messaggi lunghi, che altrimenti
bloccherebbero i sistemi di coda se realizzate con un unico “pacchettone”: in figura è mostrato un esempio in cui
B, presentandosi in ingresso al multiplexer con lieve
anticipo rispetto agli altri pacchetti più piccoli, ne impedisce l’inoltro, monopolizzando la linea di uscita per tutta la durata della sua trasmissione.
Infine, all’aumentare della lunghezza di un pacchetto aumenta proporzionalmente la probabilità di uno (o più) bit errati (vedi anche la formula (
21.27) a pag.
1 e la discussione al §
22.6.2.3), e dunque l’uso di dimensioni contenute riduce le necessità di ritrasmissione.
22.5.2 Modo di trasferimento delle informazioni
È definito in base alla specificazione di 3 caratteristiche che lo contraddistinguono: lo schema di multiplazione, il principio di commutazione e l’architettura protocollare.
22.5.2.1 Schema di multiplazione
Al §
24.3.1 è descritto uno schema a divisione di tempo che prevede l’uso di una
trama in cui trovano posto diverse comunicazioni vocali, e che necessita di un funzionamento sincronizzato (o quasi) dei nodi di rete. La trasmissione
a pacchetto invece non prevede l’uso esclusivo di risorse da parte delle singole comunicazioni e
non fa uso di una struttura di trama; pertanto si rendono necessarie soluzioni idonee alla
delimitazione dei pacchetti.
Ad esempio, i protocolli
hdlc ed
x.25 presentano pacchetti di dimensione variabile, e fanno uso di un byte di
flag (vedi pag.
1) costituito dalla sequenza
01111110 in testa ed in coda, per separare tra loro i pacchetti di comunicazioni differenti. Per evitare che i dati “propri” del pacchetto possano simulare un flag, in trasmissione viene inserito un bit
0 dopo
5 uni di fila, che (se presente) viene rimosso al ricevitore. Se dopo
5 uni c’è ancora un
1 (e poi uno zero), allora è un flag.
Nel caso in cui il pacchetto invece abbia una
dimensione fissa, ci si trova ad operare in una situazione simile a quella in presenza di trama, tranne che... la trama non c’è, e dunque l’ordine dei pacchetti è qualsiasi, ma viene meno l’esigenza dei flag di delimitazione.
In entrambi i casi (lunghezza di pacchetto fissa o variabile) i nodi della rete non necessitano di operare in sincronismo tra loro; lo schema di multiplazione è quindi detto
a divisione di tempo senza organizzazione di trama, asincrono, con etichetta. Il termine etichetta (o
label) indica che ogni pacchetto deve recare con sé le informazioni idonee a ricombinarlo assieme agli altri dello stesso messaggio.
22.5.2.2 Principio di commutazione
È definito in base a come sono realizzate le due funzioni di
instradamento, ovvero come individuare un percorso nella rete, e di
attraversamento, ossia come permettere l’inoltro del messaggio tra le porte di ingresso e di uscita del commutatore.
Se
l’instradamento (
routing)
viene determinato una volta per tutte all’inizio del collegamento, il modo di trasferimento viene detto
con connessione. Se al contrario l’instradamento avviene in modo indipendente per ogni pacchetto, il collegamento è detto
senza connessione ed ogni pacchetto di uno stesso messaggio può seguire percorsi differenti.
L’attraversamento di un nodo di rete consiste invece nel
demultiplare le informazioni in ingresso e multiplarle di nuovo su uscite diverse: ciò può avvenire mediante un
collegamento diretto o per
immagazzinamento e rilancio.
Sulla base di queste considerazioni, definiamo:
Commutazione di circuito
:
l’instradamento avviene una volta per tutte prima della comunicazione, e l’attraversamento impegna in modo permanente ed esclusivo le risorse fisiche dei nodi della rete; è il caso della telefonia, sia pots che pcm.
Commutazione di pacchetto
a
circuito virtuale:
L’instradamento è determinato
una volta per tutte prima dell’inizio della trasmissione, durante una fase di
setup delle risorse necessarie, conseguente alla
richiesta di connessione effettuata da parte del nodo sorgente. Dopodiché i pacchetti di uno stesso messaggio seguono tutti lo stesso percorso, e l’attraversamento si basa sull’impegno di
risorse logiche ed avviene per
immagazzinamento e rilancio. La trasmissione ha luogo dopo aver contrassegnato ogni pacchetto con un
identificativo di connessione (
ic) che individua un
canale virtualetra coppie di nodi di rete, che ne identifica l’appartenenza ad uno dei collegamenti in transito.
L’intestazione del pacchetto può essere ridotta, al limite, a contenere il solo
ic del canale virtuale. L’attraversamento avviene consultando apposite tabelle (di
routing), generate nella fase di setup che precede quella di trasmissione, in cui è indicata la porta di uscita per tutti i pacchetti appartenenti ad uno stesso messaggio. Facciamo un
esempio, riferendoci allo schema di fig.
22.21: una sorgente, a seguito della fase di instradamento, invia i pacchetti con identificativo
ic = 1 al primo nodo individuato dal routing. Consultando la propria tabella, il nodo trova che il canale virtuale
1 sulla
porta di ingresso (
pi)
A si connette al c.v.
3 sulla
porta di uscita (
pu)
C. Ora i pacchetti escono da
C con
ic = 3 ed una volta giunti al nodo seguente sulla
pi A, escono dalla
pu B con
ic = 2 e giungono finalmente a destinazione. Notiamo che su di un collegamento
tra due nodi, i numeri dei canali virtuali identificano in modo univoco il collegamento a cui appartengono i pacchetti, mentre uno stesso numero di canale virtuale può essere riutilizzato su porte differenti.
La concatenazione dei canali virtuali attraversati viene infine indicata con il termine Circuito Virtuale per similitudine con il caso di commutazione di circuito, con la differenza che ora il percorso individuato è definito solo in termini di tabelle e di etichette, e non di risorse fisiche (tranne che per la memoria della tabella).
Al termine della comunicazione, sul circuito virtuale viene inviato un apposito pacchetto di controllo, che provoca la rimozione del routing dalle tabelle.
Congestione
e controllo di flusso
Durante la fase di instradamento, il percorso nella rete è determinato in base alle condizioni di traffico del momento, ed eventualmente la connessione può essere rifiutata nel caso in cui la memoria di coda nei nodi coinvolti sia quasi esaurita, evento indicato con il termine di congestione.
D’altra parte, se alcune sorgenti origine dei canali virtuali già assegnati e che si incrociano in uno stesso nodo intermedio iniziano ad emettere pacchetti a frequenza più elevata del previsto, il nodo intermedio si congestiona (ossia esaurisce la memoria di transito) ed inizia a perdere pacchetti, penalizzando anche i canali virtuali delle altre connessioni che attraversano il nodo.
Per questo motivo, sono indispensabili strategie di controllo di flusso che permettano ai nodi di regolare l’emissione delle sorgenti. Il controllo di flusso è attuato anch’esso mediante pacchetti (di controllo), privi del campo di dati, ma contenenti un codice identificativo del comando che rappresentano. Ad esempio, un nodo non invia nuovi pacchetti di un circuito virtuale finché non riceve un pacchetto di riscontro relativo ai pacchetti precedenti. D’altra parte, nel caso di una rete congestionata, la perdita di pacchetti causa il mancato invio dei riscontri relativi, e dunque i nodi a monte cessano l’invio di nuovi pacchetti. Dopo un certo periodo di tempo (timeout) il collegamento è giudicato interrotto e viene generato un pacchetto di Reset da inviare sul canale virtuale, e che causa, nei nodi attraversati, il rilascio delle risorse logiche (tabelle) relative al canale virtuale.
Discutiamo ora invece di un ulteriore possibile principio di commutazione:
Commutazione di pacchetto
a
datagramma
Anche in questo caso
l’attraversamento dei nodi avviene per
immagazzinamento e rilancio, mentre la funzione di
instradamento è svolta in modo distribuito tra i nodi di rete
per ogni pacchetto, il quale (chiamato ora
datagramma) deve necessariamente contenere l’indirizzo completo della destinazione. Infatti, in questo caso manca del tutto la fase iniziale del collegamento, in cui prenotare l’impegno delle risorse (fisiche o logiche) che saranno utilizzate. Semplicemente, non è previsto alcun impegno a priori, ed ogni pacchetto costituisce un collegamento individuale che impegna i nodi di rete solo per la durata del proprio passaggio. L’instradamento avviene mediante tabelle presenti nei nodi, di tipo sia statico che dinamico (nel qual caso tengono conto delle condizioni di carico e di coda dei nodi limitrofi) che indicano le possibili porte di uscita per raggiungere la destinazione scritta sul pacchetto. Quest’ultimo quindi viene fatto uscire
senza nessuna alterazione dalla porta di uscita.
Uno dei maggiori vantaggi dei datagrammi rispetto ai circuiti virtuali è una migliore resistenza ai guasti e malfunzionamenti: in questo caso infatti, a parte una eventuale necessità di ritrasmettere i pacchetti persi, il collegamento prosegue attraverso percorsi alternativi; inoltre l’elevato numero di percorsi alternativi, può permettere (in condizioni di carico leggero) di soddisfare brevi richieste di trasmissione a velocità elevate. Allo stesso tempo, in presenza di messaggi molto brevi, l’invio di un singolo datagramma è più che sufficiente, mentre nel caso a circuito virtuale le fasi di instaurazione ed abbattimento sarebbero state un lavoro in più da svolgere (tanto che ad es. l’X.25, che è nato a c.v., prevede anche il funzionamento a datagramma).
Consegna ordinata e congestione
Uno dei maggiori problemi legati all’uso di datagrammi è che l’ordine di arrivo dei pacchetti può essere diverso da quello di partenza, potendo questi seguire percorsi differenti. Per questo motivo, nei datagrammi è presente un
numero di sequenza che si incrementa ad ogni pacchetto trasmesso, ed alla destinazione sono predisposti dei
buffer di memoria nei quali ricostruire l’ordine esatto dei pacchetti.
Nel caso di un pacchetto mancante, il ricevente non sa se questo è semplicemente ritardato oppure è andato perso, rendendo problematico il controllo di flusso. In questo caso si produce un impegno anomalo dei buffer di ingresso, che non possono essere rilasciati perché incompleti, e ciò può causare il rifiuto dell’accettazione di nuovi pacchetti, provocando un impegno anomalo anche per i buffer di uscita di altri nodi, causando congestione.
Prima di effettuare un trasferimento a datagramma, è opportuno (a parte il caso di messaggi composti da un singolo datagramma) verificare la disponibilità del destinatario finale, e preavvisarlo di riservare una adeguata quantità di memoria. Ad esempio, in Internet avviene proprio questo (vedi pag.
1).
Proseguiamo la descrizione delle reti per dati con l’ultima caratteristica di un modo di trasferimento:
22.5.2.3 Architettura protocollare
Definisce la stratificazione delle funzioni di comunicazione, sia per gli apparati terminali che per i nodi di transito, e di come queste interagiscono reciprocamente sia tra nodi diversi, che nell’ambito di uno stesso nodo. Alcune di queste sono già state introdotte, e le citiamo per prime, seguite da quelle più rilevanti illustrate di seguito:
- il controllo di flusso, che impedisce la saturazione dei buffer;
- la consegna ordinata, per riassemblare messaggi frammentati su più datagrammi;
- la segmentazione e riassemblaggio, che definisce le regole per frammentare un messaggio in pacchetti e ricomporli, ad esempio in corrispondenza dei “confini” tra sottoreti con differente lunghezza di pacchetto;
- il controllo di connessione, che provvede ad instaurare la connessione, eseguire l’instradamento, impegnare le risorse, supervisionare il controllo di flusso, abbattere la connessione al suo termine;
- il controllo di errore, che provvede a riscontrare le unità informative, a rilevare gli errori di trasmissione, a gestire le richieste di trasmissione;
- l’incapsulamento, che aggiunge ai pacchetti di dati da trasmettere le informazioni di protocollo come l’header, gli indirizzi, il controllo di parità...
Per aiutare nella schematizzazione delle interazioni tra le funzioni illustrate, l’
International Standard Organization (
iso) ha formalizzato un modello concettuale per sistemi di comunicazione denominato
Open System Interconnection (
osi), che individua una relazione gerarchica tra i protocolli. In particolare sono definiti sette
strati o
livelli (
layers) ognuno dei quali raggruppa un insieme di funzioni affini. Gli strati più elevati (4-7) sono indicati anche come
strati di utente, in quanto legati a funzioni relative ai soli apparati terminali; gli
strati di transito invece (1-3) riguardano funzioni che devono essere presenti anche nei nodi intermedi.
La relazione gerarchica individuata stabilisce tra due strati contigui un rapporto di tipo
utente-servizio; ovvero lo svolgimento delle funzioni di strato superiore necessita dei servizi offerti dallo strato inferiore. A titolo di esempio, si pensi all’invio di un documento mediante un corriere espresso: ci si affida allora ad uno strato di trasporto che offre all’utente (strato di sessione) un servizio (appunto) di trasporto che ha il compito di “far apparire” il documento presso il destinatario. La sede locale del corriere si affida quindi alla propria divisione interna che gestisce la rete dei corrispondenti, la quale si affida a sua volta ai corrispondenti stessi, che hanno il compito di assistere alla consegna ed all’arrivo (collegamento) del documento. Il trasferimento fisico dello stesso può quindi avvenire mediante un ultimo strato funzionale (treno, nave, aereo, auto...) che provvede al recapito in base alle informazioni ricevute dallo strato di collegamento.
Per terminare l’esempio, facciamo notare come in ogni livello avvengano due tipi di colloqui (regolati da altrettanti protocolli): uno è orizzontale, detto anche tra pari (peer-to-peer), come è ad esempio il contenuto del documento che spediamo, od i rapporti tra corrispondenti locali (che nel caso di un sistema di comunicazione corrisponde allo strato di collegamento, relativo ai protocolli tra singole coppie di nodi di rete); il secondo tipo di colloquio avviene invece in forma verticale, o tra utente e servizio, in quanto per realizzare le funzioni di uno strato utente ci si affida ad un servizio di comunicazione offerto dallo strato inferiore (che a sua volta può avvalersi dei servizi degli altri strati ancora inferiori).
La modalità con cui un protocollo tra pari di strato
N affida i suoi dati ad un servizio di strato
N − 1, si avvale (nella commutazione di pacchetto) della funzione di
incapsulamento, di cui viene data una interpretazione grafica alla figura seguente. I dati che lo strato
N + 1 vuol trasmettere al suo pari, indicati anche come
Service Data Unit (
sdu), sono prefissi dalle informazioni di protocollo necessarie alla gestione del collegamento tra entità allo strato
N. Questa nuova unità informativa prende il nome di
Protocol Data Unit (
pdu) per lo strato
N, e viene passata in forma di
sdu al servizio di collegamento offerto dallo strato
N − 1, che ripete l’operazione
di incapsulamento con le proprie informazioni di protocollo, generando una nuova
pdu (di strato
N − 1). Pertanto, lo strato fisico provvederà a trasmettere pacchetti contenenti tutte le informazioni di protocollo degli strati superiori.
Indipendenza dei servizi tra pari dal servizio di collegamento
Quando uno strato affida il collegamento con un suo pari allo strato inferiore, quest’ultimo può mascherare al superiore la modalità con cui viene realizzato il trasferimento.
In particolare, se ci riferiamo all’interfaccia tra gli strati di trasporto e di rete, lo strato di rete può realizzare con il suo pari collegamenti con o senza connessione, mentre quello di trasporto offre allo stesso tempo (ma in modo indipendente) agli strati superiori un servizio con o senza connessione, dando luogo alle seguenti 4 possibilità:
SNA (system network architecture) è una architettura proprietaria IBM, in cui il trasferimento avviene in modo ordinato, richiedendo al livello di trasporto un circuito virtuale, che è realizzato da una serie di canali virtuali tra i nodi di rete. La stessa architettura è adottata anche dall’X.25, che costituisce l’insieme di protocolli che descrivono il funzionamento di reti pubbliche a commutazione di pacchetto, presenti in tutto il mondo: quella italiana prende il nome di itapac.
Arpanet è l’architettura di Internet, in cui sebbene lo strato di rete operi con un principio di commutazione a datagramma, mediante il protocollo IP (internet protocol), lo strato di trasporto (TCP, transfer control program) offre a quelli superiori un servizio con connessione, attuato mediante circuiti virtuali, in modo da garantire il corretto sequenziamento delle unità informative, ed offrire canali di comunicazione formalmente simili ai files presenti localmente su disco. Il mascheramento del servizio di rete interna a datagramma in un servizio con connessione avviene a carico dello strato TCP di trasporto presente nei nodi terminali, che appunto affronta il riassemblaggio ordinato dei datagrammi ricevuti dallo strato di rete.
Decnet è (o meglio era) l’architettura Digital, in cui il controllo di errore, la sequenzializzazione, ed il controllo di flusso sono realizzati dal livello di trasporto.
Soluzione insolita non è praticata perché equivale a fornire alla rete pacchetti disordinati, farli consegnare nello stesso identico disordine a destinazione, dove poi sono riassemblati. Può avere un senso se la comunicazione è sporadica, ma sempre per la stessa destinazione, nel qual caso somiglia ad un circuito virtuale permanente.