Internet - Il protocollo TCP

Le caratteristiche del protocollo TCP

TCP (che significa Transmission Control Protocol, cioè in italiano: Protocollo di Controllo di Trasmissione) è uno dei protocolli principali del livello trasporto del modello TCP/IP. Esso permette, a livello delle applicazioni, di gestire i dati provenienti (o a destinazione) del livello inferiore del modello (cioè il protocollo IP). Una volta che i dati sono forniti al protocollo IP, quest'ultimo li incapsula in datagrammi IP, fissando il campo protocollo a 6 (Per sapere se il protocollo applicato è TCP…). TCP è un protocollo orientato connessione, cioè permette a due terminali che comunicano di controllare lo stato della trasmissione
Le caratteristiche principali del protocollo TCP sono i seguenti :

  • TCP permette di rimettere in ordine i datagrammi provenienti dal protocollo IP
  • TCP permette di verificare l'ondata di dati per evitare una saturazione della rete
  • TCP permette di formattare i dati in segmenti di lunghezza variabile per "rimetterli" al protocollo IP
  • TCP permette di multiplexare i dati, cioè di far circolare simultaneamente delle informazioni provenienti da sorgenti (applicazioni ad esempio) distinte su una stessa linea
  • TCP permette infine di cominciare e finire una comunicazione din modo cortese

Lo scopo del TCP

Grazie al protocollo TCP, le applicazioni possono comunicare in modo sicuro (grazie al sistema di accuse di ricezione del protocollo TCP), indipendentemente dai livelli inferiori. Questo significa che i router (che lavorano a livello internet) hanno come unico ruolo l'invio dei dati sotto forma di datagramma, senza preoccuparsi del controllo dei dati stessi, dato che questo è realizzato dal livello trasporto (più particolarmente dal protocollo TCP).

Al momento di una comunicazione con il protocollo TCP, i due terminali devono stabilire una connessione. Il terminale emittente (quello che chiede la connessione) è detta client, mentre il terminale ricettore è detto server. Siamo allora in un ambiente client-server.
I terminali di un tale ambiente comunicano in modo connesso, cioè la comunicazione avviene nei due sensi.

Per permettere il buon svolgimento della comunicazione e di tutti i controlli che l'accompagnano, i dati sono incapsulati, cioè viene aggiunta un'intestazione ai pacchetti di dati che permette di sincronizzare le trasmissioni e assicurarne la ricezione.

Un'altra particolarità del TCP è di poter regolare la banda passante dei dati grazie alla sua capacità di emettere dei messaggi di dimensione variabile, questi messaggi sono detti segmenti.

La funzione di multiplexaggio

TCP permette di effettuare un compito importante: il multiplexaggio/demultiplexaggio, cioè di far transitare su una stessa linea dei dati provenienti da applicazioni diverse o in altre parole di mettere in seriei delle informazioni arrivate in parallelo.

Questo operazioni sono realizzate grazie al concetto di porte(o socket), cioè un numero associato ad un tipo di applicazione, che, combinato ad un indirizzo IP, permette di determinare in modo univoco un'applicazione che gira su un dato terminale.

Il formato dei dati su TCP

Un segmento TCP è costituito come segue :

URG ACK PSH RST SYN FIN
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Porta Sorgente Porta destinazione
Numero d'ordine
Numero d'accusa di ricezione
Spostamento
dati
riservato
Finestra
Somma di controllo
Puntatore di emergenza
Opzioni Riempimento
Dati

Significato dei differenti campi :

  • Porta sorgente (16 bits): porta relativa all'applicazione in corso su un terminale sorgente
  • Porta destinazione (16 bits): porta relativa all'applicazione in corso su un terminale destinazione
  • Numero d'ordine (32 bits): Quando il flag SYN è a zero, il numero d'ordine è quello della prima parola del segmento in corso.
    Quando SYN è a 1, il numero d'ordine è uguale quello iniziale usato per sincronizzare i numeri di sequenza (ISN)
  • Numero d'accusa di ricezione (32 bits): il numero dell'accusa di ricezione anche chiamato numero di ricevimento corrisponde al numero (d'ordine) del prossimo segmento atteso, e non del numero dell'ultimo segmento ricevuto.
  • Spostamento di dati (4 bits): permette di individuare l'inizio dei dati nel pacchetto. Lo spostamento in questa fase è essenziale dato che il campo di opzioni è di dimensione variabile
  • riservato (6 bits): campo inutilizzato attualmente ma previsto per il futuro
  • Flags (6x1 bits): i flags rappresentano delle informazioni supplementari :
    • URG: se questo flag è a 1 il pacchetto deve essere trattato urgentemente.
    • ACK: si il flag è a 1 il pacchetto è un'accusa di ricezione
    • PSH (PUSH): se il flag è a 1, il pacchetto funziona secondo il metodo PUSH.
    • RST: se il flag è a 1, la connessione viene rinizializzata.
    • SYN:il flag TCP SYN indica una richiesta di connessione.
    • FIN: se questo flag è a 1, la connessione si interrompe
  • Finestra (16 bits): campo che permette di conoscere in numero di bytes che il ricevitore desidera ricevere senza accusa di ricezione
  • Somma di controllo ( (Checksum o CRC): la somma di controllo è realizzata facendo la somma dei campi di dati dell'intestazione, per poter verificare l'integrità dell'intestazione
  • Puntatore di emergenza (16 bits): indica il numero d'ordine a partire dal quale l'informazione diventa urgente
  • Opzioni (Dimensione variabile): opzioni diverse
  • Riempimento: si riempe lo spazio rimanente dopo le opzioni con degli zero per avere una lunghezza multipla di 32 bits

Affidabilità dei trasferimenti

Il protocollo TCP permette di assicurare il trasferimento dei dati in modo affidabile, anche se usa il protocollo IP che non integra nessun controllo di consegna dei datagrammi.

In realtà, il protocollo TCP ha un sistema di accuse di ricezione che permette al client e al server di assicurarsi della buona ricezione reciproca dei dati.
All'emissione di un segmento, si associa un Numero d'ordine (detto anche numero di sequenza). Alla ricezione di un segmento di dato, il terminale ricettore rimanda un segmento di dato il cui flag ACK è a 1 (per segnalare che si tratta di un'accusa di ricezione) accompagnato da un numero di accusa di ricezione uguale al numero d'ordine precedente.

Inoltre, grazie ad un timer scattato alla ricezione di un segmento a livello del terminale emittente, il segmento è rispedito non appena scade il tempo fissato, dato che in questo caso il terminale emittente considera il segmento perso…

Tuttavia, se il segmento non è perso e arriva comunque al destinatario, il terminale ricettore saprà grazie al numero d'ordine che si tratta di un doppione e conserverà solo l'ultimo segmento arrivato a destinazione…

Stabilimento di una connesione

Dato che questo processo di comunicazione, che si fa grazie ad un'emissione di dati e di un'accusa di ricezione, è basato su un numero d'ordine (detto generalmente numero di sequenza), bisogna che i terminali emittenti e ricettori (client e server) conoscano il numero d'ordine iniziale dell'altro terminale.

Per stabilire la connessione fra le due applicazioni si applica spesso lo schema seguente :

  • Le porte TCP devono essere aperte
  • L'applicazione sul server è passiva, cioè l'applicazione è in modalità ascolto, in attesa di una connessione
  • L'applicazione sul client fa una richiesta di connessione sul server dove l'applicazione è in apertura passiva. L'applicazione del client è detta in "en ouverture active"

I due terminali devono quindi sincronizzare le loro frequenze grazie ad un meccanismo comunemente detto three ways handshake (stretta di mano in tre tempi), che si ritrova anche in fine di sessione.

Questo dialogo permette di iniziare la comunicazione, esso si svolge in tre tempi, come indicato dal suo nome :

  • In un primo tempo il terminale emittente (il client) trasmette un segmento il cui flag SYN è a 1 (per segnalare che si tratta di un segmento di sincronizzazione), con un numero d'ordine N, che si chiama numero d'ordine iniziale del client
  • In un secondo tempo il terminale ricevente (il server) riceve il segmento iniziale proveniente dal client, poi gli invia un accusa di ricezione, cioè un segmento il cui flag ACK è a 1 e il flag SYN è a 1 (dato che si tratta ancora di una sincronizzazione). Questo segmento contiene il numero d'ordine di questo terminale (del server) che è il numero d'ordine iniziale del client. Il campo più importante di questo segmento è quello dell'accusa di ricezione che contiene il numero d'ordine iniziale del cleint, aumentato di 1
  • Infine, il client trasmette al server un accusa di ricezione, cioè un segmento il cui flag ACK è a 1, il cui flag SYN è a zero (non si tratta più di un segmento di sincronizzazione). Il suo numero d'ordine è aumentato e il numero dell'accusa di ricezione rappresenta il numero d'ordine iniziale del server aumentato di 1

three ways handshake - poignée de mains en trois temps

In seguito a questa sequenza di tre scambi, i due terminali sono sincronizzati e la comunicazione può cominciare!

Esiste una tecnica di pirataggio, detta spoofing IP, che permette di corrompere questa relazione di approvazione a fini nocivi!

Medoto della finestra scorrevole

In alcuni casi, è possibile limitare il numero delle accuse di ricezione, per rendere più fluida la rete, fissando un numero di sequenza che necessita di un accusa di ricezione alla fine. Questo numero è infatti stoccato nel campo Finestra dell'intestazione TCP/IP.

Questo metodo è effettivamente detto "Medoto della finestra scorrevole" dato che definisce in un certo qual modo una forchetta di sequenze che non hanno bisogno di accuse di ricezione, e che si sposta man mano che le accuse di ricezione sono ricevute.

Inoltre, la dimensione di questa finestra non è fissa. In effetti, il server può includere nelle sue accuse di ricezione stoccando nel campo finestra la dimensione che gli sembra più adatta. Così, quando l'accusa di ricezione indica una richiesta d'aumento della finestra, il client sposterà il bordo destro della finestra.

Invece, in caso di diminuzione, il client non sposterà il bordo destro della finestra verso sinistra ma aspetterà che il bordo sinistro avanzi (con l'arrivo delle accuse di ricezione).

Fine di una connessione

Tanto il client quanto il server possono chiedere di mettere fine ad una connessione
La fine della connession avviene in questo modo :

  • Uno dei terminali invia un segmento con il flag FIN a 1, e l'applicazione si mette in stato di attesa di fine, cioè finisce di ricevere i segmenti in corso e ignora i successivi
  • Dopo la ricezione del segmento, l'altro terminale invia un'accusa di ricezione con il flag FIN a 1 e continua a spedire i segmenti in corso. In seguito a questo il terminale informa l'applicazione che un segmento FIN è stato ricevuto, poi invia un segmento FIN all'altro terminale, chiudendo così la connessione….

Ulteriori informazioni

Per ulteriori informazioni sul protocollo TCP, la cosa migliore è fare riferimento alla RFC 793 che spiega in dettaglio il protocollo  :



Ultime modificazione ilvenerdì 6 febbraio 2009 alle 16:51:56


Questo documento intitolato «  » da Kioskea (it.kioskea.net) è reso disponibile sotto la licenza Creative Commons. È possibile copiare, modificare le copie di questa pagina, alle condizioni previste dalla licenza, come questa nota appare chiaramente.