Copyright © 1996, 1997 Università di Firenze. All rights reserved.
license available.
![]() |
È un protocollo nato per l'utilizzo nella rete INTERNET, ma è di applicabilità del tutto generale anche per altri tipi di rete. Come detto nella Slide sopra, il T.C.P. non è standardizzato, ma è diventato così popolare che la I.S.O. (International Standardization Organization ) ha derivato da esso uno standard, il TP-4.
Il TCP viene definito affidabile in quanto è un protocollo con riscontro, in particolare usa una tecnica nota come RISCONTRO POSITIVO con RITRASMISSIONE.
Il TCP acronimo di Transmission Control Protocol, non è altro che una serie di regole e definizioni del tutto generali per l'instaurazione di una connessione affidabile. Viene infatti definito da esso il formato del datagramma che due computer devono scambiarsi per ottenere un trasferimento affidabile. Quello che il TCP invece non specifica è il dettaglio dell'interfaccia tra un programma applicativo ed il protocollo stesso. Cioé non specifica le procedure che devono essere chiamate da un'applicativo per fare determinate operazioni, ma solo quali operazioni sono consentite. Questo fatto determina una grande flessibilità per l'implementazione e allo stesso tempo consente una specifica unica del TCP, utilizzabile per la progettazione del software su varie macchine.
![]() |
Le proprietà fondamentali che caratterizzano il TCP sono le seguenti:
Significa che il TCP, non avendo una dimensione di segmento fissa, trasmette alla DESTINAZIONE la sequenza identica (STREAM) di byte che il MITTENTE ha fornito al TCP stesso nella macchina di provenienza.
La connessione è vista dagli applicativi (USERS) come un circuito fisico dedicato, quindi il TCP è capace di fornire servizi del tipo CONNECTION ORIENTED mentre il protocollo IP su cui appoggia, è in grado di fornire servizi CONNECTION LESS. Allora diciamo che la connessione è a CIRCUITO VIRTUALE poiché sarà compito del software del TCP implementare, attraverso opportune trasmissioni, il circuito dedicato.
Il software del protocollo TCP è libero di suddividere la STREAM in segmenti (pacchetti) indipendenti dal programma applicativo che li ha generati. Per fare questo è necessario disporre di un BUFFER dove immagazzinare la sequenza di byte. Appena i dati sono sufficienti per riempire un DATAGRAMMA ragionevolmente grande, questo viene trasmesso attraverso la rete. La bufferizzazione consente una riduzione del traffico sulla rete "ottimizzando" in qualche modo il numero di segmenti da trasmettere.
Nel TCP non è necessario nessun tipo di formattazione specifica della STREAM, quindi è demandata agli applicativi la corretta estrazione dei dati dai segmenti ricevuti.
Il TCP consente il trasferimento simultaneo in entrambe le direzioni per ogni connessione. Questo permette la trasmissione parallela di segmenti informativi in un senso e di segmenti di riscontro nell'altro.
![]() |
Perché una connessione abbia inizio il TCP al momento dell'instaurazione deve assegnare a questa un numero di porta di protocollo. Quindi ad ogni connessione deve essere associato un numero di porta ma ad una porta può essere assegnata più di una connessione. Si potrebbe pensare che questo fatto crei ambiguità o confusione nell'indirizzamento, ma così non è perché il TCP utilizza come sua astrazione fondamentale la connessione e non il semplice numero di porta di protocollo.
![]() |
![]() |
Formato di un segmento TCP che viene usato sia per instaurare una connessione, come per trasferire dati e trasmettere riscontri.
Per identificare il tipo di informazione contenuta nel segmento vengono impiegati i 6 bit di codice.
Bit (Numero)
Significato del bit se posto ad 1
URG (11)
Il campo puntatore urgente è valido
ACK (12)
Il campo riscontro è valido
PSH (13)
Questo segmento richiede una spinta
RST (14)
Effettua il reset della connessione
SYN (15)
Sincronizza i numeri di sequenza
FIN (16)
Il trasmettitore ha raggiunto la fine della sua stream di byte
Contiene un numero intero che indica la lunghezza dell'intestazione TCP del datagramma. Questa informazione è necessaria perché il campo OPZIONI è di lunghezza variabile.
Contengono i numeri di porta di protocollo TCP che identificano gli applicativi alle estremità della connessione.
Il campo NUMERO SEQUENZIALE identifica, nella stream di byte del trasmettitore, la posizione dei dati nel segmento. Questo valore è riferito alla stream che fluisce nella medesima direzione del segmento, mentre il NUMERO DI RISCONTRO si riferisce alla stream che fluisce nella direzione opposta.
Contiene il numero sequenziale del byte successivo a quello correttamente ricevuto dalla destinazione. Tale campo è valido solo nei segmenti di riscontro, o nei segmenti utilizzanti la tecnica trasmissiva PUGGY-BACKING, e fa riferimento allo stream di dati che fluisce nella direzione opposta a tale segmento.
Numero intero senza segno di 16 bit che specifica la dimensione del BUFFER che il TCP ha a disposizione per immagazzinare dati in arrivo. È utilizzato per la gestione dinamica della dime della finestra scorrevole.
Il TCP permette la trasmissione fuori banda di dati informativi ad alta priorità. Questi devono essere trasmessi il prima possibile, indipendentemente dalla loro posizione nella stream.
Questo campo, se valido, conterrà un puntatore alla posizione nella stream, dei dati urgenti.
Supponiamo per esempio di essere in una sessione di login remoto e di voler far terminare forzatamente (abortire) un programma che ha smesso di accettare l'input. Per farlo è necessario inviare un segmento dati urgente con i comandi appropriati di terminazione.
Campo di 16 bit contenente un valore intero utilizzato dal TCP della macchina host di destinazione, per verificare l'integrità dei dati e la correttezza dell'intestazione. Questa informazione è di essenziale importanza perché il protocollo IP non prevede nessun controllo di errore sulla parte dati del FRAME.
Per il calcolo del valore CHECKSUM il TCP ha bisogno di aggiungere una pseudointestazione al datagramma, per effettuare così un controllo anche sugli indirizzi IP di destinazione e provenienza.
Sequenza di byte di lunghezza variabile. Costituisce la vera informazione che gli applicativi si scambiano.
![]() |
Il TCP per formare completamente il datagramma deve calcolare il valore da inserire nel campo CHECKSUM. Per fare questo il software crea una PSEUDOINTESTAZIONE come mostrato nella Slide.
Sono 2 campi di 32 bit ciascuno contenenti rispettivamente l'indirizzo IP della machina di provenienza e della macchina di destinazione.
Queste informazioni non fanno parte del livello di astrazione a cui appartiene il TCP, per questo deve colloquiare con il livello IP sottostante. Tale scambio di informazioni viola il concetto di stratificazione e separazione di un protocollo a vantaggio però di una migliore efficienza. È stato così ottenuto un buon compromesso tra teoria ed implementazione.
Contiene un valore numerico che identifica il protocollo in uso nella comunicazione di quel FRAME. Nel caso del TCP tale identificativo ha valore 6.
Contiene il numero in byte della lunghezza del datagramma TCP, esclusa la pseudointestazione.
La PSEUDOINTESTAZIONE viene creata e posta in testa al datagramma TCP. Viene inserito in essa un ulteriore byte di zeri per raggiungere un multiplo di 16 bit. Successivamente viene calcolata la CHECKSUM su tutto il messaggio così formato, viene scartata la pseudointestazione e passato il datagramma al livello IP.
In fase di ricezione, il livello TCP ricrea la pseudointestazione interagendo con l'IP sottostante, calcola la CHECKSUM e verifica la correttezza del messaggio ricevuto.
In caso di errore viene generato un messaggio di ritrasmissione del datagramma.
![]() |
Nel TCP come abbiamo già avuto modo di dire i segmenti sono di lunghezza variabile, quindi è conveniente effettuare il riscontro con riferimento ai byte trasmessi. Il ricevitore utilizzerà il numero sequenziale per riordinare i segmenti in modo corretto, poiché come sappiamo il protocollo IP non garantendo la consegna dei frame tanto meno ne garantisce l'ordine di arrivo.
Nel datagramma di riscontro la destinazione comunica alla provenienza quale byte della stream si aspetta di ricevere successivamente. In pratica i riscontri specificano sempre il numero sequenziale del primo byte non ancora ricevuto. Per esempio, supponendo di dover trasmettere una stream di 1000 byte in segmenti di 100 byte ciascuno, alla prima trasmissione corrisponderà un riscontro con numero sequenziale 101, ovvero la posizione del prossimo byte da ricevere.
Con tale metodo il riscontro ha la proprietà di essere cumulativo, ovvero ogni riscontro non convalida solo i byte relativi al segmento che l'ha generato, ma anche tutti i byte precedenti. Questo porta dei vantaggi nella circostanza in cui un datagramma di riscontro venisse perso ed arrivase il successivo, in quanto quest'ultimo convaliderebbe tutti i byte senza necessitare di alcuna ritrasmissione sia del datagramma informativo sia del riscontro. Porta anche alcuni svantaggi legati al fatto di non avere nessun tipo di informazione sui segmenti arrivati correttamente alla destinazione ma non nella sequenza dovuta. In questa circostanza allo scadere del TIME OUT il trasmettirore potrebbe procedere all'inutile ritrasmissione anche di questi.
Questo rappresenta il tempo massimo entro cui un segmento trasmesso deve avere riscontro. Se questo non avviene, si procede alla ritrasmissione.
Come sappiamo la rete INTERNET, su cui è stato progettato il TCP, racchiude al suo interno una grande varietà di macchine e tecnologie con prestazioni spesso molto differenti. In più, la notevole espansione geografica porta ad avere connessione a distanze imprevedibili. Conseguentemente anche il tempo di trasporto e riscontro, noto come ROUND TRIP TIME, per un generico segmento è soggetto a variazioni notevoli ed impredicibili.
Il TCP per stimare efficientemente il TIME-OUT di ogni connessione, utilizza l'algoritmo di Karn. È un algoritmo adattativo, ovvero al variare delle prestazioni della connessione corregge opportunamente il valore stimato in precedenza.
![]() |
I protocolli IP e UDP non hanno un sistema di controllo del flusso. Se ad esempio la connessione rallenta drasticamente ( la velocità di trasmissione diminuisce), non abbiamo nessuno strumento per conoscere in quale punto della rete è sorto il problema. E anche se potessimo saperlo non avremmo nessuno strumento per cambiare le cose.
Nel TCP invece è implementato un controllo di flusso END to END. La tecnica che utilizza è abbastanza "primitiva" in quanto si limita ad evitare di riempire con velocità troppo elevata il BUFFER della macchina di destinazione. Allo stesso tempo però consente di avere una trasmissione più efficiente, sotto il profilo del THROUGH-PUT, del semplice protocollo con riscontro positivo.
La tecnica della FINESTRA SCORREVOLE è infatti una forma più complessa di tale protocollo; consente al trasmettitore di inviare più segmenti in sequenza senza dover attendere il riscontro di ciascuno.
L'ampiezza della finestra viene "contrattata" all'inizio della connessione TCP, e dinamicamente può variare la sua estenzione durante la connessione stessa. Questo parametro rappresenta il numero massimo di byte trasmessi e non riscontrati (potremmo dire in viaggio per la destinazione desiderata).
Facciamo un esempio per comprendere meglio come viene gestita l'ampiezza della finestra.
Supponiamo di essere in fase di trasmissione. A regime la finestra scorre in avanti poiché il trasmettitore invia segmenti e riceve riscontri alla stessa velocità. Se ad un certo punto si ha la perdita di un segmento, presumibilmente la rete in qualche punto è ingolfata. Per evitare nuove perdite il TCP cerca di ridurre il traffico dimezzando l'ampiezza della finestra. Se nuovamente si genera una perdita di segmento la finestra viene nuovamente dimezzata, se invece si ottiene riscontro la finestra viene incrementata linearmente. Nel caso estremo in cui nessun segmento ha avuto riscontro, dopo il TIME-OUT la finestra viene azzerata e si procede alla ritrasmissione.
![]() |