La capacità del canale satellitare, ovvero la velocità di trasmissione dei pacchetti sul collegamento è:
La massima efficienza temporale si ottiene quando la finestra di trasmissione è abbastanza grande da garantire che il mittente non rimanga in attivo mentre attende gli ACK dal destinatario.
per avere la massima efficienza temporale dobbiamo avere:
Il motivo è che il mittente inoltra un frame ogni
Supponiamo che il mittente inoltri un pacchetto sul canale, prima di ricevere la risposta di ACK, passeranno
Abbiamo sempre che:
Calcoliamo quanto vale un
il primo bit del pacchetto viene trasmesso al tempo
l'ultimo bit entra nel canale dopo
Calcoliamo l'utilizzazione del canale trasmissivo, ovvero l'efficienza:
Un protocollo stop-and-wait quando invia un pacchetto attende la ricezione di ACK dal destinatario.
Anche se si verificasse la trasmissione di pacchetti corrotti, A lo saprebbe prima di inviare il pacchetto successivo, per cui invierebbe nuovamente il pacchetto che è risultato corrotto.
Quindi ogni 10 pacchetti inviati da A, 1 risulterebbe corrotto. A a questo punto ritrasmette il pacchetto corrotto.
Definiamo:
Quindi il conto precedente sarebbe venuto:
dunque:
Il professore, nella soluzione non tiene conto del pacchetto che è stato re-inviato. In sede d'esame questo non dovrebbe essere un problema, anzi sembra più corretto il ragionamento appena fatto. Tuttavia i risultati usati del professore non tengono contro del re-invio del pacchetto corrotto, ecco i risultati:
Devono essere trasferiti 100 segmenti di lunghezza massima (MSS = 1000 bit). Dobbiamo tenere conto anche di:
La capacità del collegamento è
Il ritardo di propagazione è dato ed è
Il ritardo di trasmissione per pacchetti di 1000 bit è
Io chiamerò
Quello che succede nel nostro caso specifico è:
Slow start, aumenta la dimensione della finestra di congestione di 1 MSS per ogni ACK ricevuto. Il risultato è che la dimensione della finestra via via raddoppia. Tuttavia, quando abbiamo una finestra di 4 pacchetti, la finestra viene incrementato di 1 MSS per ogni ACK ricevuto, il che vuol dire che mentre viene ingrandita la finestra, TCP si accorge che si è raggiunto il valore di SSTHRESH e dunque entrerà nella fase di congestion avoidance.
Ora, quando il mittente invia pacchetti entro una certa dimensione della finestra di congestione, tali pacchetti vengono inviati in modo discontinuo, per esempio, se il mittente ha una finestra di 2 pacchetti, e ne ha inviati 2, deve attendere ACK per quei 4 pacchetti per poter ingrandire la finestra e per poter inviare altri pacchetti.
Quando viene superata una certa dimensione della finestra di congestione, allora i pacchetti vengono inviati in modo continuo. Cosa cambia? Il mittente immette di continuo pacchetti nella rete ed essi si propagano di continuo, come se fossero stati spediti tutti insieme.
Dunque per prima cosa dobbiamo trovare questo limite che (come abbiamo calcolato nell'esercizio 1 di questa raccolta di esercizi) è:
La dimensione della finestra deve essere maggiore a
Per cui fino ad una dimensione della finestra di 8 pacchetti, i pacchetti vengono inviati in maniera discontinua, per cui dobbiamo tenere conto per essi:
Per il primo gruppo con 1 pacchetto abbiamo già il tempo che è
Per il secondo gruppo con 2 pacchetti dobbiamo solo aggiungere 1 ms per la trasmissione del secondo pacchetto:
Per il terzo gruppo con 4 pacchetti dobbiamo aggiungere 3 ms per la trasmissione degli altri tre pacchetti:
Per il quarto gruppo con 5 pacchetti dobbiamo aggiungere 4 ms:
Per il quinto con 6 pacchetti dobbiamo aggiungere 5 ms:
Per il sesto con 7 pacchetti dobbiamo aggiungere 6 ms:
Adesso sommiamo i tempi per trasferire queste finestre:
Quindi a
Possiamo utilizzare i dati per costruire un sistema di equazioni in due incognite.
Abbiamo
Dove
Nel nostro caso, in particolare abbiamo:
Mentre le rispettive lettere con il numero
Per il secondo pacchetto
Conosciamo
Risolto il sistema di equazioni sopra, si otterrà che:
La finestra del ricevente ha dimensione
Se dividiamo per la dimensione di un pacchetto sappiamo quanti MSS è grande la finestra:
L'ultimo valore di
Mentre la finestra di congestione ha dimensione
I dati da spedire sono
Un
Istante | # pacchetti spediti | Note |
---|---|---|
0 | 1 | |
0,5 | 2 | |
1 | 4 | |
1,5 | 8 | |
2 | 16 | Qui è stato raggiunto il valore di SSTHRESH, da questo momento in poi la fase di slow start termina e inizia congestion avoidance (viene incrementata CWND di 1 pacchetto alla volta) |
2,5 | 17 | |
3,0 | 18 | X si verifica l'evento di perdita segnalato dal testo dell'esercizio, tutti i pacchetti nella finestra vanno persi. |
3,5 | 1 | Ricomincia la fase di slow start |
4,0 | 2 | |
4,5 | 4 | Il ricevente segnale che la sua finestra adesso ha dimensione |
5,0 | 4 | |
5,5 | 4 | |
6,0 | 4 | |
7,0 | 4 | |
7,5 | 4 | |
8,0 | 4 | La somma dei pacchetti inviati è |
Per inviare il dato sono necessari:
Considerando che ogni
Allego il grafico della soluzione del professore:
Prima di tutto occorre dividere la stringa di bit in word da 16 bit:
Occorre fare la somma prima tra le prime due (eventuali riporti finali vanno nuovamente sommati) e poi fare la somma tra il risultato della somma tra le prime due e la terza (eventuali riporti vanno nuovamente sommati).
Somma tra le prime due:
Questo risultato va sommato alla terza word:
Adesso va fatto il complemento a 1, ottenendo:
Per la soluzione di questo esercizio ci serviremo della seguente immagine:
All'istante iniziale (prima linea rossa)
Tale blocco di dati è di
Dato che
Il numero di sequenza del mittente è
Subito dopo l'istante
Il primo pacchetto arriva a destinazione e il destinatario emette ACK, avendo ricevuto un pacchetto di
Il secondo pacchetto si perde.
Il terzo pacchetto arriva a destinazione, il destinatario conserva nel buffer questo pacchetto e informa il mittente con un ACK 2500, che attenda ancora il pacchetto con numero di sequenza 2500. Questo risulta essere per il mittente il primo ACK duplicato.
Ricordiamo che fast-recovery si verifica dopo aver ricevuto il terzo ACK duplicato.
Dal tempo
Questa volta tale blocco è di
Il mittene continua a trasmettere pacchetti, quindi invia il primo segmento del secondo blocco, che viene ricevuto con successo (il destinatario emette il secondo ACK duplicato) e il secondo segmento, che giunge con successo al destinatario (che emette il terzo ACK duplicato).
Ora, in TCP quando si verifica timeout, il mittente passa alla fase di slow start. Per evitare questo, in tale contesto, vogliamo che il timeout sia grande abbastanza affinché sia possibile ricevere il terzo ACK duplicato e consentire ritrasmissione rapida. Per fare ciò dobbiamo ricordare che il timeout per un pacchetto comincia a scorrere dalla fine della sua trasmissione.
Quindi vogliamo che il timeout sia grande quanto il riquadro rappresentato dalle linee verdi, i cui intervalli vanno:
Come facciamo a conoscere questa quantità?
Sappiamo quanto tempo passa fra
In particolare vogliamo sapere quanto tempo intercorre tra la fine della trasmissione del secondo pacchetto e
Per calcolare questo valore ci basta sottrarre a
A questo punto siamo interessati a sapere quanto tempo occorre (da
Il terzo ACK duplicato arriva dopo che è stato trasmesso il secondo pacchetto del secondo blocco di dati. Quindi sicuramente sono necessari
Perché il secondo ACK viene trasmesso dopo l'invio del secondo segmento, quindi il tempo per trasmettere il primo ACK è già incluso. La trasmissione e propagazione dell'ACK relativo al primo segmento si verifica nel mentre il secondo segmento viene trasmesso e propagato.
Per lo stesso motivo sopra, la propagazione del primo segmento avviene in qualche momento nel corso della trasmissione del secondo segmento, quindi non serve contarla un'altra volta.
In TCP Tahoe ogni perdita (triplice ACK duplicato e timeout) viene gestita tramite dimezzamento della dimensione della finestra di congestione e ripartenza con slow start.
CWND | RTT | Note |
---|---|---|
1 | 1 | |
2 | 2 | |
4 | 3 | |
8 | 4 | |
16 | 5 | inizia congestion avoidance |
17 | 6 | |
18 | 7 | |
19 | 8 | |
20 | 9 | |
21 | 10 | |
22 | 11 | |
23 | 12 | |
24 | 13 | in questo RTT un pacchetto si perde e si ricevono solo ACK duplicati |
24 | 14 | la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa |
1 | 15 | scade il timeout, SSTHRESH = 24/2 = 12, ricomincia slow start |
2 | 16 | |
4 | 17 | |
8 | 18 | |
12 | 19 | |
13 | 20 | |
14 | 21 | |
15 | 22 | |
16 | 23 | rete va fuori servizio |
16 | 24 | |
1 | 25 | timeout, SSTHRESH = 16/2 = 8, riparte slow start |
2 | 26 | |
4 | 27 | |
8 | 28 | |
9 | 29 | |
10 | 30 | |
... | ... | |
20 | 40 |
TCP Reno entra in fast recovery quando riceve ACK duplicati
CWND | RTT | Note |
---|---|---|
1 | 1 | |
2 | 2 | |
4 | 3 | |
8 | 4 | |
16 | 5 | inizia congestion avoidance |
17 | 6 | |
18 | 7 | |
19 | 8 | |
20 | 9 | |
21 | 10 | |
22 | 11 | |
23 | 12 | |
24 | 13 | in questo RTT un pacchetto si perde e si ricevono solo ACK duplicati, si entra in fast recovery, CWND = 24/2 = 12 |
12 | 14 | la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa |
12 | 15 | la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa |
13 | 16 | |
14 | 17 | |
15 | 18 | |
16 | 19 | |
17 | 20 | |
18 | 21 | |
19 | 22 | |
20 | 23 | rete va fuori servizio |
20 | 24 | |
1 | 25 | timeout, SSTHRESH = 20/2 = 10, riparte slow start |
2 | 26 | |
4 | 27 | |
8 | 28 | |
10 | 29 | |
11 | 30 | |
... | ... | |
21 | 40 |
Considerando l'evoluzione della finestra di congestione nell'immagine sopra, si risponda alle seguenti domande (il valore iniziale di cwnd = 1, ssthresh = 8).
Consideriamo come se ogni intervallo va da 0 a 0,99, da 1 a 1,99, ecc. Per esempio se la perdita si verifica al 4, da 1 a 3,99 doveva esserci la fase di slow start o di congestion avoidance, quindi la indichiamo con [1,3], dove è anche incluso 3,99.
[1,3], [28,30], [\32,33], 35
[4,13], [15,21], [23,27], 34, [36,40]
14, 22
27, 31, 34
13, 21
ssthresh cambia quando si verifica una perdita per triplice ACK duplicato o per timeout, in tal caso viene impostata alla metà della dimensione di cwnd. In caso di triplica ACK duplicato
Nell'intervallo 13 si verifica perdita per triplice ACK, ma cwnd = 17, quindi ssthresh sempre 8.
Al 21 si verifica perdita per triplice ACK, ssthresh = 9.
Al 27 si verifica perdita per timeout, cwnd = 17, ssthresh = 8.
Al 31, timeout, cwnd = 8, ssthresh = 4.
Al 34, timeout, cwnd = 4, ssthresh = 2.