6.7) Il livello transport in Internet |
Il livello transport di Internet è basato su due protocolli:
Il secondo è di fatto IP con l'aggiunta di un breve header,
e fornisce un servizio di trasporto datagram (quindi non affidabile).
Lo vedremo brevemente nel seguito.
Il protocollo TCP è stato progettato per fornire un flusso
di byte affidabile, da sorgente a destinazione, su una rete non
affidabile.
Dunque, offre un servizio reliable e connection oriented, e si occupa di:
E' un servizio full-duplex con gestione di ack e controllo del
flusso.
6.7.1) Indirizzamento |
I servizi di TCP si ottengono creando connessione
di livello transport identificata da una coppia di punti d'accesso
detti socket. Ogni socket
ha un socket number che
consiste della coppia:
Il socket number costituisce il TSAP.
I port number hanno 16 bit. Quelli minori di 256 sono i cosidetti
well-known port, riservati
per i servizi standard. Ad esempio:
Poiché le connessioni TCP, che sono full duplex e point
to point, sono identificate dalla
coppia di socket number alle due estremità, è possibile
che su un singolo host più connessioni siano attestate
localmente sullo stesso socket number.
Le connessioni TCP trasportano un flusso di byte, non di messaggi: i confini fra messaggi non sono né definiti né preservati. Ad esempio, se il processo mittente (di livello application) invia 4 blocchi di 512 byte, quello destinatario può ricevere:
Ci pensano le entità TCP a suddividere il flusso in arrivo
dal livello application in segmenti, a trasmetterli e a ricombinarli
in un flusso che viene consegnato al livello application di destinazione.
C'è comunque la possibilità, per il livello application,
di forzare l'invio immediato di dati; ciò causa l'invio
di un flag urgent che,
quando arriva dall'altra parte, fa sì che l'applicazione
venga interrotta e si dedichi a esaminare i dati urgenti (questo
succede quando, ad esempio, l'utente durante una sessione di emulazione
di terminale digita il comando ABORT (CTRL-C) della computazione
corrente).
6.7.2) Il protocollo TCP |
Le caratteristiche più importanti sono le seguenti:
I campi dell'header hanno le seguenti funzioni:
Source port,
destination port | identificano gli end point (locali ai due host) della connessione. Essi, assieme ai corrispondenti numeri IP, formano i due TSAP. |
Sequence number | il numero d'ordine del primo byte contenuto nel campo dati. |
Ack. number | il numero d'ordine del prossimo byte aspettato. |
TCP header length | quante parole di 32 bit ci sono nell'header (necessario perché il campo options è di dimensione variabile). |
URG | 1 se urgent pointer è usato, 0 altrimenti. |
ACK | 1 se l'ack number è valido (cioè se si convoglia un ack), 0 altrimenti. |
PSH | dati urgenti (pushed data), da consegnare senza aspettare che il buffer si riempia. |
RST | richiesta di reset della connessione (ci sono problemi!). |
SYN | usato nella fase di setup della connessione:
|
FIN | usato per rilasciare una connessione. |
Window size | il controllo di flusso è di tipo sliding window di dimensione variabile. Window size dice quanti byte possono essere spediti a partire da quello (compreso) che viene confermato con l'ack number. Un valore zero significa: fermati per un pò, riprenderai quando ti arriverà un uguale ack number con un valore di window size diverso da zero. |
Checksum | simile a quello di IP; il calcolo include uno pseudoheader. |
Urgent pointer | puntatore ai dati urgenti. |
Options | fra le più importanti, negoziabili al setup:
|
Nel calcolo del checksum entra anche uno pseudoheader
, in aperta violazione della gerarchia, dato che il livello TCP
in questo calcolo opera su indirizzi IP.
Lo pseudoheader non viene trasmesso, ma precede concettualmente
l'header. I suoi campi hanno le seguenti funzioni:
Source IP address,
destination IP address | indirizzi IP (a 32 bit) di sorgente e destinatario. |
Protocol | il codice numerico del protocollo TCP (pari a 6). |
TCP segment length | il numero di byte del segmento TCP, header compreso. |
6.7.3) Attivazione della connessione |
Si usa il three-way handshake visto precedentemente:
listen()
e poi accept()
rimanendo così
in attesa di una richiesta di connessione su un determinato port
number e, quando essa arriva, accettandola;
connect()
,
specificando host, port number e altri parametri quali la dimensione
massima dei segmenti, per stabilire la connessione; tale primitiva
causa l'invio di un segmento TCP col bit syn
a uno
e il bit ack
a zero;
rst
a uno, per rifiutare la connessione;
syn
ed ack
ad uno, secondo lo schema sotto riportato.
I valori di x e y sono ricavati dagli host sulla base dei loro
clock di sistema; il valore si incrementa di una unità
ogni 4 microsecondi.
6.7.4) Rilascio della connessione |
Il rilascio della connessione avviene considerando la connessione full-duplex come una coppia di connessioni simplex indipendenti, e si svolge nel seguente modo:
fin
;
Per evitare il problema dei 3 eserciti si usano i timer, impostati
al doppio della vita massima di un pacchetto.
Il protocollo di gestione delle connessioni si rappresenta comunemente
come una macchina a stati finiti.
Questa è una rappresentazione molto usata nel campo dei
protocolli, perché permette di definire, con una certa
facilità e senza ambiguità, protocolli anche molto
complessi.
6.7.5) Politica di trasmissione |
L'idea di fondo è la seguente: la dimensione
delle finestre scorrevoli non è strettamente legata agli
ack (come invece di solito avviene), ma viene continuamente adattata
mediante un dialogo fra destinazione e sorgente.
In particolare, quando la destinazione invia un ack di conferma,
dice anche quanti ulteriori byte possono essere spediti.
Nell'esempio che segue, le peer entity si sono preventivamente
accordate su un buffer di 4K a destinazione.
Anche se riceve win=0, il mittente può comunque inviare:
6.7.6) Controllo congestione |
Il protocollo TCP assume che, se gli ack non
tornano in tempo, ciò sia dovuto a congestione della subnet
piuttosto che a errori di trasmissione (dato che le moderne linee
di trasmissione sono molto affidabili).
Dunque, TCP è preparato ad affrontare due tipi di problemi:
Ciascuno dei problemi viene gestito da una specifica finestra mantenuta dal mittente:
Il mittente si regola sulla più piccola delle due.
La congestion window viene gestita in questo modo:
Vediamo ora un esempio, con segmenti di dimensione 1 Kbyte, threshold a 32 Kbyte e congestion window arrivata a 40 Kbyte:
6.7.7) Il protocollo UDP |
Il livello transport fornisce anche un protocollo
non connesso e non affidabile, utile per inviare dati senza stabilire
connessioni (ad esempio per applicazioni client-server).
Lo header di un segmento UDP è molto semplice:
La funzione di calcolo del checksum può essere disattivata,
tipicamente nel caso di traffico in tempo reale (come voce e video)
per il quale è in genere più importante mantenere
un'elevato tasso di arrivo dei segmenti piuttosto che evitare
i rari errori che possono accadere.