Dipartimento di Elettronica e Informazione Politecnico di Milano Reti di Comunicazione e Internet Transmission Control Protocol Esercitazione Ipotesi semplificative per gli esercizi RTT (Round Trip Time) costante Segmenti tutti uguali e lunghi MSS (max segment size) L unità di tempo è RTT L unità di misura delle dimensioni delle finestre è MSS - -
Ipotesi semplificative per gli esercizi (cont( cont.) Tutti i segmenti disponibili fino a un massimo di SNDWND sono inviati dal trasmettitore simultaneamente e con tempo di trasmissione trascurabile Tutti i segmenti sono ricevuti e riscontrati simultaneamente dal ricevitore, tutti gli ACK vengono quindi ricevuti simultaneamente dal trasmettitore alla fine dell RTT La trasmissione avviene senza errori, tranne che nei periodi di network down che distruggono tutti i segmenti in transito; questi periodi sono intervalli aperti - - Finestre TCP RCVWND Receiver Window (finestra del ricevitore) buffer disponibile in ricezione viene comunicato dal ricevitore CWND Congestion Window (finestra di congestione) determinato dal trasmettitore tramite speciali algoritmi SNDWND Sender Window (finestra del trasmettitore) = min {RCVWND, CWND} numero massimo di segmenti che il trasmettitore può inviare prima di attendere i riscontri - -
Algoritmi Slow Start e Congestion Avoidance Slow Start (se CWND < SSTHRESH) Per ogni singolo segmento riscontrato CWND CWND + Non appena CWND = SSTHRESH uso Congestion Avoidance per tutti i riscontri non conteggiati Congestion Avoidance Per ogni gruppo di n riscontri CWND CWND + n / CWND - 5 - Il timer di ritrasmissione (RTO) Al primo timeout si parte con RTO = RTT (salvo altrimenti indicato) Ogni volta che arriva un riscontro prima che il timer scatti si pone nuovamente RTO RTT In caso il timer scatti si applica il backoff exponenziale e si pone RTO RTO Il backoff viene applicato al massimo volte consecutivamente - 6 -
Se scatta RTO Viene aggiornato RTO con il backoff esponenziale Si aggiornano le variabili SSTHRESH max {, flight_size / } CWND flight_size è il numero di segmenti trasmessi ma non riscontrati (attenzione, può essere diverso da SNDWND) Si comincia a ritrasmettere dal primo segmento non riscontrato - 7 - Obiettivo degli esercizi Disegnare l evoluzione della trasmissione dello stream fino a fine trasmissione e determinare i valori di SNDWND, CWND e SSTHRESH durante tutto il trasferimento La maschera su cui svolgere gli esercizi contiene anche la notazione per il numero di segmenti trasmessi con o senza ACK ad ogni RTT - -
Notazione SNDWND (send window) o CWND (congestion window) va indicata solo se diversa dalla SNDWND SSTHRESH numero: numero di segmenti trasmessi e riscontrati(intero!) numero: numero di segmenti trasmessi ma non riscontrati(intero!) (numero): valore CWND (intero o frazionario) - - Maschera 0 7 6 5 0 7 6 5 0 7 6 5 0 SNDWND CWND Num. Segm. Trasm. con ACK Num. Segm. Trasm. senza ACK () Valore CWND 5 0 5 0 5 0 5 0 5 50-0 -
MSS 0 7 6 5 Casi e notazioni particolari Attraversamento della soglia RTT RCVWND = Congestion Avoidance 6 Slow Start SSTHRESH = 6 SNDWND 6 Numero Segmenti Trasmessi con ACK Arrivano riscontri; i primi due riscontri portano la CWND: CWND = + = 6 che diventa =SSTHRESH e comincia la Congestion Avoidance; il terzo e quarto riscontro: CWND = 6 + /6 Al RTT successivo si mandano 6 riscontri, che portano la CWND a (6 + /6) + 6/6 = 7 + / - - Casi e notazioni particolari RCVWND < CWND 0 RCVWND a b c d SNDWND MSS 7 6 5 6 7 SSTHRESH Slow Start 7 7 7 7 a = Congestion Avoidance CWND b = + 7/, c = b + 7/ b = ( + 7/) + 7/ = + / = 0 + 5/ 0,6 d = c + 7/ c = (0 + 5/) + 7/0, RTT - -
Esercizio lunghezza file =,5 kbyte (500 byte) MSS = 500 byte RTT =,5 s timeout (RTO) base = RTT RTO raddoppia ogni volta fino a *RTO base SSTHRESH(t=0) = 000 byte RCVWND(t=0) = 5000 byte CWND(t=0) = 500 byte nota: kbyte = 000 byte - - Esercizio Modifiche a RCVWND RCVWND(t = s) = 5 kbyte RCVWND(t = s) = kbyte RCVWND(t = 5,5 s) = 5 kbyte Rete va fuori servizio t = ( s,5 s) t = (,5 s 6 s) t = (5 s 5,5 s) - -
Esercizio Indicare il tempo totale di trasferimento del file i valori di CWND e SNDWND in funzione di t il numero di segmenti trasmessi in funzione di t, specificando se vengono ricevuti oppure no il valore di SSTHRESH in funzione di t - 5 - Soluzione Esprimere i dati in funzione di RTT e MSS lunghezza file = 5 MSS SSTHRESH(t=0) = MSS RCVWIND(t=0) = 0 MSS RCVWIND(t= RTT) = 0 MSS RCVWIND(t= RTT) = MSS RCVWIND(t=5 RTT) = 0 MSS Fuori servizio rete: t = ( RTT RTT) t = ( RTT RTT) t = (6 RTT RTT) - 6 -
Notazione RCVWND SSTHRESH CWND SNDWND x segmenti spediti e poi riscontrati x segmenti spediti e poi non riscontrati (x) valore della CWND, se diverso dal numero di segmenti inviati - 7 - Inizio con Slow Start window size 0 Si comincia con slow start t = 0 t = cwnd =, sndwnd = invio segmento 5 ricevo un riscontro cwnd = cwnd + = invio due segmenti 0 0 5 0 t = ricevo riscontri cwnd = cwnd + = invio segmenti - -
Congestion Avoidance window size (MSS 0 5 () (+ 0 0 0 Al tempo t = la cwnd raggiunge la SSTHRESH e si passa a congestion avoidance t = ricevo riscontri cwnd = cwnd + /floor(cwnd) = invio segmenti 0 0 5 t = 5 ricevo riscontri cwnd = cwnd + / = 0 invio 0 segmenti - - Effetto della RCVWND 5(+/) (+/) (+/) (+/) () (+0/) 0 0 0 6 Al tempo t = 5 la cwnd raggiunge la rcvwnd che limita la sndwnd t = 6 ricevo 0 riscontri cwnd = cwnd + 0/0 = sndwnd = min{0,} = 0 invio 0 segmenti t = 7 ricevo 0 riscontri cwnd = cwnd + 0/ = + 0/ sndwnd = min{0,+0/} = 0 invio 0 segmenti - 0 -
Scadere di un timeout window size (MSS) 0 6 (+/) 5 5(+/) (+/) (+/) (+/) () (+0/) 0 0 0 0 5 0 0 5 0 5 - - t = invio 6 segmenti la rete è guasta e i pacchetti si perdono t = non ricevo riscontri, aspetto t = scatta il timeout (RTO = RTT) cwnd = SSTHRESH = = max {6/, } = invio segmento RTO = RTO = RTT Nuovo ciclo di SS/CA t = 5 ricevo un riscontro 5(+/) +/) /) ) 0 t = cwnd = RTO = RTT invio segmenti invio segmenti la rete è guasta e perdo i segmenti trasmessi 5 0 RT - -
Secondo guasto (+/7+/) (+/7+/) (+/7) (+/7) 0(+/7) (+/7) 7(+/7) t = non ricevo riscontri, aspetto t = 5 scatta il timeout (RTO = RTT) cwnd = SSTHRESH = = max {/, } = 7 invio segmento RTO = RTO = RTT t = 6 arriva un riscontro RTO = RTT cwnd = 0 5 0 RTT number - - Attraversamento della SSTHRESH (+/7) 0(+/7) (+/7) (+/7) 7(+/7) t = ricevo riscontri cwnd + > 7, supero la SSTHRESH, devo lavorare in due fasi: SS: cwnd = cwnd + = 7 CA: cwnd = cwnd + / floor(cwnd) = 7 + /7 invio 7 segmenti 5 0 TT number - -
Effetto della RCVWND (+/7+/)) (+/7+/) (+/7) 0(+/7) (+/7) ( (+ t = - ricevo 0 riscontri cwnd = cwnd + 0/0 = + /7 sndwnd = min {+/7,} = invio segmenti (+/7) t = ricevo riscontri 7(+/7) cwnd = cwnd + / = = + /7 + / t = 5 ricevo riscontri cwnd = + /7 + 6/ invio segmenti 5 0 5 RTT number - 5 - Fine del file (+/7+6/) (+/7+6/) t = 6 cwnd = + /7 + 6/ mancano segmenti da spedire (il file è quasi finito) invio segmenti (che perdo) 5 0 5-6 -
Guasti lunghi (+/7+6/) (+/7+6/) 5 0 5 t = scatta RTO RTO = RTO = RTT cwnd = SSTHRESH = = max { /, } = invio segmento (che perdo) t = scatta RTO RTO = RTO = RTT cwnd = SSTHRESH = = max { /, } = invio segmento - 7 - Fine del file () 0 5 50 t = ricevo riscontri sono in CA cwnd = cwnd + = invio segmenti t = 5 ricevo riscontri cwnd = cwnd + = mancano segmenti invio segmenti t = 6 ricevo riscontri fine della trasmissione - -
0 RWND 6 (+/) CWND window size (MSS) 5 0 5(+/) (+/) (+/) (+/) () (+0/) 0 0 0 0 (+/7+/)) (+/7+/) (+/7) 0(+/7) (+/7) (+/7) 7(+/7) SSTHRESH SWND (+/7+6/) (+/7+6/) 5 () 0 0 5 0 5 0 5 0 5 0 5 50 RTT number