Audio Networking – Introduzione alle reti locali 3
parte 3
di Michele Viola
modelli a strati
Nel numero scorso abbiamo accennato al concetto di “modello a strati”, alla base delle varie architetture di rete. Si tratta, in sostanza, di un metodo per ridurre la complessità del problema di trasporto dei dati suddividendolo in diversi sotto-problemi più semplici, ciascuno dei quali realizza una parte del compito. Nel seguito userò indifferentemente, in pratica come sinonimi, i termini “strati” o “livelli”. La lista dei protocolli di comunicazione utilizzati dai vari sistemi, un protocollo per ciascuno strato, è chiamata stack (cioè “pila”, o “catasta”).
Tra le questioni da tenere in conto, la cui gestione va opportunamente suddivisa tra i vari protocolli, c’è ad esempio il controllo degli errori, perché i circuiti che realizzano la comunicazione fisica non sono perfetti. Sono disponibili svariati meccanismi per il rilevamento e la correzione degli errori e, in ogni caso, entrambi gli estremi della connessione devono accordarsi sul sistema da utilizzare. Il ricevitore dovrà anche avere un modo per informare il mittente su quali messaggi sono stati ricevuti e quali non lo sono stati.
Non tutti i canali di comunicazione conservano l’ordine dei messaggi spediti. Per gestire la possibile perdita della sequenza corretta, il protocollo deve esplicitamente comprendere un metodo che permetta al ricevitore di rimettere insieme i pezzi nel giusto ordine.
Occorrerà poi evitare che un trasmettitore veloce possa sovraccaricare di dati un ricevitore più lento. Diverse soluzioni sono state proposte e utilizzate, tra le quali alcune implicano qualche tipo di feedback dal ricevitore al trasmettitore, diretto o indiretto, a proposito della situazione corrente del ricevitore stesso; altre limitano il trasmettitore ad un accordo preventivo sulla velocità di trasmissione.
Un altro problema che deve essere risolto, a diversi livelli, è l’incapacità di tutti i processi di gestire messaggi arbitrariamente lunghi. Questo porta alla necessità di un meccanismo per disassemblare, trasmettere e quindi riassemblare i messaggi. Analogamente, occorre decidere cosa fare quando alcuni processi insistono nel trasmettere dati in unità così piccole che inviarle separatamente è semplicemente inefficiente; qui la soluzione è quella di riunire diversi piccoli messaggi destinati ad uno stesso ricevitore in un unico messaggio di dimensioni adeguate, per poi disassemblare il pacchetto una volta giunto a destinazione.
Quando le entità intercomunicanti sono più di due su uno stesso tratto, può non essere conveniente instaurare una connessione separata per ogni coppia di interlocutori, per cui uno strato sottostante può decidere di usare la stessa connessione per diverse comunicazioni scorrelate tra loro. Finché questo processo di multiplexing e demultiplexing è svolto in maniera trasparente, può essere utilizzato da qualunque strato. Il multiplexing è necessario nello strato fisico, ad esempio, quando tutto il traffico per tutte le connessioni deve essere trasportato attraverso un numero limitato di circuiti fisici.
Quando ci sono diverse vie possibili tra sorgente e destinazione, occorre scegliere una strada. A volte questa decisione può essere suddivisa tra diversi livelli. Ad esempio, per spedire dei dati da Londra a Roma, una decisione di alto livello può essere quella di transitare per la Francia o per la Germania basandosi sulle rispettive leggi sulla privacy, mentre una decisione di basso livello può essere presa per scegliere uno dei diversi circuiti disponibili sulla base del carico di traffico corrente.
Ogni servizio può essere caratterizzato da una corrispondente qualità. Alcuni servizi di comunicazione sono affidabili, nel senso che non perdono dati. Solitamente, un servizio affidabile è implementato tramite un messaggio del destinatario in risposta ad ogni messaggio inviato, cosicché il mittente è sicuro che i suoi messaggi siano arrivati (i messaggi di conferma dell’avvenuta ricezione sono detti acknowledgement). Questo processo introduce però ritardi e aumenta la quantità di dati sul bus di trasporto, cosa che a volte si può sopportare ma altre volte no.
Servizi connection-oriented e servizi connectionless
Un servizio con connessione (connection-oriented) si può pensare che funzioni sul modello delle comunicazioni telefoniche: per parlare con qualcuno occorre sollevare la cornetta, fare il numero, una volta instaurata la comunicazione si parla e, alla fine, si chiude il canale riappendendo la cornetta. Una connessione di questo tipo è come un tubo, definito contestualmente alla richiesta di instaurare la comunicazione (ovvero componendo il numero): il mittente inserisce oggetti da una parte e il destinatario li tira fuori dall’altra, nello stesso ordine in cui sono stati inviati.
La commutazione senza connessione (connectionless), al contrario, funziona secondo il modello del sistema postale: ogni messaggio (lettera) contiene l’indirizzo di destinazione completo ed è instradato attraverso il sistema indipendentemente dagli altri. Normalmente, quando due messaggi sono inviati alla stessa destinazione, quello inviato per primo arriva prima a destinazione; è comunque possibile che il primo incontri qualche ostacolo per cui il secondo arrivi a destinazione per primo. Con un servizio connection-oriented questo non succede.
Tra i possibili modelli implementativi dell’architettura a strati, si può affermare che quelli in qualche modo rilevanti per le moderne architetture di rete sono due: il modello ISO/OSI e il modello TCP/IP.
Il modello ISO/OSI si basa su una proposta sviluppata dall’ISO (International Standard Organization) come un primo passo verso una standardizzazione a livello internazionale dei protocolli utilizzati nei vari strati. OSI sta per Open Systems Interconnection e si occupa proprio della connessione tra sistemi aperti, ovvero aperti per la comunicazione con altri sistemi.
il modello ISO/OSI
Il modello OSI prevede sette strati.
Il livello fisico
Si occupa del trasferimento grezzo dei bit. Questioni tipiche, rilevanti a livello fisico, sono: quanti volt rappresentano un 1 e quanti uno zero, quanti microsecondi deve durare un bit, quanti pin deve avere il connettore e a cosa serve ciascun pin...
Il livello di linea, o di collegamento (data link)
Generalmente divide i dati da trasmettere in frame e li trasmette in sequenza, occupandosi del controllo degli errori di trasmissione e della gestione degli acknowledgement (ovvero delle conferme di ricezione). È compito di questo strato rispedire i frame non ricevuti e gestire i duplicati (tra l’altro possono andare persi anche pacchetti di acknowledge). Dato che lo strato fisico si occupa solo della mera trasmissione di bit senza nessun riferimento ad un’eventuale struttura dei dati, lo strato di linea si deve anche occupare di riconoscere i limiti dei singoli frame; questo si ottiene tipicamente attaccando in testa ed in coda a ciascun frame dei pattern di bit riconoscibili e quindi va in qualche modo gestita un’eventuale occorrenza accidentale di questo pattern all’interno del flusso di dati. Un altro compito del livello di linea, che coinvolge spesso anche diversi strati superiori, è quello di gestire un’eventuale differenza nella capacità di scambio di dati tra i due estremi del collegamento, ovvero di evitare di sovraccaricare un ricevitore lento con una trasmissione troppo veloce. Qualche meccanismo di regolazione del traffico deve essere impiegato perché il trasmettitore sia informato sullo spazio di buffer attualmente libero al ricevitore. Spesso questa regolazione del flusso è integrata con la gestione degli errori.
Le reti broadcast hanno un problema ulteriore nel livello di linea: come controllare l’accesso al canale condiviso. Un particolare sottolivello dello strato data link, detto “sottolivello di accesso al mezzo” (medium access sublayer), si occupa di questo problema.
Il livello di rete
Divide in pacchetti i flussi provenienti dal livello superiore e si occupa di scegliere la strada per i pacchetti. Una specifica di progetto fondamentale riguarda il determinare come i pacchetti vengono instradati dalla sorgente alla destinazione. Il percorso attraversa infatti in genere varie stazioni intermedie (router). Se troppi pacchetti fossero presenti contemporaneamente in prossimità di una stazione, si ostacolerebbero reciprocamente formando ingorghi. Il controllo di tali congestioni ricade anch’esso sullo strato di rete.
Quando un pacchetto deve viaggiare da una rete ad un’altra per raggiungere la sua destinazione, possono sorgere diversi problemi: lo schema di indirizzamento utilizzato dalla seconda rete può essere differente da quello della prima; la seconda può non accettare il pacchetto perché troppo grande; il protocollo può essere differente e così via. È compito dello strato di rete superare questo tipo di problemi, per permettere l’interconnessione di reti eterogenee.
Il livello di trasporto
È il primo vero strato end-to-end, ovvero a livello di trasporto il dialogo riguarda la macchina sorgente e la macchina destinazione, mentre i livelli sottostanti vedono il proprio immediato vicino.
Il livello di trasporto decide quante connessioni di rete aprire e di che tipo. Il tipo più popolare di connessione a livello di trasporto è un canale punto-punto libero da errori che trasporta messaggi o byte nell’ordine in cui vengono spediti. Altri possibili servizi di trasporto offrono il trasporto di messaggi singoli senza garanzie circa l’ordine di arrivo e il broadcasting di messaggi verso destinazioni multiple.
Spesso su ciascuna macchina girano contemporaneamente diversi processi, per cui solitamente una macchina è contemporaneamente mittente e destinatario di diverse comunicazioni. Deve esserci quindi un modo per determinare quale messaggio appartiene a quale connessione; l’intestazione aggiunta a livello di trasporto è un posto in cui può essere messa questa informazione.
Il livello sessione
Tiene traccia dei turni nel dialogo, evita che due parti tentino di compiere la stessa operazione nello stesso momento, si occupa della sincronizzazione.
Il livello presentazione
A differenza dei livelli sottostanti, che più che altro si occupano di muovere bit, lo strato di presentazione si occupa di sintassi e semantica dell’informazione trasmessa. Rende possibile la comunicazione tra macchine con differenti rappresentazioni dei dati.
Il livello applicazione
È lo strato più vicino all’utente. Un esempio di protocollo a livello applicazione è HTTP (HyperText Transfer Protocol), che è alla base del World Wide Web. Quando un browser vuole una pagina web, invia il nome della pagina al server usando il protocollo HTTP e il server risponde inviando la pagina. Altri protocolli sono utilizzati per altre applicazioni, come FTP (File Transfer Protocol) per il trasferimento dei file, SMTP (Simple Mail Transfer Protocol) per le e‑mail e NNTP (Network News Transfer Protocol) per i newsgroup.
il modello TCP/IP
Uno dei punti centrali del modello OSI è quello di introdurre chiaramente i concetti di servizi, interfacce e protocolli. OSI è nato prima dell’elaborazione dei protocolli, è un modello molto più generale di TCP/IP che, al contrario, è in qualche modo più “pratico” dato che è nato di fatto come descrizione di protocolli pre-esistenti.
Riferendosi alla figura 10, lo strato “internet” si occupa di inviare pacchetti di dati verso la destinazione. I compiti principali sono la gestione dell’instradamento dei dati (routing) e il controllo delle congestioni (è analogo allo strato di rete del modello OSI). I pacchetti sono chiamati appunto “pacchetti IP” (Internet Protocol), ciascuno indirizzato ad un “indirizzo IP”.
Lo strato al di sopra, lo strato di trasporto, permette la conversazione tra sorgente e destinazione, proprio come il livello di trasporto OSI. A livello di trasporto, nello stack TCP/IP sono definiti due protocolli end-to-end: TCP (Transmission Control Protocol) e UDP (User Datagram Protocol).
IP, TCP e UDP verranno analizzati più in dettaglio nel seguito.
Lo strato più basso dello stack, qui detto “host-to-network”, non è descritto in dettaglio nel modello TCP/IP e varia da macchina a macchina e da rete a rete.
Riferimenti
Andrew S. Tanenbaum: Computer Networks, fourth edition – Prentice‑Hall, Inc.