Parte III — Trasporto affidabile e TCP · Capitolo 9

TCP: funzioni principali e formato del segmento

~35 min di lettura5 widget interattivi

In questo capitolo

  1. Il livello di trasporto in Internet
  2. Multiplazione, demultiplazione e modello client-server
  3. La scelta delle porte e le well-known port
  4. Il protocollo TCP
  5. Il segmento TCP e le dimensioni
  6. Formato del segmento
  7. Uso dei campi: lettura del segmento
  8. Verifica le tue conoscenze

1. Il livello di trasporto in Internet

Il livello di trasporto fornisce un servizio di trasferimento dati fra i processi applicativi di un host sorgente e quelli di un host destinazione. Il suo compito è svincolare gli strati superiori dai problemi della rete sottostante: la comunicazione che espone alle applicazioni è end-to-end, anche quando il percorso attraversa più router e più tecnologie di collegamento.

Host terminale A Host terminale B APP. APP. collegamento logico fra processi applicativi TCP / UDP TCP / UDP collegamento logico fra host terminali IPIP IPIP IP servizio connectionless attraverso i router L2 L2 L2 L2 L2 L1 L1 L1 L1 L1 collegamento fisico tramite apparati e reti differenti
Tavola 9.1 — Le diverse estensioni del collegamento logico. Solo il livello di trasporto collega direttamente i due host terminali e offre alle applicazioni un servizio indipendente dal percorso IP.

Il trasporto è dunque l'interfaccia fra applicazione e rete. L'interazione avviene attraverso un Transport Service Access Point, o T-SAP, che negli standard di Internet prende il nome di porta. Più processi possono accedere contemporaneamente allo stesso protocollo di trasporto: il T-SAP permette di distinguerli senza imporre all'applicazione di conoscere il funzionamento di IP.

Il servizio può operare in due modalità. In modalità connectionless ogni unità viene trasferita senza instaurare una connessione; in modalità connection-oriented lo scambio è preceduto dall'apertura e seguito dalla chiusura di una connessione, il cui andamento deve essere controllato. I due protocolli principali di Internet fissano le alternative:

Idea chiave

Il servizio end-to-end non elimina l'inaffidabilità di IP: la nasconde all'applicazione quando si usa TCP. È il livello di trasporto, presente soltanto negli host terminali, a costruire affidabilità sopra un trasferimento di pacchetti connectionless e inaffidabile.

2. Multiplazione, demultiplazione e modello client-server

Su uno stesso host possono essere in esecuzione molte applicazioni che richiedono simultaneamente il servizio di trasporto. In trasmissione il protocollo raccoglie i dati provenienti dai diversi processi e li consegna a un unico livello IP: è la multiplazione. In ricezione compie l'operazione inversa, cioè smista i dati ricevuti da IP verso il processo corretto: è la demultiplazione.

Il numero di porta identifica univocamente un particolare processo applicativo in esecuzione su un host che usa il protocollo di trasporto. La socket è invece l'interfaccia software attraverso cui applicazione e trasporto scambiano dati. Porta e socket non sono sinonimi: la prima è un identificativo numerico trasportato nell'intestazione, la seconda è l'oggetto software usato dal processo.

Host A · 137.204.59.10 3301 10328 3300 TCP / UDP IP tre processi, un solo strato IP Host B · 137.204.56.20 22 3301 TCP/IP Host C · 137.204.57.85 53 80 TCP / UDP IP multiplexing demultiplexing
Tavola 9.2 — Le porte rendono possibile la multiplazione. La destinazione non consegna genericamente il pacchetto «all'host»: usa protocollo e porta per individuare il processo applicativo corretto.

Il concetto di flusso

Un flusso bidirezionale fra due applicazioni si identifica mediante indirizzi, porte e protocollo di trasporto. La notazione delle slide è:

<IP-sorg:porta-sorg, IP-dest:porta-dest, protocollo>

<137.204.59.10:3300, 137.204.57.85:80, tcp>
<137.204.59.10:3301, 137.204.57.85:80, tcp>
<137.204.56.20:3301, 137.204.57.85:80, tcp>
<137.204.59.10:10328, 137.204.56.20:22, tcp>

Due flussi diretti alla stessa porta 80 restano distinti se cambia almeno uno degli altri elementi. L'identificazione comprende il protocollo: una porta TCP e una porta UDP con lo stesso numero appartengono a spazi logici differenti.

Apertura passiva e apertura attiva

Nel modello client-server, il processo server eroga un servizio e si predispone a ricevere richieste mediante un'apertura passiva. Apre una socket e si mette in ascolto sulla relativa porta: con UDP attende un datagramma contenente dati applicativi; con TCP attende una richiesta di apertura della connessione. Un server eseguito in background in ambiente Linux-UNIX è detto demone.

Il processo client compie invece un'apertura attiva. Con UDP apre una socket inviando direttamente un datagramma applicativo; con TCP invia una richiesta di apertura della connessione. Per raggiungere il server deve conoscerne sia l'indirizzo IP sia il numero di porta.

Nota del redattore

«Passiva» non significa che il server non esegua codice: significa che non sceglie il peer e resta in attesa. «Attiva» indica invece che il client seleziona una socket di destinazione e dà inizio allo scambio.

3. La scelta delle porte e le well-known port

L'indirizzo IP del server può essere inserito direttamente dall'utente oppure ricavato traducendo un nome DNS. Il numero di porta segue invece una convenzione: i server dello stesso tipo usano un valore definito a priori fra le well-known port. Un server HTTP, per esempio, usa la porta TCP 80.

L'elenco è definito dalla IANA ed è consultabile sul suo sito oppure, nei sistemi Linux-UNIX, nel file /etc/services. Un servizio che non usa una porta nota risulta raggiungibile soltanto a chi conosce l'indicazione completa, come http://www.mioserver.unibo.it:8088. Quando apre una socket, un client non dovrebbe scegliere localmente una porta nota.

Intervallo Classe Uso indicato nelle slide
1–1023 well-known usate soltanto dai server in apertura passiva
1024–49151 registrate usate da alcuni servizi ma anche dai client
49152–65535 dinamiche usate dai client

I numeri di porta TCP e UDP sono campi a 16 bit. La classificazione dell'intervallo non sostituisce l'indicazione del protocollo: l'associazione IANA riguarda una coppia composta da numero e protocollo di trasporto.

Porta Protocollo Nome Tipo di servizio
21TCPFTP trasferimento file
22TCPSSH terminale virtuale criptato
23TCPTELNET terminale virtuale in chiaro
25TCPSMTP invio posta elettronica
53UDPDOMAIN server DNS
80TCPHTTP server web
110TCPPOP3 ricezione posta elettronica
443TCPHTTPS server web con connessione sicura
Per l'esame

Tenere distinti tre oggetti: la porta identifica il processo sull'host, la socket è l'interfaccia software usata dall'applicazione, il flusso è identificato dalla coppia di endpoint IP-porta insieme al protocollo. La sola porta di destinazione non identifica una connessione TCP.

4. Il protocollo TCP

Il Transmission Control Protocol è definito nella RFC 793, con estensioni nella RFC 1323. Realizza una comunicazione affidabile full-duplex fra processi applicativi di due host, in modalità connection-oriented e con controllo di flusso. Full-duplex significa che i dati possono essere trasferiti in entrambe le direzioni della stessa connessione.

Il progetto assume deliberatamente che il livello inferiore offra soltanto un servizio connectionless e inaffidabile di trasferimento pacchetti: esattamente il servizio di IP. TCP deve quindi prevedere tutte le procedure necessarie a instaurare una connessione, controllarne il corretto andamento e infine terminarla.

Le funzioni principali

Obiettivo Meccanismo TCP
Affidabilità numerazione sequenziale dei dati prendendo il byte come unità; acknowledgement dei blocchi ricevuti; ritrasmissione dei dati non confermati
Controllo di flusso e congestione meccanismo a finestra che regola il flusso inviato dalla sorgente
Controllo dell'errore checksum a 16 bit su tutto il contenuto informativo

I dati applicativi sono trattati come un flusso continuo di byte, non come una sequenza di messaggi. Per questo il numero di sequenza si riferisce ai byte, e una conferma indica il primo byte che il ricevitore deve ancora ricevere. Il meccanismo ARQ è a finestra scorrevole: la procedura di base è Go-Back-N, mentre una modalità selettiva può essere negoziata mediante SACK.

Per l'esame

La promessa di consegna corretta vale finché esiste connettività a livello di rete. TCP non crea un percorso quando IP non riesce più a trasferire pacchetti; rende affidabile lo scambio sul percorso disponibile mediante sequenze, ACK, ritrasmissioni, finestre e checksum.

5. Il segmento TCP e le dimensioni

TCP incapsula i dati applicativi in unità informative chiamate segmenti. Ogni segmento comprende un'intestazione standard di 20 byte, un'eventuale estensione dell'intestazione di dimensione variabile per negoziare opzioni e un payload di dimensione variabile, anche nulla, contenente i dati dell'applicazione.

La Maximum Segment Size, o MSS, è la massima dimensione del blocco di dati applicativi che può essere contenuto nel segmento. Non coincide quindi con la dimensione totale del segmento: l'intestazione TCP non fa parte della MSS.

payload IP massimo       = 65535 − 20 byte di header IP
MSS massima teorica      = 65535 − 20 − 20 = 65495 byte

valore normalmente usato:
MSS = MTU − header IP − header TCP

con Ethernet e intestazioni standard:
MSS = 1500 − 20 − 20 = 1460 byte

La MSS deve rispettare due vincoli. Non può superare la massima dimensione del payload IP meno l'intestazione TCP, da cui il limite teorico di 65495 byte. Deve inoltre rispettare le Maximum Transmission Unit delle reti attraversate; Ethernet impone tipicamente una MTU di 1500 byte. Il valore dipende dall'implementazione ed è configurabile.

Path MTU Discovery

In generale il mittente non conosce la MTU di ogni rete intermedia. IP può frammentare i pacchetti che eccedono un limite lungo il percorso, ma la frammentazione può produrre inefficienza. La Path MTU Discovery, definita nella RFC 1191, cerca il limite del percorso usando il bit DF dell'intestazione IP e il relativo messaggio ICMP.

Attenzione

MTU, segmento e MSS misurano oggetti diversi. La MTU limita il pacchetto trasportabile dalla rete; il segmento comprende header TCP e dati; la MSS misura soltanto i dati applicativi. Sottrarre sempre entrambe le intestazioni quando si parte dalla MTU IP.

6. Formato del segmento

L'intestazione TCP è organizzata in righe da 32 bit. Le prime cinque righe formano l'intestazione standard da 20 byte; le opzioni possono allungarla, e il padding la riporta a un multiplo di 32 bit. La posizione iniziale dei dati non è quindi fissa in presenza di opzioni ed è indicata dal campo Header Length.

08 162431 Source PortDestination Port Sequence Number Acknowledgment Number HeaderLength Reserved6 bit U A P R S F R C S S Y I G K H T N N Window ChecksumUrgent Pointer OptionsPadding Data ogni riga = 32 bit · intestazione minima = 5 righe = 20 byte
Tavola 9.3 — Il formato del segmento TCP. Le sei lettere U A P R S F abbreviano URG, ACK, PSH, RST, SYN e FIN; ciascun bit attiva una funzione distinta.

Porte, sequenza e acknowledgement

Source Port e Destination Port contengono i numeri di porta sorgente e destinazione e sostengono multiplazione, demultiplazione e identificazione della connessione. Il Sequence Number è il numero di sequenza del primo byte contenuto nel segmento; se è presente SYN, rappresenta il numero iniziale sul quale sincronizzarsi.

Quando il bit ACK vale 1, l'Acknowledgment Number è il numero di sequenza del primo byte del prossimo blocco ancora da ricevere. L'ACK è quindi cumulativo: confermare il byte n atteso implica che tutti i byte precedenti sono stati ricevuti.

I bit di controllo

Bit Significato quando vale 1
ACK il segmento trasporta un acknowledgement valido
RST resetta la connessione e rifiuta un segmento o un tentativo di connessione non valido
SYN apre la connessione e sincronizza i numeri di sequenza iniziali
FIN indica la fine dei dati e chiude la direzione dal trasmettitore al ricevitore
PSH richiede la consegna immediata dei dati all'applicazione, cioè la funzione push
URG rende significativo l'Urgent Pointer e segnala la presenza di dati urgenti

Finestra, checksum e pseudo-intestazione

Il campo Window esprime il numero di byte che il ricevitore è disposto ad accettare a partire dal numero indicato in Acknowledgment Number. È l'advertised window usata insieme all'ARQ sliding window per il controllo di flusso. La procedura predefinita è Go-Back-N; Selective Repeat è negoziabile mediante l'opzione SACK.

Il Checksum applica l'Internet checksum a blocchi di 16 bit su intestazione e dati. Nel calcolo si include anche una pseudo-intestazione IP, che non viene aggiunta al segmento trasmesso ma permette di verificare gli indirizzi e il protocollo di trasporto.

Pseudo-intestazione usata nel calcolo del checksum 08162431 Source Address Destination Address 0 Protocol = 6 TCP Length La pseudo-intestazione non appartiene al segmento TCP. entra soltanto nel checksum a 16 bit Protocol = 6 lega il controllo a TCP; TCP Length copre intestazione e dati TCP.
Tavola 9.4 — La pseudo-intestazione IP. Il checksum copre così non soltanto il segmento, ma anche l'associazione agli indirizzi IP e al protocollo di trasporto indicato dal valore 6.

Campi di servizio e opzioni

Header Length misura l'intestazione TCP in parole di 32 bit e indica dove iniziano i dati. Urgent Pointer punta all'ultimo byte dei dati urgenti e ha senso soltanto se URG vale 1. Il campo Reserved è destinato a usi futuri e deve essere posto a zero.

Options contiene i parametri eventualmente negoziati per la connessione; le slide evidenziano il valore MSS ammesso, il fattore di scala dell'advertised window e l'uso dei Selective Acknowledgment, SACK. Padding aggiunge i bit necessari affinché la lunghezza complessiva dell'intestazione sia multipla di 32 bit.

Idea chiave

Ogni famiglia di funzioni lascia una traccia nell'header: porte per la multiplazione; SYN, ACK, RST e FIN per la connessione; SEQ e ACK per la sequenza; Window per ARQ e flusso; Checksum per gli errori; Options per estendere ciò che i 20 byte standard non possono esprimere.

7. Uso dei campi: lettura del segmento

La lettura di un segmento deve procedere dalle informazioni che identificano lo scambio a quelle che ne descrivono lo stato. Prima si individuano porte sorgente e destinazione; poi si controllano i bit che rendono validi o specializzano gli altri campi; infine si interpretano numeri di sequenza, acknowledgement, finestra e checksum.

Una lettura ragionata

Nel segmento proposto dal widget, la coppia 10328 → 80 indica un processo client diretto a un server HTTP. Il primo dato parte dal byte 1001. Con ACK attivo, il valore 5001 dichiara che il prossimo byte atteso nell'altra direzione è il 5001; tutti i precedenti sono già confermati.

La finestra 4096 autorizza la controparte a inviare 4096 byte a partire proprio dall'Acknowledgment Number. Il valore dell'header length, cinque parole da 32 bit, corrisponde ai 20 byte standard e indica assenza di opzioni in questo esempio. PSH richiede la consegna immediata del payload all'applicazione; Reserved deve rimanere zero.

endpoint locale       137.204.59.10:10328
endpoint remoto       137.204.57.85:80
protocollo            TCP

flusso = <137.204.59.10:10328, 137.204.57.85:80, tcp>

SEQ = 1001            primo byte del payload
ACK = 5001            prossimo byte atteso nella direzione opposta
WINDOW = 4096         byte accettabili a partire da ACK
Per l'esame

Non interpretare mai un campo isolatamente. Acknowledgment Number è significativo quando ACK vale 1; Urgent Pointer quando URG vale 1; con SYN, Sequence Number è il numero iniziale da sincronizzare. È la combinazione fra campi, non il singolo valore, a descrivere il segmento.

Verifica le tue conoscenze

Qual è la funzione del T-SAP e come viene chiamato negli standard Internet?

Il Transport Service Access Point è il punto di accesso attraverso cui gli strati superiori interagiscono con il livello di trasporto. Negli standard Internet è chiamato porta. Il suo identificativo numerico consente al trasporto di distinguere i processi applicativi che usano contemporaneamente lo stesso servizio.

Qual è la differenza essenziale fra UDP e TCP?

UDP offre un servizio connectionless e non affidabile: non instaura una connessione prima di inviare i datagrammi. TCP offre un servizio connection-oriented e affidabile, full-duplex e con controllo di flusso; deve quindi instaurare, controllare e terminare la connessione.

Che cos'è una socket e perché non coincide con una porta?

La socket è l'interfaccia software attraverso cui il livello di trasporto scambia dati con l'applicazione. La porta è invece l'identificativo numerico del processo applicativo sull'host. La socket è usata dal programma; il numero di porta compare nei campi del protocollo.

Come si identifica un flusso bidirezionale fra applicazioni?

Con la tupla <IP-sorg:porta-sorg, IP-dest:porta-dest, protocollo>. Occorrono entrambi gli endpoint e il protocollo di trasporto: più client possono raggiungere la stessa porta server senza confondere i flussi, perché differiscono per indirizzo o porta sorgente.

Che cosa sono apertura passiva e apertura attiva?

Il server compie un'apertura passiva: apre una socket e resta in ascolto su una porta, in attesa di un datagramma UDP o di una richiesta di connessione TCP. Il client compie un'apertura attiva: seleziona indirizzo e porta del server e invia direttamente un datagramma UDP oppure una richiesta di apertura TCP. Un server in background su Linux-UNIX è detto demone.

Quali sono gli intervalli delle porte e quale porta dovrebbe scegliere un client?

Le porte a 16 bit sono divise in 1–1023 well-known, riservate ai server in apertura passiva; 1024–49151 registrate, usate da servizi e client; 49152–65535 dinamiche, usate dai client. Un client non dovrebbe usare localmente una porta nota. Le associazioni sono definite da IANA e compaiono anche in /etc/services.

Perché la MSS TCP non può superare 65495 byte?

Un pacchetto IP può misurare al massimo 65535 byte. Sottraendo 20 byte di intestazione IP standard e 20 byte di intestazione TCP standard restano 65535 − 20 − 20 = 65495 byte per i dati applicativi. La MSS misura proprio il massimo payload applicativo del segmento, non il segmento intero.

Qual è la relazione fra MSS e MTU?

Normalmente MSS = MTU − header IP − header TCP. Con la tipica MTU Ethernet di 1500 byte e intestazioni standard da 20 byte si ottiene una MSS di 1460 byte. Se l'intestazione TCP contiene opzioni, la sua maggiore lunghezza riduce ulteriormente lo spazio disponibile per i dati.

A che cosa serve la Path MTU Discovery e su quali segnali si basa?

Serve a scoprire il limite di MTU lungo un percorso che attraversa reti intermedie non note, evitando l'inefficienza della frammentazione. L'algoritmo è definito nella RFC 1191 e usa il bit DF dell'intestazione IP insieme al relativo messaggio ICMP.

Che cosa significano Sequence Number, Acknowledgment Number e Window?

Sequence Number identifica il primo byte contenuto nel segmento; con SYN indica il numero iniziale da sincronizzare. Con ACK a 1, Acknowledgment Number indica il primo byte del prossimo blocco ancora da ricevere. Window indica quanti byte il ricevitore accetta a partire da quel valore di ACK, realizzando ARQ e controllo di flusso window based.

Che cos'è la pseudo-intestazione IP e perché entra nel checksum TCP?

È un blocco formato da indirizzo IP sorgente, indirizzo IP destinazione, otto bit a zero, protocollo uguale a 6 e lunghezza TCP. Non viene trasmesso come parte del segmento, ma entra nel calcolo dell'Internet checksum a 16 bit per controllare anche la correttezza degli indirizzi e del protocollo di trasporto, oltre a header e dati TCP.

Qual è il significato dei bit SYN, FIN, RST e ACK?

SYN apre la connessione e sincronizza i numeri iniziali; FIN segnala la fine dei dati e chiude la direzione dal mittente al ricevitore; RST resetta la connessione o rifiuta segmenti e tentativi non validi; ACK rende valido l'Acknowledgment Number e indica che si sta inviando una conferma.

Quali opzioni TCP sono evidenziate nelle slide?

Il valore di MSS ammesso, il fattore di scala della advertised window e l'uso dei Selective Acknowledgment, SACK. Quest'ultimo permette di negoziare una modalità di recupero selettiva rispetto al comportamento Go-Back-N di base.

A che cosa servono Header Length, Urgent Pointer, PSH, Padding e Reserved?

Header Length esprime la lunghezza dell'header in parole da 32 bit e localizza i dati. Urgent Pointer, valido con URG, punta all'ultimo byte urgente. PSH forza la consegna immediata all'applicazione. Padding rende l'header multiplo di 32 bit. Reserved è destinato a usi futuri e deve valere zero.