Controllo della congestione Problema: troppe sorgenti inviano troppi dati troppo velocemente perchè la rete riesca a gestirli Effetti: perdita di pacchetti (overflow nei buffer dei router) e ritardi eccessivi (coda nei buffer dei router) Approccio end-to-end: nessuna segnalazione esplicita da parte della rete (TCP) Approccio assistito dalla rete: i router inviano feedback agli end system (SNA, DECbit, TCP/IP ECN, ATM) Natura della congestione Le code aiutano ad assorbire i picchi di traffico, quando la frequenza di input > frequenza di output Router Se frequenza input > frequenza output a lungo, la coda si riempie pacchetti persi e congestione La congestione è funzione del pattern di traffico. Può avvenire anche se i link hanno la stessa capacità = Router Pacchetti in coda 1
Effetti della congestione Ritardi e perdite aumentano rapidamente con il carico, il throughput diminuisce a causa delle perdite Allocazione di banda E importante allocare la capacità della rete in modo efficiente ed equo Efficiente: è usata la capacità massima, ma senza congestione Equa: ogni sender condivide equamente la banda Soluzione: I sender adattano la frequenza trasmissiva in base alla loro vista della rete Questa variazione è continua in quanto il carico cambia Questa variazione deve essere tale che l utilizzo della rete nel complesso sia efficiente ed equo 2
cwnd: TCP sender congestion window size Controllo della congestione in TCP Approccio end-to-end: la frequenza di trasmissione varia al variare della congestione percepita Come si rileva congestione? Come variare la frequenza di trasmissione e quale algoritmo per variarla? La perdita di pacchetti (timeout e 3 ACK) è sintomo di congestione. Il mittente varia la frequenza di trasmissione seguendo un algoritmo di controllo della congestione Additive Increase Multiplicative Decrease la dimensione della finestra cresce linearmente. fino ad un evento di perdita (quindi finestra a meta ) time 3
AIMD Additive Increase: ci si avvicina lentamente al valore della banda disponibile, aumentando linearmente la finestra di congestione, ogni RTT. Nota come fase di congestion avoidance Multiplicative Decrease: dopo un evento di perdita, la finestra di congestione viene dimezzata Finestra di congestione Spazio dei numeri di sequenza del sender cwnd last byte ACKed sent, notyet ACKed last byte sent il sender limita la trasmissione: LastByteSent- LastByteAcked < cwnd La finestra di congestione cwnd è dinamica, funzione della congestione percepita Frequenza trasmissiva: stima: trasmissione di cwnd bytes, attesa di ACK (RTT), quindi trasmissione di altri bytes rate ~ cwnd RTT bytes/sec 4
Algoritmo di controllo della congestione Obiettivo: trasmettere alla massima velocità possibile senza perdere pacchetti Approccio: incrementare cwnd finché non si verifica la perdita di un segmento. In seguito decrementare cwnd e ricominciare daccapo Fasi: slow start (partenza lenta), AIMD (incremento additivo, decremento moltiplicativo) e fast recovery (opzionale) Slow Start All inizio della connessione TCP, cwnd è pari a 1 MSS Per ogni segmento riscontrato prima di un evento di perdita, cwnd è aumentato di 1 MSS Crescita esponenziale della dimensione della finestra, fino a quando si verifica un evento di perdita o si raggiunge una soglia (ssthresh) 5
Congestion Avoidance Additive Increase Ci si avvicina lentamente al valore della banda disponibile, aumentando linearmente la finestra di congestione, ogni RTT Eventi di perdita Soglia = metà del valore della finestra di congestione appena prima dell evento di perdita Se timeout: finestra posta pari a 1 MSS, quindi crescita esponenziale (come in Slow start) Se triplice ACK: TCP Reno: finestra pari alla soglia, quindi Fast Recovery, se implementato, o Congestion Avoidance TCP Tahoe: finestra pari a 1 MSS, quindi crescita esponenziale (come in Slow start) 6
Andamento finestra di congestione TCP Reno: fast recovery (RFC5681) La ricezione di triplici ACK viene interpretata come sintomo di leggera congestione cwnd = soglia + 3 Per ogni ACK duplicato cwnd=cwnd+mss (crescita esponenziale) La conferma del pacchetto fa passare in Congestion Avoidance 7
TCP Reno - Fast Recovery Forouza, Mosharraf, Reti di Calcolatori, McGraw Hill Controllo congestione TCP L cwnd = 1 MSS ssthresh = 64 KB timeout ssthresh = cwnd/2 cwnd = 1 MSS dupackcount == 3 ssthresh= cwnd/2 cwnd = ssthresh + 3 duplicate ACK dupackcount++ slow start new ACK cwnd = cwnd + MSS (MSS/cwnd) new ACK cwnd = cwnd+mss transmit new segment(s), as allowed transmit new segment(s), as allowed cwnd > ssthresh L timeout ssthresh = cwnd/2 cwnd = 1 MSS timeout ssthresh = cwnd/2 cwnd = 1 fast recovery congestion avoidance New ACK cwnd = ssthresh duplicate ACK cwnd = cwnd + MSS transmit new segment(s), as allowed. duplicate ACK dupackcount++ dupackcount == 3 ssthresh= cwnd/2 cwnd = ssthresh + 3 8