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 :
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.
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.
Un segmento TCP è costituito come segue :
| 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 | ||||||||||||||||||||||||||||||
dati |
URG | ACK | PSH | RST | SYN | FIN | |||||||||||||||||||||||||
| Opzioni | Riempimento | ||||||||||||||||||||||||||||||
Significato dei differenti campi :
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…
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 :
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 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!
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).
Tanto il client quanto il server possono chiedere di mettere fine ad una connessione
La fine della connession avviene in questo modo :
Per ulteriori informazioni sul protocollo TCP, la cosa migliore è fare riferimento alla RFC 793 che spiega in dettaglio il protocollo :