dopo molto cercare in rete ho trovato un buon testo (che non avevo voglia di scrivere
).
siccome non è chiarissimo spiegherò poi le varie parti in modo da renderle più comprensibili
Slow start e Congestion avoidanceAnche se la maximum window size e l’RTT insieme determinano
la massima velocità raggiungibile di trasferimento dati, c’è un
elemento aggiuntivo per il controllo di flusso richiesto per TCP. Se
una sessione
TCP (1) iniziasse immettendo un’intera finestra di dati
dentro la rete, poi ci sarebbe una forte probabilità che almeno un
pacchetto tra i dati iniziali venga perso a causa di una sovrastima
della banda disponibile per il flusso TCP, in particolare se viene
utilizzata una finestra larga. TCP adotta, invece, un approccio più
conservativo incominciando da piccoli valori della finestra di
congestione che ha una più elevata probabilità di essere trasmessa
con successo, e poi sonda la rete incrementando la quantità di dati
purché la rete non segnali congestione.
L’operazione dinamica di aggiustamento della finestra è una
componente critica di TCP per il trasferimento di grosse quantità di
dati. I meccanismi del protocollo includono un parametro
addizionale che caratterizza la finestra del sender, la congestion
window (cwnd). L’obiettivo degli algoritmi di gestione della
finestra è di incominciare a trasmettere ad una velocità che ha una
bassissima probabilità di perdita di pacchetti, per poi incrementarla
(incrementando la larghezza della cwnd) fino alla rilevazione di
una perdita che rappresenta un segnale di superamento della
capacità disponibile della rete. Il sender a questo punto
immediatamente dimezza la sua velocità di trasferimento
riducendo il valore della cwnd, e ricominciando con un incremento
graduale della rate del sender. Il vantaggio è di poter modificare in
continuazione la velocità di trasferimento dati facendo in modo che
oscilli attorno al giusto valore della capacità disponibile di rete.
Questa oscillazione abilita un aggiustamento automatico di
cambiamenti dinamici di capacità per tutta la durata del flusso di
dati.
Il controllo di flusso è ottenuto attraverso una combinazione: della
gestione del valore della cwnd, della perdita di pacchetti, della
stima dell’RTO e degli algoritmi di ritrasmissione; ed è costituito
24
da tre parti principali: slow start, congestion avoidance, e la
risposta alla perdita di pacchetti che determina come TCP scelga
tra questi due modi di operare.
Slow Start
TCP è un protocollo “self-clocking”, cioè utilizza gli ACK come
clock per introdurre nuovi pacchetti in rete (ACK-clocking).
Quando non ci sono segmenti in transito, come ad esempio
all’inizio di una connessione o dopo un timeout di ritrasmissione,
non ci saranno ACK utilizzabili. Slow start è un meccanismo usato
per incrementare gradualmente la quantità di dati in transito; cerca
di mantenere i segmenti uniformemente spaziati e produce un
incremento esponenziale della velocità di trasferimento dati,
duplicandola ad ogni RTT.
All’inizio di una trasmissione all’interno di una rete di cui non si
conoscono bene le condizioni, TCP sonda la sua capacità
disponibile, in modo da impedire congestione con una quantità
inopportuna di dati. L’algoritmo di Slow Start è utilizzato per
questo scopo all’inizio di un trasferimento, o dopo che è stata
individuata una perdita dal timer di ritrasmissione.
In [APS99] il valore iniziale della cwnd, IW, deve essere minore o
uguale a 2*SMSS (sender MSS) in byte ma non superiore a più di
2 segmenti. Estensioni sperimentali di TCP permettono di
utilizzare una IW più larga:
IW = min (4*SMSS, max (2*SMSS, 4380 bytes))
Con questa estensione, un sender TCP può utilizzare anche 3 o 4
segmenti come valore iniziale, questo può essere particolarmente
vantaggioso per le sessioni-brevi TCP (short-lived), tipiche nel
traffico interattivo generato da applicazioni Web. Osservazioni
condotte sul traffico Web indicano che in media un trasferimento
di dati tramite Web impiega 17 segmenti. Uno slow start di un
segmento impiegherebbe 5 RTT per trasferire questi dati, mentre
usando un valore iniziale di 4 segmenti si riduce il tempo di
trasferimento a 3 RTT. Comunque 4 segmenti potrebbero essere
troppi utilizzando link ad alta velocità con buffer limitati, così un
approccio più robusto è quello di utilizzare un valore iniziale di
non più di 2 segmenti.
In generale il valore della IW è di un SMSS, basato sulla maximun
segment size del receiver (ottenuta durante il 3-way handshake), il
discovered path MTU (se usato), l’MTU dell’interfaccia del
sender, o in assenza di altre informazioni, è 536 byte.
Il sender spedisce un singolo segmento di dati, e poiché la finestra
viene in questo modo riempita, deve aspettare il corrispondente
ACK. Quando l’ACK è ricevuto, il sender incrementa la cwnd di
una quantità pari ad una SMSS. Questo gli permette di trasmettere
due segmenti; a questo punto la finestra di congestione è di nuovo
piena e il sender deve aspettare i corrispondenti ACK di questi
segmenti. Questo algoritmo continua ad incrementare il valore
della cwnd di un SMSS per ogni ACK ricevuto che riconosca
nuovi dati.
Se il receiver manda un ACK per ogni pacchetto, l’effetto di
questo algoritmo è che la velocità di spedizione dei dati del sender
raddoppia ad ogni RTT. Se il receiver supporta i delayed ACK, la
velocità trasmissiva incrementerà molto più lentamente, ma di un
minimo di un SMSS ogni RTT. Ovviamente questo non può
avvenire ad oltranza. Ad un certo punto o il valore della cwnd
eccederà la ssthresh (slow start threshold) o verrà raggiunta la
capacità della rete e in questi casi ci sarà perdita di pacchetti.
La variabile di stato ssthresh è usata per determinare quale tra gli
algoritmi di slow start e di congestion avoidance deve essere usato
per controllare la trasmissione dei dati.
Se il valore della cwnd supera quello della ssthresh, la modalità di
controllo di congestione di TCP passa da slow start a quello di
congestion avoidance. Inizialmente il valore della ssthresh è settato
alla maximum window size del receiver. Comunque nel momento
in cui viene rilevata congestione, la ssthresh è settata a metà della
finestra corrente, fornendo a TCP una memoria del punto dove è
cominciata la congestione in modo tale da poter essere prevenuta
nel futuro.
Quando il TCP sender rileva la perdita di un segmento attraverso il
timer di ritrasmissione, il valore della ssthresh deve essere settato a
non più del valore dato dalla seguente equazione:
ssthresh = max (FlighSize / 2, 2*SMSS)
Dove la FlighSize è la quantità di dati che sono ancora in viaggio
in rete, quindi spediti ma non ancora “riconosciuti”.
Congestion Avoidance
Comparato allo Slow Start, il meccanismo di Congestion
avoidance rappresenta lo stato di equilibrio raggiunto dal TCP.
Dove Slow Start usa un incremento esponenziale della sua velocità
di trasmissione, Congestion Avoidance utilizza una funzione di
crescita lineare del parametro cwnd. Quando il valore della cwnd è
più grande della ssthresh, il sender incrementa il valore della cwnd
di un valore uguale a
SMSS * SMSS / cwnd,
in risposta ad ogni ACK ricevuto non duplicato, assicurando che la
finestra di congestione si apra di un segmento ogni RTT. La
finestra di congestione continua ad aprirsi seguendo questa formula
finché non avviene una perdita. Se la perdita è isolata, un solo
pacchetto, l’ACK duplicato che ne risulta, permetterà al sender di
dimezzare la sua velocità attraverso il dimezzamento della cwnd e
continuare una crescita lineare della cwnd da questo nuovo punto.