Questo protocollo, come anche l'UDP, si colloca, nel modello a strati, sopra l'Internet Protocol Layer (IP), che gestisce il trasferimento e l'instradamento del singolo pacchetto fino a destinazione, ma, oltre a questo, tiene una traccia di ciò che è stato trasmesso ed eventualmente ritrasmette quella parte di informazione che è andata persa lungo il tragitto.
- demultiplexa il traffico dei pacchetti in ingresso a tali programmi;
- usa i numeri di porta per identificare la destinazione finale all'interno di una macchina.
La differenza fondamentale con l'UDP è che il TCP garantisce un servizio di trasporto affidabile (Reliable Delivery Service), rimediando alle cause di inaffidabilità proprie dell'IP (duplicazione e perdita di dati, caduta di rete, ritardi, pacchetti ricevuti fuori ordine, etc.), anche se ciò comporta una implementazione più complessa.L'affidabilità del flusso di tale protocollo è il motivo per cui il complesso del protocollo si definisce con la sigla TCP/IP. L'affidabilità di questo servizio è caratterizzata da cinque proprietà:
- Stream Orientation - quando due programmi applicativi trasferiscono i dati (stream of bits), il flusso di essi nella macchina di destinazione passa al ricevente esattamente come esso è stato originato nella macchina sorgente.
- Virtual Circuit Connection - dal punto di vista del programmatore e dell'utente, il servizio che il TCP offre è analogo al fornire una connessione dedicata.
- Buffered Trasfer - i routers interessati dal trasferimento sono provvisti di buffer per rendere più efficiente il trasferimento e minimizzare il traffico di rete.
- Unstructured Stream - il TCP/IP stream service non adotta un flusso di dati strutturato; ovvero non vi è modo di distinguere i record che costituiscono il flusso dati.
- Full-duplex Connection - la connessione fornita dal TCP/IP stream service permette un trasferimento di flusso contemporaneo ed indipendente in entrambe le direzioni, senza apparente interazione.
Se un qualsiasi messaggio è troppo grande per un singolo pacchetto TCP (gli standard consigliano una dimensione di 576 byte compreso l'header del IP) esso viene diviso in segmenti di lunghezza fissa quindi, arrivato a destinazione, si effettua il controllo circa l'ordine e si riassembla, in modo che tale operazione risulti del tutto invisibile agli operatori.Poiché queste funzionalità sono necessarie per molte applicazioni, sono state inserite tutte in questo protocollo piuttosto che metterle, come parte del programma, in ogni applicativo che ne necessita.L'affidabilità del processo è garantita da una tecnica nota come acknowledgement with retransmission (riscontro con ritrasmissione). Tale tecnica prevede che il destinatario invii un messaggio di acknowledgement (ACK) al mittente, una volta ricevuto un pacchetto. Il mittente mantiene una copia di ciascun pacchetto spedito e la rimuove dal buffer di trasmissione solo dopo aver ricevuto l'ACK relativo ad essa.Nella configurazione di base (ma meno efficiente) il mittente, dopo aver trasmesso un pacchetto:
- aspetta di ricevere il suo ACK prima di spedire il successivo;
- fa anche partire un "cronometro" per il timeout, allo scadere del quale, se non ha ricevuto risposta, ritrasmette quello stesso pacchetto
- il primo ACK conferma i primi 500 byte;
- il secondo assicura che sono stati ricevuti i primi 1000 byte;
- il terzo garantisce fino a 1500 byte
.....e così via.Dato che, però, la dimensione dei pacchetti non è fissata, non è detto che un ACK corrisponda ad un solo pacchetto TCP.Possiamo allora definire la "finestra di acknowledgment" (da non confondere con quella di trasmissione) come:il numero di byte, ovvero il numero di pacchetti TCP, una volta fissata la loro dimensione, riconosciuti da un singolo ACK.Avere una finestra di acknowledgment ampia limita il traffico in rete generato dagli ack, poiché lo stesso numero di byte trasmesso viene riconosciuto valido con meno pacchetti ACK.Il meccanismo della finestra è molto importante perché fornisce al ricevente un mezzo per governare la mole di dati spediti dall'utente di origine. Infatti, nell'header dei pacchetti TCP esiste un campo specifico, detto "window", tramite il quale il ricevente indica al trasmittente la dimensione in byte della finestra che è disposto attualmente a ricevere (finestra del ricevente). Questo accordo avviene quando il ricevente spedisce un ACK (che è anche esso un pacchetto TCP) nel quale specifica innanzitutto l'ultima posizione riconosciuta valida e, a partire da questa, il numero di byte che attualmente può accettare.HeadersL'unità di trasporto tra i software TCP di due macchine è definito segment. I segmenti sono scambiati per:
- stabilire connessioni;
- trasferimenti di dati;
- inviare ACK;
- comunicare la dimensione della Sliding Windows;
- chiudere le connessioni.
Poichè il TCP usa il piggybacking (trasmissione contemporanea di dati in entrambe le direzioni), un ACK che viaggia da una macchina A ad una macchina B potrebbe viaggiare in uno stesso segmento in cui viaggiano i dati tra A e B, sebbene l'ACK sia riferito ai dati spediti tra B ed A.La figura seguente mostra il formato del segmento TCP:
- un TCP header;
- un TCP data.
Un header ha una lunghezza di almeno 20 byte e comprende diversi campi; i più importanti sono il "port number" e il "sequence number", sia della sorgente che della destinazione.Il numero di porta serve per distinguere fra loro i trasferimenti che avvengono contemporaneamente (devono essere conosciuti anche i numeri di porta degli altri tre nodi).Il numero di sequenza identifica la posizione dei byte dati nel flusso spedito all'interno del segmento; serve ad ordinare i pacchetti in ricezione e verificare di non averne perso nessuno; da notare che tale numerazione riguarda i byte non i pacchetti, nel senso che se si usano pacchetti da 500 byte, il primo è numerato 500, il secondo 1000, il terzo 1500 e così via.Un altro campo è il "acknowledgment number"; anche esso, come il "sequence number", è cumulativo e conta i byte anziché i pacchetti.Il campo da 2 byte "window" è quello che consente al ricevente di indicare al trasmittente la dimensione della finestra da usare per il trasferimento in corso; da notare che due alla sedici fa 64 K, cioè la dimensione massima della finestra.Gli ultimi due campi sono il "checksum" dell'header e un "urgent pointer" per alcuni casi particolari.Ovviamente, in ricezione il livello TCP ritaglia l'header TCP, il livello IP ritaglia l'header IP, il livello di rete ritaglia l'header e il checksum relativo ad esso.Fine della parte 7