Esercizi sul capitolo 3

Esercizio 1
...

Pasted image 20230929170630.png
La capacità del canale satellitare, ovvero la velocità di trasmissione dei pacchetti sul collegamento è:Il ritardo di propagazione è già stato calcolato tenendo conto della distanza e della mezzo trasmissivo ed è:

a) Qual è la minima finestra per Go-Back-n per avere la massima efficienza temporale quando vengono trasmessi frame di 2000 bit?
...

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:

Come mai proprio questa divisione?

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 , per far si che il pacchetto giunga a destinazione e altri per consentire all'ACK di fare il viaggio di ritorno. Se il mittente attendesse il pacchetto di ACK, resterebbe senza fare niente. Per cui per massimizzare l'efficienza temporale, il mittente dovrebbe continuare ad immettere pacchetti nella rete, per i successivi. Quindi la sua finestra deve essere , per far si che il mittente non resti inattivo mentre attende gli ACK deve avere una finestra di almeno 250 frame.

b) Se il meccanismo fosse stop-and-wait quanto sarebbe l'efficienza trasmissiva?
...

Abbiamo sempre che:
, calcolato prima

Calcoliamo quanto vale un :
il primo bit del pacchetto viene trasmesso al tempo ,
l'ultimo bit entra nel canale dopo , il pacchetto viaggia per fino alla destinazione. La consegna dice considerare trascurabile la dimensione degli ACK, che quindi vengono trasmessi all'istante dal destinatario (non c'è ritardo di trasmissione), tale ACK viaggia per altri , il che vuol dire che un .
Calcoliamo l'utilizzazione del canale trasmissivo, ovvero l'efficienza:
Ricordiamo che l'utilizzazione è la frazione di tempo in cui il mittente è stato effettivamente attivo nell'invio di bit sul canale.

Esercizio 2
...

Pasted image 20231001161814.png
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.

  • Numero di pacchetti corretti: 10
  • Numero totale di pacchetti trasmessi: 11 (9 corretti, 1 corrotto e il rinvio di questo corretto)
Prima domanda
...

Seconda domanda
...

Definiamo:

  • : come l'RTT tra i due capi della comunicazione (ritardo di propagazione di andata e ritorno)
  • : come il tempo di trasmissione di un pacchetto e di un ACK

Quando non si conosce il ritardo di propagazione lo si può indicare con

Quindi il conto precedente sarebbe venuto:
dove
dunque: il testo del problema diceva anche di considerare il tempo di propagazione pari a volte il tempo di trasmissione:

La soluzione al problema è corretta, ma...

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:

Esercizio 3
...

Pasted image 20231002101907.png
Devono essere trasferiti 100 segmenti di lunghezza massima (MSS = 1000 bit). Dobbiamo tenere conto anche di:

  • lunghezza header trascurabili
  • pacchetti apertura TCP di dimensione trascurabile (non c'è ritardo di trasmissione)
  • SSTRESH = 5 MSS

La capacità del collegamento è
Il ritardo di propagazione è dato ed è
Il ritardo di trasmissione per pacchetti di 1000 bit è Con il libro intende ritardo di propagazione andata e ritorno, il professore intende invece il ritardo di propagazione e di trasmissione andata e ritorno.
Io chiamerò il primo e il secondo.
di un pacchetto di 1000 bit è: .
è , dato che gli ACK sono trascurabili, il tempo di trasmissione di essi è pari a 0, dunque abbiamo

Ripasso fasi di TCP per il controllo della congestione
  • slow start: si parte trasmettendo un pacchetto, poi aumenta la finestra di 1 MSS per ogni ACK ricevuto. Quando si verifica una perdita si prende nota della dimensione della finestra quando si è verificata la perdita diviso per due (SSTRESH) e slow start ricomincia. Questa volta quando si giungerà al valore di SSTRESH, si entra nella fase di congestion avoidance;
  • congestion avoidance: in questa fase la finestra di congestione aumenta di un solo pacchetto alla volta, fino a che non si verifica una nuova congestione. In tal caso si aggiorna il valore SSTRESH. Questa fase termina se si verifica timeout, in tal caso si riparte da slow start, invece se si ricevono 3 ACK duplicati, viene preso nota del nuovo valore di SSTHRESH e si entra nella fase di fast recovery;
  • fast recovery: in questa fase il valore della finestra di congestione è incrementato di 1 MSS per ogni ACK duplicato ricevuto relativamente al segmento perso che ha causato l'entrata di TCP in fast recovery. Quando arriva l'ACK per il segmento perso, TCP entra nello stato di congestion avoidance dopo aver ridotto il valore della finestra. Se si verifica timeout si riparte da slow start.

Quello che succede nel nostro caso specifico è:
Pasted image 20231002155354.png

Non fraintendere

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) è: è il tempo di trasmissione sul canale.
La dimensione della finestra deve essere maggiore a e dato che la finestra non può assumere valori decimali (poiché i pacchetti sono considerati interamente): Quando la finestra assume dimensione 8, i pacchetti vengono inviati di continuo.
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:

  • del tempo di trasmissione del pacchetto
  • del tempo di propagazione del pacchetto
  • del tempo di trasmissione dell'ACK (trascurabile)
  • del tempo di propagazione dell'ACK
    dobbiamo anche ricordarci del fatto che i pacchetti sono mandati in gruppetti (dimensione finestra) di:
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
    Sono 6 gruppetti, per un totale di pacchetti.
    Il che vuol dire che i primi 25 pacchetti sono inviati in maniera discontinua e che ogni gruppo deve tenere conto: 1) del tempo per trasmettere il numero di pacchetti nella finestra corrente e 2) del tempo per la propagazione di essi (come se i pacchetti della finestra fossero spediti tutti insieme).

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: Gli altri 75 pacchetti, vengono trasmessi in modo continuo, quindi possiamo considerare come se venissero propagati tutti insieme. Per cui basta tenere conto del tempo per trasmettere i 75 pacchetti più il tempo per propagarsi nel canale a cui sommiamo il tempo anche per la propagazione del ACK relativo all'ultimo pacchetto inviato (dato che gli ACK sono trascurabili, il tempo di trasmissione per essi è 0, come abbiamo già detto).
Quindi a dobbiamo sommare (il tempo per trasmettere gli altri 74 pacchetti, ricordiamo che RTT totale tiene conto del tempo per trasferire un pacchetto, della propagazione di esso e dell'ACK di ritorno).
Per ottenere il tempo totale dobbiamo ricordarci di sommare anche il tempo per aprire la connessione, dato che anche i pacchetti di apertura sono di dimensione trascurabile, va considerato solo il tempo di propagazione per il pacchetto di apertura e l'ACK di risposta, il terzo pacchetto conterrà già il payload per la richiesta, tempo totale allora è:

Esercizio 4
...

Pasted image 20231113191003.png

Soluzione
...

Possiamo utilizzare i dati per costruire un sistema di equazioni in due incognite.
Abbiamo e ricordiamo che .
Dove è la dimensione del pacchetto e la velocità di trasmissione, al ritorno, il pacchetto trasmesso ha la stessa dimensione, per questo lo contiamo due volte.
rappresenta il ritardo di propagazione solo di andata, per questo va contato due volte.
Nel nostro caso, in particolare abbiamo: è al dimensione del pacchetto .
è la velocità di trasmissione nel primo link.
è il ritardo di propagazione nel primo link.
Mentre le rispettive lettere con il numero al pedice si riferiscono ai medesimi dati, ma del secondo link.
Per il secondo pacchetto abbiamo: Dove si riferisce al dimensione del secondo pacchetto .
Conosciamo e , conosciamo . Possiamo impostare il sistema:


Risolto il sistema di equazioni sopra, si otterrà che:

Esercizio 5
...

Pasted image 20231114092031.png

Soluzione
...


La finestra del ricevente ha dimensione
Se dividiamo per la dimensione di un pacchetto sappiamo quanti MSS è grande la finestra:

L'ultimo valore di che può contenere
MSS.

Mentre la finestra di congestione ha dimensione all'inizio

I dati da spedire sono , dividendo per la dimensione di 1 MSS otteniamo il numero di pacchetti in cui viene diviso il dato da spedire:

Un , significa che la linea temporale avanza ogni mezzo secondo.

Istante# pacchetti speditiNote
01
0,52
14
1,58
216Qui è 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,517
3,018X si verifica l'evento di perdita segnalato dal testo dell'esercizio, tutti i pacchetti nella finestra vanno persi. MSS
3,51Ricomincia la fase di slow start
4,02
4,54Il ricevente segnale che la sua finestra adesso ha dimensione MSS
5,04
5,54
6,04
7,04
7,54
8,04La somma dei pacchetti inviati è (esclusi i pacchetti persi a 3,0) tutto il dato è stato inviato

Per inviare il dato sono necessari: (viene compreso l'RTT in cui vengono persi i pacchetti).
Considerando che ogni

Allego il grafico della soluzione del professore:
Pasted image 20231114113129.png

Esercizio 6
...

Pasted image 20231114113258.png

Soluzione
...

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: va sommato al risultato, ottenendo:
Questo risultato va sommato alla terza word: va sommato al risultato, ottenendo:
Adesso va fatto il complemento a 1, ottenendo:

Esercizio 7
...

Pasted image 20231201105214.png
Per la soluzione di questo esercizio ci serviremo della seguente immagine:
Pasted image 20231201123259.png
All'istante iniziale (prima linea rossa) , arrivano dei dati da trasmettere al destinatario.
Tale blocco di dati è di byte.
Dato che i dati vengono suddivisi in tre pacchetti diversi.
Il numero di sequenza del mittente è (il che vuol dire che prima di ) ha spedito un segmento di byte. Il Destinatario di fatto ha un ACK number pari a che vuol dire che ha ricevuto con successo quei byte.
Subito dopo l'istante , vengono spediti i segmenti preparati dal blocco di dati ricevuto nel mittente.
Il primo pacchetto arriva a destinazione e il destinatario emette ACK, avendo ricevuto un pacchetto di byte, il suo ACK number arriva a e il destinatario emette ACK 2500.
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 , dopo (dove , dove ), arriva un altro blocco di dati.
Questa volta tale blocco è di byte, quindi l'ultimo blocco sarà di byte (come si vede in figura).
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:

  • dalla fine della trasmissione di un segmento;
  • al momento in cui si riceve il terzo ACK duplicato.

Come facciamo a conoscere questa quantità?
Sappiamo quanto tempo passa fra e .
In particolare vogliamo sapere quanto tempo intercorre tra la fine della trasmissione del secondo pacchetto e .
Per calcolare questo valore ci basta sottrarre a il tempo necessario per trasmettere i primi due pacchetti: Adesso sappiamo quanto tempo trascorre tra la fine della trasmissione del secondo pacchetto e .
A questo punto siamo interessati a sapere quanto tempo occorre (da ) per ricevere il terzo ACK duplicato.
Il terzo ACK duplicato arriva dopo che è stato trasmesso il secondo pacchetto del secondo blocco di dati. Quindi sicuramente sono necessari , a cui dobbiamo sommare il tempo che impiega il destinatario a trasmettere l'ultimo ACK.
Ottenendo:
Ricordiamo di sommare anche il tempo affinché il secondo pacchetto è l'ACK si propaghino:

Perché consideriamo solo il tempo per la trasmissione dell'ultimo ACK?

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.

Perché consideriamo solo la propagazione del secondo segmento del secondo blocco?

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.

Esercizio 8
...

Esercizio 9
...

Pasted image 20231204114650.png

TCP Tahoe
...

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.

CWNDRTTNote
11
22
43
84
165inizia congestion avoidance
176
187
198
209
2110
2211
2312
2413in questo RTT un pacchetto si perde e si ricevono solo ACK duplicati
2414la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa
115scade il timeout, SSTHRESH = 24/2 = 12, ricomincia slow start
216
417
818
1219
1320
1421
1522
1623rete va fuori servizio
1624
125timeout, SSTHRESH = 16/2 = 8, riparte slow start
226
427
828
929
1030
......
2040
TCP Reno
...

TCP Reno entra in fast recovery quando riceve ACK duplicati

CWNDRTTNote
11
22
43
84
165inizia congestion avoidance
176
187
198
209
2110
2211
2312
2413in questo RTT un pacchetto si perde e si ricevono solo ACK duplicati, si entra in fast recovery, CWND = 24/2 = 12
1214la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa
1215la rete si guasta e nessun altro segmento viene trasmesso CWND non incrementa
1316
1417
1518
1619
1720
1821
1922
2023rete va fuori servizio
2024
125timeout, SSTHRESH = 20/2 = 10, riparte slow start
226
427
828
1029
1130
......
2140

Esercizio 10
...

Pasted image 20231204124104.png

  1. Il FLAG attivo nel secondo segmento inviato da B sarà il FLAG di SYN e di ACK, mentre il numero di sequenza è , mentre il numero di ACK sarà
  2. Nel terzo segmento sarà attivo il FLAG di ACK, il numero di sequenza sarà mentre il numero di ACK sarà .

Esercizio 11
...

Pasted image 20231207100754.png
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.

Domanda 1: in qual intervalli TCP è in slow start?
...

[1,3], [28,30], [\32,33], 35

Domanda 2: in qual intervalli TCP è in congestion avoidance?
...

[4,13], [15,21], [23,27], 34, [36,40]

Domanda 3: in quali intervalli TCP è in fast recovery?
...

14, 22

Domanda 4: quando i pacchetti si perdono per timeout?
...

27, 31, 34

Domanda 5: quando i pacchetti si perdono per triplice ACK duplicato?
...

13, 21

Domanda 6: quando cambia ssthresh?
...

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 e . In caso di timeout e .
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.

Fine esercizi forniti a lezione
...

Esercizi con ordine casuale dal libro di testo (edizione 7)
...

P37
...

Pasted image 20231210204029.png
Pasted image 20231210235420.png

  • a) Per GBN: vengono spediti i segmenti 0, 1, 2, 3, 4. Il secondo si perde, il destinatario riceve i segmenti 2, 3, 4 fuori sequenza e li rifiuta, inviando per ciascuno ACK0 (anche per il primo). Allo scadere del timeout per il segmento 1, il mittente ritrasmette i segmenti 1, 2, 3, 4 e il destinatario invia ACK per ognuno.
    Per SR: vengono spediti i segmenti: 0, 1, 2, 3, 4. Il secondo si perde, il destinatario riceve i segmenti 2, 3, 4 fuori sequenza e li salva nel buffer, per ognuno invia ACK selettivo. Ad un certo punto il timeout per il segmento 1 scade, SR ritrasmette tale segmento e il destinatario invia ACK.
    Per TCP: vengono spediti i segmenti 0, 1, 2, 3, 4. Il secondo si perde. Il destinatario invia i ACK1, per il segmento 0, per il segmento 2, 3 e 4. Viene rispedito il segmento 1 prima dello scadere del timeout (fast recovery). E il destinatario invia ACK5.
  • b) TCP perché rispedisce il segmento prima del timeout.

P46
...

Pasted image 20231213150212.png

  • a) L'RTT è di 150 ms. Quando il mittente trasmette un pacchetto, sono necessari 300 ms per far si che il pacchetto torni indietro. Anzitutto calcoliamo il tempo per trasmettere un singolo pacchetto di 1500 byte Durante la propagazione del pacchetto possono essere trasmessi segmenti. Quindi supponiamo che venga trasmesso un pacchetto, e nel corso della propagazione ne vengono trasmessi altri 125 (in totale 126), proprio alla fine del 126-esimo pacchetto arriverà il primo ACK e a seguito tutti gli altri, la finestra smetterò di crescere, quindi la dimensione massima è proprio 126.
  • b) La connessione si trova nello stato di congestion avoidance, il che vuol dire che la dimensione corrente della finestra ha appena raggiunto il valore di threshold e che il valore precedente della finestra era la metà di quella attuale. Se la finestra è , prima era , l'ampiezza media della finestra è . Dove è quello che abbiamo calcolato prima , ovvero: . Il throughput medio in relazione alla dimensione della finestra è
  • c) Dopo la perdita del pacchetto la finestra riparte si dimezza e si entra in fast recovery. La finestra era , saranno necessari 61 RTT per giungere di nuovo a 126.