vuoi
o PayPal
tutte le volte che vuoi
ACK(A).
Timeout e stima del tempo di ritrasmissione: sicuramente timeout>RTT. Si indica
con SampleRTT il tempo che intercorre fra l’invio del segmento e la ricezione del
relativo ack (non calcolato per segmenti ritrasmessi). Questo valore può essere
estremamente variabile e quindi inopportuno come timeoutsi usa EstimatedRTT,
combinazione ponderata di SampleRTT e del precedente valore dello stesso
EstimatedRTT.
EstimatedRTT=0.875*EstimatedRTT + 0.125*SampleRTT. Il timeout viene impostato
quindi a EstimatedRTT più un certo margine che varia in base all’entità della
fluttuazione di SampleRTT.
Ritrasmissione rapida (Triplice ACK): normalmente bisogna aspettare la scadenza
del timeout per ritrasmettere i pacchetti, ma questo tempo potrebbe essere lungo. Il
mittente può in molti casi rilevare la perdita del pacchetto prima della scadenza del
timeout e ritrasmetterlo subito. Quando un destinatario TCP riceve un segmento con
numero di sequenza maggiore al numero di sequenza atteso, rileva un buco nel flusso
dati. Questo viene notificato al mittente inviando nuovamente un ACK relativo
all’ultimo byte di dati ricevuto in ordine: una sorta di ‘sollecitazione’. Il mittente quindi
vedrà recapitarsi più volte lo stesso ACK (ACK duplicato): se ne riceve tre, si considera
che il segmento che segue è stato perduto e viene ritrasmesso prima dello scadere del
timeout.
Controllo di flusso: quando TCP riceve byte corretti e in sequenza, li posizione nel
buffer di ricezione (rcvbuffer). L’applicativo associato leggerà i dati da questo buffer,
ma non necessariamente nel momento in cui arrivano. Per processi molto lenti il buffer
potrebbe riempirsi prima di essere letto e svuotato.
Il controllo di flusso permette di evitare la saturazione del buffer di ricezione. Il
mittente mantiene una variabile chiamata Receive Window (rwnd) che fornisce
un’indicazione sul suo spazio disponibile nel buffer.
Definendo LastByteRead come ultimo byte che l’applicativo ha letto dal buffer e
LastByteRcvd l’ultimo byte ricevuto e salvato nel buffer si ha che LastByteRcvd-
LastByteRead ≤ RcvBuffer, e che rwnd = RcvBuffer – [LastByteRcvd-LastByteRead].
Altri due parametri sono LastByteSent e LastByteAcked, che tengono conto dell’ultimo
byte inviato e dell’ultimo byte di cui si ha ricevuto l’ACK. Mantenendo la quantità di
dati non ancora ACKed (quindi LastByteSent-LastByteAcked) al di sotto del valore rwnd
si evita la saturazione.
Problema tecnico: se A riempie il buffer deve mandare un messaggio a B con rcwn=0.
In tal caso B ferma l’invio e aspetta che A mandi un nuovo messaggio con rwnd non
nulla. Ma se A non avesse più niente da inviare come fa B a sapere che il buffer si è
liberato? Anche se è pieno quindi A deve continuare a mandare messaggi con parte
dati di un byte per informare B sullo stato di rwnd.
Controllo della congestione
Per controllare la congestione si aggiunge un parametro di controllo della velocità in
uscita: cwnd. Questo parametro indica quanti pacchetti posso inviare in sequenza
prima che arrivi l’ack del primo della sequenza. La condizione perché non ci sia
congestione si aggiorna a: LastByteSent-LastByteAcked ≤ min(rwnd, cwnd).
Se non c’è congestione TCP incrementa il tasso trasmissivo, altrimenti lo rallenta.
L’algoritmo che regola questi cambiamenti si compone di tre fasi:
Slow start.
Quando si stabilisce una connessione TCP, cwnd è inizializzato a 1 (MSS). Il suo
valore è incrementato di 1 ogni volta che un segmento trasmesso riceve
ACKraddoppio della velocità trasmissiva (1,2,4,8,16 etc) ad ogni RTT.
Se c’è un evento di perdita indicato dallo scadere di un timeout, cwnd torna a 1
e pone il parametro ssthresh=cwnd/2, cioè metà del valore che aveva la
finestra quando si è verificata la congestione.
La finestra riparte da 1 e sale in slow start fino al raggiungimento di ssthresh,
quando entra in C.A.
Congestion Avoidance.
Dalla soglia in su cwnd aumenta in modo lineare: +1 ad ogni RTT.
Se scade un timeout C.A. si comporta come S.S. Invece se la notifica di
congestione è data dall’arrivo di un triplice ACK la risposta varia a seconda del