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 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.
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.
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...
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.
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.
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.
Indice | Evento | Azione |
---|---|---|
1 | CLOSE | delete TCB |
2 | CLOSE | delete TCB |
3 | active OPEN | create TCB; snd SYN |
4 | passive OPEN | create TCB |
5 | rcv SYN | snd SYN, ACK |
6 | SEND | snd SYN |
7 | rcv SYN | snd ACK |
8 | rcv ACK of SYN | |
9 | rcv SYN, ACK | snd ACK |
10 | CLOSE | snd FIN |
11 | CLOSE | snd FIN |
12 | rcv FIN | snd ACK |
13 | rcv ACK of FIN | |
14 | rcv FIN | snd ACK |
15 | rcv FIN | snd ACK |
16 | rcv ACK of FIN | |
17 | Timeout=2MSL | delete TCB |
18 | CLOSE | snd FIN |
19 | rcv 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.
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.
Format: | OPEN( | local port, |
foreign socket, | ||
active/passive | ||
[, timeout] | ||
[, precedence] | ||
[, security/compartment] | ||
[, options] ) | ||
-> local connection name |
Si suppone che il protocollo locale TCP conosca l'identità dei processi che deve servire, controllando eventualmente l'autorizzazione del processo ad utilizzare la connessione specificata.
Se il flag active/passive è posto a passive, allora si tratta di una chiamata LISTEN per una connessione entrante.
Format: | SEND( | local connection name, |
buffer address, | ||
byte count | ||
PUSH flag | ||
URGENT flag | ||
[, timeout]) |
L'esecuzione di questa funzione provoca il trasferimento dei dati contenuti nel buffer indicato verso la destinazione contenuta nella destinazione. Se la connessione non è stata aperta l'esecuzione della send genera un errore che, in alcune specifiche implementazioni può tradursi in un'operazione automatica di OPEN, a meno che il processo non sia autorizzato alla connessione.
Format: | RECEIVE( | local connection name, |
buffer address, | ||
byte count) | ||
-> byte count, | ||
urgent flag, | ||
push flag |
L'esecuzione del comando provoca l'allocazione dei dati nel buffer ricevente, associato con la connessione indicata.
Format: | CLOSE( | local connection name) |
Provoca la chiusura della connessione.
Format: | STATUS( | local connection name) |
-> status data |
Le informazioni restituite sono determinate dal valore corrente dei campi del blocco TCB associato alla connessione.
Format: | ABORT( | local connection name) |
L'esecuzione di questo comando abortisce tutte le operazioni SEND e RECEIVE ancora pendenti, la rimozione del descrittore TCB e l'invio dello speciale messaggio RESET al modulo TCP complementare della connessione.