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.
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:
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.
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.
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.
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.
«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.
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 |
|---|---|---|---|
| 21 | TCP | FTP | trasferimento file |
| 22 | TCP | SSH | terminale virtuale criptato |
| 23 | TCP | TELNET | terminale virtuale in chiaro |
| 25 | TCP | SMTP | invio posta elettronica |
| 53 | UDP | DOMAIN | server DNS |
| 80 | TCP | HTTP | server web |
| 110 | TCP | POP3 | ricezione posta elettronica |
| 443 | TCP | HTTPS | server web con connessione sicura |
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.
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.
| 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.
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.
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.
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.
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.
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.
U A P R S F abbreviano URG, ACK, PSH, RST, SYN e FIN; ciascun bit attiva una funzione distinta.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.
| 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 |
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
È 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.
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.
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.
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.