Livello trasporto
Servizi
Multiplexing e
demultiplexing
Trasporto senza
connessione: UDP
Principi di trasferimento
affidabile
TCP
Struttura del segmento
Trasferimento dati
affidabile
Controllo del flusso
Gestione della connessione
Principi di controllo della
congestione
Controllo della
congestione in TCP
TCP (1/2)
Definito negli RFC 793,
Pipelined: controllo del
1122, 1323, …
Point-to-point:
connessione tra un
sender ed un receiver
Full-duplex: flusso di
dati bidirezionale nella
stessa connessione
Sequenza ordinata,
senza errori
flusso e della congestione
regolano la finestra di
trasmissione
Connection-oriented:
handshake a tre vie prima
dell’invio dei dati
1
TCP (2/2)
Basato su una versione del protocollo sliding
window con dimensione della finestra di
trasmissione variabile
La PDU prende il nome di segmento
La quantità massima di dati del segmento
(MSS, Maximum Segment Size) è negoziata
quando si attiva la connessione
TCP: buffer di ricezione/trasmissione
I dati vengono accumulati in buffer sia in trasmissione
sia in ricezione:
I dati vengono passati attraverso il socket ad un buffer di
trasmissione, da cui vengono prelevati per creare un
segmento
I dati ricevuti vengono memorizzati in un buffer di ricezione
socket
door
application
writes data
application
reads data
TCP
send buffer
TCP
receive buffer
socket
door
segment
2
TCP - trasmissione
In trasmissione il protocollo deve:
Accettare un flusso dati da livello applicazione
Spezzare il flusso dati in segmenti; ogni segmento
verrà incapsulato in un pacchetto a livello rete
Trasmettere i segmenti tramite un sottostante
livello rete inaffidabile
Gestire gli errori di trasmissione con la
ritrasmissione dei segmenti
TCP - ricezione
In ricezione il protocollo deve:
Ricevere i segmenti dal livello rete
Segnalare i segmenti danneggiati
Riordinare i segmenti ricevuti
Consegnare i dati nei segmenti a livello
applicazione
3
Segmento TCP
URG: dati urgenti
(generalmente
non usato)
campo riscontro valido
32 bit
n. porta sorg.
n. porta dest.
sequenza e ACK
n. di sequenza
n. di riscontro
lunghezza intestazione
PSH: push data
(generalmente
non usato)
RST, SYN, FIN:
apertura connessione
head not
UAP R S F
len used
checksum
finestra ricezione
Urg data pointer
opzioni (lungh. variable)
dati
applicativi
(lungh. variabile)
n. bytes che il
receiver può
accettare
Internet
checksum
(come UDP)
Opzioni
Definite durante l’apertura della connessione, o
durante la connessione
Negoziazione MSS
Negoziazione Window scale, fattore di scala della
finestra di ricezione, che può aumentare fino a 230
bytes
Timestamp: usato per il calcolo del RTT
4
TCP – numeri di sequenza e ACK
Dati: sequenza ordinata di
byte
Sequenza: posizione,
rispetto alla sequenza di
byte, del primo byte del
segmento
ACK: prossimo byte atteso
Riscontro cumulativo: la
perdita di un ACK non
blocca la trasmissione se
confermato da un ACK
successivo
Nessuna specifica su
segmenti fuori ordine
outgoing segment from sender
source port #
dest port #
sequence number
acknowledgement number
rwnd
checksum
urg pointer
window size
N
sender sequence number space
sent
ACKed
sent, not- usable not
yet ACKed but not usable
yet sent
(“inflight”)
incoming segment to sender
source port #
dest port #
sequence number
acknowledgement number
rwnd
A
checksum
urg pointer
TCP – trasferimento affidabile
Pipelining dei segmenti
ACK cumulativi
Timer unico per la ritrasmissione (RFC 6298)
Il receiver invia un ACK, che può essere a
piggyback di un segmento contenente anche
dati
Ritrasmissione in seguito a:
timeout
ACK duplicati
5
Receiver TCP (RFC 1122, RFC 5681)
Arrivo di un segmento in ordine, tutti i segmenti
già riscontrati: attesa massima di 500 ms di un
altro segmento in ordine e invio di ACK
(delayed ACK)
Arrivo di un segmento in ordine, con numero di
sequenza atteso e un segmento in attesa di
trasmissione di ACK: invio ACK cumulativo
Arrivo di segmento fuori ordine: invio ACK
duplicato. Il segmento non viene scartato
Arrivo di segmento che chiude un buco nella
sequenza dei dati ricevuti, alla base della
finestra: invio immediato di ACK cumulativo
Sender TCP semplificato
No ACK duplicati, no controllo flusso, no
controllo congestione
Eventi:
dati passati dal livello applicativo: TCP crea
segmento, lo passa a livello IP. Se non attivo, il
timer viene avviato
timeout: il TCP ritrasmette il segmento che ha
causato l’evento di timeout e riavvia il timer
arrivo di un riscontro: un riscontro conferma tutti i
byte precedenti il byte di riscontro. Se ci sono
segmenti non riscontrati, riavvia il timer
6
Sender TCP (semplificato)
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
wait
for
event
data received from application above
create segment, seq. #: NextSeqNum
pass segment to IP (udt_send)
NextSeqNum = NextSeqNum + length(data)
if (timer currently not running)
start timer
timeout
retransmit not-yet-acked segment
with smallest seq. #
start timer
ACK received, with ACK field value y
if (y > SendBase) {
SendBase = y
/* SendBase–1: last cumulatively ACKed byte */
if (there are currently not-yet-acked segments)
start timer
else stop timer
}
Sender TCP - Ritrasmissione veloce
La perdita di segmenti viene dedotta da ACK
duplicati:
Il sender spesso invia tanti segmenti
se un segmento è perso, ci saranno molti ACK
duplicati
Al terzo ACK duplicato per lo stesso segmento,
il sender deduce che il segmento successivo è
andato perso
ritrasmissione veloce (fast retransmit):
ritrasmissione del segmento prima del timeout
7
RTT e timeout
Deve essere timeout > RTT, altrimenti
ritrasmissioni non necessarie
RTT varia nel tempo
Se il timeout è troppo piccolo esiste rischio di
timeout prematuri, con ritrasmissioni inutili.
Se il timeout è troppo grande, c’è scarsa efficienza
nella gestione delle ritrasmissioni.
Algoritmo (Jacobson ‘88) che regola il timer in
base alla misurazione della rete
Stima di RTT
SampleRTT = RTT campione = tempo tra la
trasmissione del segmento e il ricevimento
del riscontro relativo
SampleRTT varia nel tempo:
EstimatedRTT = (1- ) * EstimatedRTT + SampleRTT
Parametro legato alla varianza di RTT
DevRTT=(1-)*DevRTT+*|SampleRTT–EstimatedRTT|
Media esponenziale pesata (EWMA) dei
valori campioni: l’influenza dei campioni
vecchi decresce esponenzialmente
Valori tipici di e sono 0.125 e 0.25
8
Timeout
Timeout = EstimatedRTT + 4 * DevRTT
Algoritmo di Karn: RTT dei segmenti
ritrasmessi non influisce su stima RTT.
Per ogni nuovo segmento si utilizza l’algoritmo di
Jacobson
Per ogni segmento da ritrasmettere il timeout è
impostato al doppio del precedente. Dopo il
ricevimento di ACK o la ricezione di dati da livello
applicazione, il timeout viene impostato in base ai
valori più recenti di EstimatedRTT e DevRTT
TCP: apertura della connessione
Prima dello scambio dati, sender e receiver si
"stringono la mano":
Concordano sull’aprire la connessione
Concordano su alcuni parametri
A livello trasporto, la richiesta del client genera un
segmento TCP di richiesta connessione
La sottorete di comunicazione può perdere o
duplicare i pacchetti
Sono necessari protocolli sofisticati per attivare la
connessione
9
Apertura connessione (handshake)
La richiesta del client è un segmento SYN (SYN bit posto
a 1) che indica il numero di sequenza iniziale
Se sul server un processo è in attesa di richieste sulla
porta destinazione specificata nel segmento
il server alloca buffer e variabili per la connessione
invia un segmento di controllo SYNACK che contiene SYN bit
posto a 1, riscontro per SYN ricevuto, e numero di sequenza
iniziale per il server
Se non esiste processo in attesa il server invia segmento
con RST=1
Il client riceve SYNACK e alloca buffer e variabili per la
connessione. Invia ACK con SYN bit posto a 0 (può
contenere dati)
Ogni segmento con SYN=1 conta come un singolo byte
Apertura della connessione
client state
server state
LISTEN
LISTEN
choose init seq num, x
send TCP SYN msg
SYNSENT
ESTAB
received SYNACK(x)
indicates server is live;
send ACK for SYNACK;
this segment may contain
client-to-server data
SYNbit=1, Seq=x
choose init seq num, y
send TCP SYNACK
SYN RCVD
msg, acking SYN
SYNbit=1, Seq=y
ACKbit=1; ACKnum=x+1
ACKbit=1, ACKnum=y+1
received ACK(y)
indicates client is live
ESTAB
10
TCP 3-way handshake: FSM
closed
Socket connectionSocket =
welcomeSocket.accept();
SYN(x)
SYNACK(seq=y,ACKnum=x+1)
create new socket for
communication back to client
listen
Socket clientSocket =
newSocket("hostname","port
number");
SYN(seq=x)
SYN
sent
SYN
rcvd
SYNACK(seq=y,ACKnum=x+1)
ACK(ACKnum=y+1)
ESTAB
ACK(ACKnum=y+1)
Apertura della connessione - esempi
11
Chiusura connessione
Rilascio asimmetrico: dati in transito potrebbero
essere persi
Chiusura della connessione
Rilascio simmetrico: le due entità devono
concordare prima di rilasciare l’intera
connessione
Da A a B: io sono pronto a chiudere, e tu?
Da B a A: anch’io sono pronto.
Da A a B: ok, arrivederci
Ogni direzione è rilasciata indipendentemente
dall’altra: una entità continua a ricevere dati
anche dopo aver chiesto la chiusura
12
Chiusura della connessione
Il problema delle due armate
Chiusura connessione
Three way handshake con timeout; non è
infallibile ma considerato adeguato
Client (chi chiude la connessione) invia
segmento di controllo FIN, con FIN bit posto a 1:
entra in stato d’attesa per ACK
ricevuto ACK, rilascia la connessione ed entra in stato
d’attesa per FIN
ricevuto FIN invia ACK ed entra in stato TIME WAIT
Server riceve FIN e risponde con ACK
Invia FIN a client e fa partire timer
riceve ACK, rilascia la connessione
13
TCP: chiusura connessione
client state
server state
ESTAB
ESTAB
clientSocket.close()
FIN_WAIT_1
FIN_WAIT_2
can no longer
send but can
receive data
FINbit=1, seq=x
CLOSE_WAIT
ACKbit=1; ACKnum=x+1
wait for server
close
FINbit=1, seq=y
TIME_WAIT
timed wait
for 2*max
segment lifetime
can still
send data
LAST_ACK
can no longer
send data
ACKbit=1; ACKnum=y+1
CLOSED
CLOSED
14
© Copyright 2025 Paperzz