Il numero progressivo delle intestazioni dei pacchetti TCP è compreso?


16

Mi chiedevo, dal momento che il numero di sequenza in un campo di intestazione TCP viene scelto casualmente durante l'handshake e viene gradualmente incrementato con lo scambio dei pacchetti, cosa succede dopo le trasmissioni 2 ^ 32 - initial_seq_no? Il numero progressivo va a capo e diventa 0 o viene riutilizzato il valore iniziale (o viene inizializzata una nuova connessione da dove si è interrotta la precedente)?

Risposte:


19

Si avvolge andando a 0. Secondo RFC 793 :

È essenziale ricordare che lo spazio numerico della sequenza attuale è limitato, anche se molto grande. Questo spazio è compreso tra 0 e 2 ** 32 - 1. Poiché lo spazio è finito, tutta l'aritmetica relativa ai numeri di sequenza deve essere eseguita modulo 2 ** 32. Questa aritmetica senza segno conserva la relazione dei numeri di sequenza mentre si ripetono da 2 ** 32 - 1 a 0. Ci sono alcune sottigliezze nell'aritmetica del modulo per computer, quindi è necessario prestare molta attenzione nella programmazione del confronto di tali valori. Il simbolo "= <" significa "minore o uguale" (modulo 2 ** 32).


3
Ogni numero è inferiore o uguale a qualsiasi altro numero, modulo 2 ** 32 ...
user20574

2
@ user20574 Ecco perché la dimensione della finestra TCP non può aumentare di oltre 1 GB e il confronto dei numeri di sequenza deve prendere la via più breve (ovvero la differenza deve essere nell'intervallo compreso tra -2 ^ 31 e 2 ^ 31).
Kasperd,

17

Il numero progressivo si sposta e diventa 0?

Sì. Tutti i dettagli sono disponibili nella specifica TCP RFC 793 - Transmission Control Protocol .


Numeri di sequenza

È essenziale ricordare che lo spazio numerico della sequenza attuale è limitato, anche se molto grande. Questo spazio varia da 0 a 2 32 - 1.

Dato che lo spazio è finito, tutta l'aritmetica relativa ai numeri di sequenza deve essere eseguita modulo 2 32 . Questa aritmetica senza segno preserva la relazione dei numeri di sequenza mentre si ripetono da 2 32 - 1 a 0.

Ci sono alcune sottigliezze nell'aritmetica del modulo per computer, quindi è necessario prestare molta attenzione nella programmazione del confronto di tali valori. Il simbolo "= <" significa "minore o uguale" (modulo 2 32 ).

Fonte RFC 793 - Protocollo di controllo della trasmissione


1
Non intendo sparare al messaggero, ma "minore o uguale (modulo N)"? Chiaramente l'autore di RFC ha perso le "sottigliezze nell'aritmetica dei moduli per computer".
Ben Voigt,

Nei casi in cui la finestra massima sarà inferiore a 2 ^ 31 e se xe ysono di tipo uint32_tè pratico definire x<=yper significare (uint32_t)(y-x) < 0x80000000.
supercat

@BenVoigt, probabilmente hanno dato per scontato ciò che è stato successivamente descritto in un RFC tools.ietf.org/html/rfc1982
Carsten S

@Carsten è un'aritmetica utile ma non è "arithmetic modulo N"
Ben Voigt,

1
@BenVoigt, sì, qualunque cosa. A proposito, sono ben consapevole che i gruppi Z / (n) non sono ordinati, ma sono anche in grado di interpretare le affermazioni nel contesto.
Carsten S,

7

Sì, si avvolge. Puoi leggerlo su Wikipedia o su RFC1323 , che mostra come proteggere dai numeri di sequenza spostati.

Vorrei citare:

I timestamp TCP sono utilizzati in un algoritmo noto come numeri di Protection Protection Wrapped Sequence o PAWS (vedere RFC 1323 per i dettagli). PAWS viene utilizzato quando la finestra di ricezione attraversa il limite avvolgente del numero di sequenza. Nel caso in cui un pacchetto fosse potenzialmente ritrasmesso, risponde alla domanda: "Questo numero di sequenza è nei primi 4 GB o nel secondo?" E il timestamp viene utilizzato per rompere il pareggio.

E:

PAWS utilizza la stessa opzione TCP Timestamps del meccanismo RTTM descritto in precedenza e presuppone che ogni segmento TCP ricevuto (inclusi segmenti dati e ACK) contenga un valore SEG.TS timestamp i cui valori sono monotoni non decrescenti nel tempo. L'idea di base è che un segmento può essere scartato come un vecchio duplicato se viene ricevuto con un timestamp SEG.TSval inferiore a qualche timestamp recentemente ricevuto su questa connessione.

Sia nel PAWS che nel meccanismo RTTM, i "timestamp" sono numeri interi senza segno a 32 bit in uno spazio modulare a 32 bit. Pertanto, "minore di" è definito come per i numeri di sequenza TCP e si applicano le stesse tecniche di implementazione. Se s e t sono valori di data / ora, s <t if 0 <(t - s) <2 ** 31, calcolato in aritmetica a 32 bit senza segno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.