Computer Network Lesson

LEZIONE del 3 Novembre

Nei sistemi a risorse distribuite il substrato trasmissivo fornisce l'ambiente attraverso il quale i processi producono e consumano messaggi. La topologia complessiva che ne risulta è alquanto complessa perchè è ottenuta, in generale, connettendo elaboratori per formare reti locali che, a loro volta, vengono interconnesse mediante specifiche apparecchiature il cui compito, come vedremo, è di far propagare i dati affinchè possano raggiungere stazioni remote.

Si può affermare, pertanto, che i diversi protocolli, corrispondenti ai livelli di trasporto e di rete del modello di riferimento ISO-OSI, sono parte integrante del sistema di comunicazione fra processi che fornisce un flusso di dati bidirezionale attraverso connessioni logiche realizzate mediante le porte dei processi.

La figura seguente evidenzia possibili schemi implementativi di comunicazione fra processi sulla rete, confrontandoli con il modello di riferimento ISO-OSI.

Generalmente, i dati che vengono immessi sulla rete da un elaboratore sono le unità componenti dei messaggi che un processo invia, o riceve, da un altro processo, possibilmente, in esecuzione su altro elaboratore. Tali elementi della comunicazione vengono detti, genericamente, pacchetti ed il loro formato o dimensione non è ulteriormente specificato fino a quando non si definisce esplicitamente il protocollo di trasmissione dei dati.

Pertanto, dal punto di vista della comunicazione, gli elaboratori connessi alla rete sono visti come sorgenti e destinazioni di pacchetti, analogamente a quanto accade per terminali, file ed altri dispositivi di I/O che si scambiano dati attraverso processi. A loro volta i processi possono richiedere di distinguere fra flussi di dati provenienti da comunicazioni diverse con altri processi e questo può ottenersi mediante l'utilizzo di porte attraverso le quali comunicano con le porte di altri processi.

Come appare chiaramente, si tratta di un meccanismo generalizzato di scambio messaggi che può coinvolgere processi in esecuzione su nodi distinti della rete. In esso, le operazioni primitive send e receive coinvolgono due parametri:

Il Protocollo del Controllo di Trasmissione

Il protocollo TCP è un modulo del sistema operativo di ciascun elaboratore connesso alla rete il cui scopo è quello di controllare la trasmissione dei dati, nel senso che fornisce un'interfaccia fra i servizi del nodo verso la rete e il relativo livello di rete. Ovviamente il protocollo TCP può utilizzare altre funzioni del sistema operativo, ossia, manipolare le strutture dati del caso come, ad esempio, i datagrammi caratteristici del protocollo di rete, attraverso i quali chiamare il driver che controlla l'effettivo accesso in rete, come appare esemplificato nella figura precedente.

In questo senso il modulo TCP è definito da opportune strutture dati, su cui opera una libreria di funzioni, che permette di trattare la connessione fra processi allo stesso modo con cui i programmi utilizzano i file per acquisire e/o fornire dati dal mondo esterno. Naturalmente, si è fatta l'assunzione implicita di considerare soltanto i servizi di rete in modalità connessa.

I processi trasmettono dati chiamando le funzioni del modulo TCP alle quali vengono passati buffer di dati come argomenti. L'effetto è quello di impaccare i dati, provenienti dal buffer, in segmenti i quali, successivamente, vengono trasmessi al modulo TCP di destinazione utilizzando i servizi del modulo di rete. La parte ricevente della coppia di moduli TCP, coinvolti nela trasmissione, estrae i dati dal segmento e li deposita nel relativo buffer, notificando l'avvenuta operazione. Come si è già visto, il modulo TCP inserisce nei segmenti opportune informazioni di controllo (PCI), necessarie ad assicurare una trasmissione di dati ordinata e affidabile.

Ovviamente è necessario che ciascun modulo TCP sia accoppiato con un opportuno modulo di rete (IP) per fornire l'adeguata interfaccia con la rete locale su cui l'elaboratore è connesso. A sua volta il modulo IP impacca i segmenti TCP in datagrammi internet, istradandoli verso il modulo IP di destinazione, oppure, un nodo di smistamento (gateway). La trasmissione del datagramma all'interno di una rete locale avviene utilizzando i frammenti (frame) impiegati nell'attività di trasmissione della rete stessa.

Il transito dei pacchetti può dar luogo ad ulteriori impaccamenti, frammentazioni, od altre operazioni necessarie per il trasferimento del pacchetto verso il modulo IP di destinazione.

Nei nodi di smistamento (gateway) i pacchetti vengono ricostruiti, a partire dai frammenti trasmessi nella rete locale di transito, per determinare la nuova rete verso la quale spedirli. Il pacchetto viene nuovamente spezzato in frammenti, adatti a percorrere la nuova rete locale, verso un nuovo nodo di smistamento, oppure, la destinazione finale.

COMUNICAZIONE AFFIDABILE

Il flusso di dati, realizzato da una connessione TCP, raggiunge la propria destinazione garantendone l'ordine di trasmissione e il numero in modo affidabile. A tale scopo, la trasmissione viene realizzata utilizzando numeri d'ordine e notifiche di avvenuta ricezione.

Concettualmente, ad ogni byte trasmesso viene assegnato un numero d'ordine che rappresenta la sua posizione all'interno del flusso di dati. In questo modo ciascun segmento di dati trasmessi è identificabile da

Quando viene trasmesso un segmento contenente dati, una copia dello stesso viene inserito nella coda di ritrasmissione attivando, contemporaneamente, un timer. Alla ricezione della conferma di avvenuta ricezione, il segmento viene cancellato dalla coda altrimenti, prima della scadenza del timer, il segmento viene ritrasmesso.

Naturalmente il fatto di ricevere conferma di avvenuta ricezione non garantisce che i dati siano giunti a destinazione ma solamente che il modulo TCP ricevente si è assunto questa responsabilità.

Per governare la trasmissione dei dati fra moduli TCP viene impiegato un opportuno meccanismo di controllo del loro flusso e che consiste nel restituire al TCP mittente una finestra, da parte del TCP ricevente, nella quale viene specificato il numero di byte, a partire dal numero di notifica, che il TCP ricevente è correntemente pronto a ricevere.

REALIZZAZIONE DELLA CONNESSIONE

Per poter gestire separatamente differenti flussi di dati, il modulo TCP fornisce un identificatore di porta, i quali sono assegnati indipendentemente da ciascun modulo e, quindi, possono non essere unici. Per rendere unico l'indirizzo di ciascun servizio TCP è sufficiente concatenere il suo indirizzo di rete, fornito dal modulo IP, con l'identificatore di porta per creare una socket che sarà unica all'interno di tutta la rete.

Si rammenta che le connessioni fra processi sono completamente specificate dalla coppia di socket che ne stabiliscono i punti terminali di comunicazione. La socket locale può realizzare molte connessioni con differenti socket remote nelle quali il trasferimento dei dati può avvenire in entrambe le direzioni, ossia, essere full duplex.

In generale ciascun modulo è libero di associare porte con processi nel rispetto, tuttavia, di alcune linee guida. Innanzitutto devono esistere specifiche socket che il modulo TCP associa, sotto certe condizioni, solamente con appropiati processi. Si suppone che i processi possano avere delle proprie porte e che inizino la connessione proprio su di esse.

La connessione viene specificata utilizzando la chiamata OPEN passando come argomenti la porta locale e la socket remota. In risposta, il protocollo TCP restituisce un breve nome locale per la connessione, che è utilizzato per le chiamate successive che gestiscono la medesima connessione. Le informazioni ad esse relative sono immagazzinate in una struttura dati che prende il nome di Blocco per il Controllo della Trasmissione (TCB). La chiamata OPEN deve, inoltre, specificare se la connessione deve essere stabilita attivamente oppure attesa passivamente.

Una richiesta passiva di OPEN sta a significare che il processo accetta richieste di connessioni entranti piuttosto che tentare di iniziare una connessione. Spesso il processo che richiede una OPEN passiva accetterà una richiesta di connessione proveniente da qualunque chiamante. In questo caso viene utilizzata una socket remota di tutti zeri per denotare una socket non specificata. Socket remote non specificate sono possibili solamente nelle chiamate di OPEN passive.

Un processo server che desidera fornire servizi a processi cliente non specificati inoltrerà una richiesta di OPEN passiva con socket remota non specificata. La connessione verrà stabilita con qualunque processo che inoltrerà una richiesta di connessione verso quella socket locale.

Le socket già definite sono un comodo meccanismo per associare a priori un indirizzo di socket con un servizio standard come può essere Telnet, File Transfer, ecc...

FORMATO DELL'INTESTAZIONE

L'affidabilità e il meccanismo del controllo trasmissivo richiede che il protocollo TCP inizializzi e mantenga un certo numero di informazioni relative allo stato di ciascun flusso di dati, che prende il nome di connessione. Tali informazioni comprendono la coppia di socket che specificano entrambi i moduli TCP coinvolti nella comunicazione e che identificano univocamente la connessione, i numeri d'ordine e di notifica e la dimensione della finestra.

Quando due processi vogliono comunicare è necessario, innanzitutto, che venga stabilita una connessione, inizializzando su entrambi i lati le informazioni sullo stato della comunicazione. Alla sua terminazione la connessione viene chiusa al fine di liberare risorse per altre connessioni.

Ciascun segmento del protocollo TCP viene fornito di un'intestazione per essere, successivamente, inoltrato come datagramma internet, con la specifica intestazione del protocollo IP. In questo modo ogni pacchetto generato dal livello TCP, in transito sulla rete, è caratterizzato dall'intestazione IP seguita da quella TCP, la cui concomitanza spiega il motivo della denominazione TCP/IP per la rete internet.

Lo specifico formato dell'intestazione per il protocollo TCP è quello illustrato nella figura seguente

i cui campi indicati hanno il significato riportato di seguito.

Si fa presente che una connessione TCP richiede di ricordare un certo numero di variabili che sono immagazzinate nel cosiddetto Blocco per il Controllo della Trasmissione TCB e comprendono gli identificatori delle socket locale e remota, gli indici di sicurezza e precedenza, i puntatori ai buffer del mittente e del ricevente, quelli relativi alla coda di ritrasmissione e al segmento corrente.

STATO DELLA CONNESSIONE

Una connessione TCP progredisce da uno stato all'altro in risposta agli eventi che sono rappresentati dalle chiamate eseguite dalle procedure di servizio del livello superiore, ossia, OPEN, SEND, RECEIVE, CLOSE, ABORT e STATUS alle quali si aggiungono i segmenti in arrivo, particolarmente, quelli conteneti i flag SYN, ACK, RST e FIN, oltre ai timeout.

Il diagramma di stato della figura seguente illustra solamente i cambiamenti di stato assieme agli eventi che li hanno causati e le azioni che sono state intraprese.

Per comprenderne il signifcato viene riportata di seguito la lista degli stato con una breve spiegazione.

LISTEN :
attesa per una richiesta di connessione da un qualunque servizio TCP remoto;
SYN-SENT :
attesa di una richiesta di connessione complementare dopo aver inviato una richiesta di connessione;
SYN-RECEIVED :
attesa di conferma per una notifica di richiesta di connessione, dopo aver ricevuto e spedito una richiesta di connessione;
ESTABLISHED :
connessione aperta, per cui i dati ricevuti possono essere trasferiti al servizio collegato (lo stato normale della fase di trasferimento dati per una connessione);
FIN-WAIT-1 :
attesa di una richiesta di terminazione di connessione da un modulo TCP remoto, oppure, la conferma di una richiesta di terminazione di connessione, precedentemente inviata;
FIN-WAIT-2 :
attesa di una richiesta di terminazione di connessione da un modulo TCP remoto;
CLOSE-WAIT :
attesa di una richiesta di terminazione di connessione da un servizio locale;
CLOSING :
attesa della conferma di una richiesta di terminazione di connessione da un modulo TCP remoto;
LAST-ACK :
attesa di conferma della richiesta di terminazione di connessione, precedentemente inviata ad un modulo TCP remoto;
TIME-WAIT :
attesa che sia passato un intervallo di tempo sufficientemente lungo per essere sicuri che il modulo TCP remoto abbia ricevuto la conferma della sua richiesta di terminazione di connessione.
CLOSED :
assenza di connessione.

Nella tabella che segue vengono esplicitate le azioni intraprese durante una transizione di stato, come risposta all'evento indicato. I numeri sono quelli indicati nella tabella.

IndiceEventoAzione
1CLOSEdelete TCB
2CLOSEdelete TCB
3active OPENcreate TCB; snd SYN
4passive OPENcreate TCB
5rcv SYNsnd SYN, ACK
6SENDsnd SYN
7rcv SYNsnd ACK
8rcv ACK of SYN
9rcv SYN, ACKsnd ACK
10CLOSEsnd FIN
11CLOSEsnd FIN
12rcv FINsnd ACK
13rcv ACK of FIN
14rcv FINsnd ACK
15rcv FINsnd ACK
16rcv ACK of FIN
17Timeout=2MSLdelete TCB
18CLOSEsnd FIN
19rcv ACK of FIN

Il diagramma di stato precedentemente visto è solo parziale perchè non tiene conto nè di eventuali condizioni d'errore nè delle azioni che non sono correlate a transizioni di stato.

INTERFACCIA CON I SERVIZI

Il protocollo TCP, analogamente a quanto accade per la gestione dei file da parte del file-system, fornisce un insieme di comandi che specificano le funzioni base che permettano il mantenimento della comunicazione fra processi. Ogni implementazione specifica deve definire l'esatto formato dei comandi, combinare sottoinsiemi di comandi base in singole chiamate, aprire una connessione quando un servizio inoltra la prima SEND o RECEIVE relativamente ad una data connessione.

Nel fornire la comunicazione fra processi, il protocollo TCP non deve solamente accettare comandi ma deve, anche, restituire opportune informazioni ai processi che sta servendo,

I principali comandi, realizzati dal protocollo TCP, sono quelli descritti nel seguito.