Confuso con il riordino dei pacchetti

Aug 15 2020

Stavo leggendo un libro di testo che dice sul protocollo TCP "Selective Repeat":

Abbiamo ipotizzato che i pacchetti non possano essere riordinati all'interno del canale tra il mittente e il destinatario. Questo è generalmente un presupposto ragionevole quando il mittente e il destinatario sono collegati da un unico cavo fisico. Tuttavia, quando il "canale" che collega i due è una rete, può verificarsi il riordino dei pacchetti. L'approccio adottato in pratica è quello di garantire che un numero di sequenza non venga riutilizzato fino a quando il mittente non è "sicuro" che i pacchetti precedentemente inviati con numero di sequenza x non siano più nella rete. Ciò viene fatto supponendo che un pacchetto non possa "vivere" nella rete per un periodo di tempo superiore a un determinato periodo di tempo massimo.

Sono confuso e di seguito sono le mie due domande.

D1-Che cosa fa "il canale può essere considerato essenzialmente come un buffer di pacchetti e l'emissione spontanea di questi pacchetti in qualsiasi momento futuro". significare? Perché dobbiamo bufferizzare un vecchio pacchetto? Non è meglio che il ricevitore lo ignori?

Q2-Diciamo che la dimensione della finestra è 2 e il numero di sequenza disponibile è 0,1,2,3. Il mittente invia prima il pacchetto 0, il pacchetto 1, mentre il pacchetto 0 viene colpito in qualche modo e impiega molto tempo per arrivare, quindi si verifica il timeout, il mittente deve inviare di nuovo il pacchetto 0, ma questa volta il pacchetto 0 (nuovo) arriva in tempo. Quindi il mittente invia il pacchetto 2, il pacchetto 3, tutti ricevuti dal destinatario. E poi il mittente sta per inviare il pacchetto 0 (nuovo) e il pacchetto 1 (nuovo), ma il vecchio pacchetto 0 arriva ora al destinatario, quindi la ricezione non poteva sapere che questo pacchetto è il vecchio pacchetto o il nuovo pacchetto. Quindi, come può risolvere questo problema "supponendo che un pacchetto non possa" vivere "nella rete per un periodo di tempo massimo stabilito"? Significa che l'intestazione del pacchetto contiene l'ora in cui è stato inviato?

Risposte

2 Zac67 Aug 16 2020 at 07:31

Che cosa significa "il canale può essere pensato essenzialmente come un buffer di pacchetti e l'emissione spontanea di questi pacchetti in qualsiasi momento futuro". significare? perché abbiamo bisogno di bufferizzare un vecchio pacchetto? non è meglio che il ricevitore lo ignori?

Questa è la natura dell'accodamento e del buffering che è una parte essenziale del cambio di pacchetto: i pacchetti ricevuti vengono accodati / memorizzati nel buffer in ingresso ed eliminati dalla coda una volta inoltrati. Il buffering è necessario poiché altrimenti il ​​collegamento in uscita dovrebbe sempre essere libero ogni volta che viene ricevuto un pacchetto - questo non è possibile per le reti a commutazione di pacchetto, solo per quelle a commutazione di circuito.

Supponiamo che la dimensione della finestra sia 2 e il numero di sequenza disponibile sia 0,1,2,3.

La finestra non conta i pacchetti / datagrammi ma i byte . Inoltre, il numero di sequenza si ripete solo quando il suo campo a 32 bit va in overflow, ciò accade solo dopo 4 GiB di dati. Tuttavia, quel limite significa che non ci possono mai essere più di 4 Gib di dati "in volo" per evitare ambiguità. Poiché la finestra più grande possibile è (vicino a) 1 GiB, non è un problema.

Nota che con ACK semplici e cumulativi, il destinatario non può ACK selettivamente segmenti successivi quando manca ancora un segmento precedente. Un ACK significa che tutti i dati precedenti sono stati ricevuti.

Ad esempio, con una dimensione del segmento di 1.000 e una dimensione della finestra di 10.000, il mittente invia i datagrammi D00-D09 (sequenza 0-9.999). D00 e D02-D09 vengono ricevuti, ma D01 viene perso. Il destinatario continua ad ACK 1.000 (la successiva sequenza di dati prevista) che fa scattare il mittente a spostare D0 fuori dalla finestra, a portarlo a 1.000-10.999 e inviare D10.

Nel frattempo il ricevitore ha deciso che c'è un problema, quindi ACK di nuovo 1.000 per segnalare proprio questo. Il mittente riceve il doppio ACK e rinvia D01 (modalità riluttante) o tutti i dati a partire da D01 (modalità aggressiva). Il destinatario ha già D10 (10.000-10.999), quindi ACKs 11.000 che a sua volta sposta la finestra del mittente su 11.000-20.999 (e interrompe le ritrasmissioni ancora in sospeso, per la modalità aggressiva).

(Ho in qualche modo semplificato il processo, in realtà c'è più sovrapposizione parallela e un ritardo tra invio e ricezione, ovviamente.)

EDIT: Come Jeff ha correttamente sottolineato (grazie!), Il supporto per i riconoscimenti selettivi (SACK) è quasi scontato oggi. Utilizzando questa opzione, il destinatario potrebbe anche SACCHEGGIARE 2.000-9.999 (da D02-D09) immediatamente, in modo che il mittente non inizierà a ritrasmetterli. Potrebbe anche iniziare a trasmettere 11.000-20.999 prima.