Czy numer sekwencyjny nagłówków pakietów TCP się zawija?

16

Zastanawiałem się, ponieważ numer sekwencyjny w polu nagłówka TCP jest losowo wybierany podczas uzgadniania i jest stopniowo zwiększany w miarę wymiany pakietów, co dzieje się po 2 ^ 32 - initial_seq_no transmisjach? Czy numer sekwencyjny zawija się i staje się 0, czy też wartość początkowa jest ponownie wykorzystywana (czy też inicjowane jest nowe połączenie od miejsca, w którym poprzednie zostało zatrzymane)?

Sebi
źródło

Odpowiedzi:

19

Zawija się do zera. Według RFC 793 :

Należy pamiętać, że rzeczywista przestrzeń numerów sekwencji jest skończona, choć bardzo duża. Zakres ten wynosi od 0 do 2 ** 32 - 1. Ponieważ odstęp jest skończony, cała arytmetyka zajmująca się numerami sekwencji musi być wykonywana modulo 2 ** 32. Ta nieoznaczona arytmetyka zachowuje związek między numerami sekwencji, gdy cyklicznie znów zaczynają się od 2 ** 32-1 do 0. Istnieją pewne subtelności arytmetyki modulowej komputera, dlatego należy bardzo ostrożnie programować porównanie takich wartości. Symbol „= <” oznacza „mniejszy lub równy” (moduł 2 ** 32).

jcbermu
źródło
3
Każda liczba jest mniejsza lub równa każdej innej liczbie,
moduł
2
@ user20574 Dlatego rozmiar okna TCP nie może wzrosnąć powyżej 1 GB, a porównanie numerów sekwencyjnych musi przebiegać jak najkrócej (tzn. różnica musi mieścić się w zakresie od -2 ^ 31 do 2 ^ 31).
kasperd
17

Czy numer kolejny zawija się i staje 0?

Tak. Wszystkie szczegóły można znaleźć w specyfikacji TCP RFC 793 - Protokół kontroli transmisji .


Numery sekwencji

Należy pamiętać, że rzeczywista przestrzeń numerów sekwencji jest skończona, choć bardzo duża. Zakres ten wynosi od 0 do 2 32 - 1.

Ponieważ przestrzeń jest skończona, cała arytmetyka odnosząca się do numerów sekwencji musi być wykonywana modulo 2 32 . Ta niepodpisana arytmetyka zachowuje związek między numerami sekwencji, gdy cyklicznie ponownie zaczynają się od 2 32-1 do 0.

Istnieją pewne subtelności arytmetyki modulowej komputera, dlatego należy bardzo ostrożnie programować porównanie takich wartości. Symbol „= <” oznacza „mniejszy lub równy” (moduł 2 32 ).

Źródło RFC 793 - Protokół kontroli transmisji

DavidPostill
źródło
1
Nie mam na myśli strzelania do posłańca, ale „mniejszy lub równy (modulo N)”? Najwyraźniej autor RFC przeoczył „subtelności arytmetyki modułu komputerowego”.
Ben Voigt
W przypadkach, gdy maksymalne okno będzie mniejsze niż 2 ^ 31, a jeśli xi ysą typem, uint32_twarto zdefiniować, x<=yaby to oznaczało (uint32_t)(y-x) < 0x80000000.
supercat
@BenVoigt, prawdopodobnie przyjęli za pewnik to, co później opisano w RFC tools.ietf.org/html/rfc1982
Carsten S
@Carsten to użyteczna arytmetyka, ale nie jest to „arytmetyczny moduł N”
Ben Voigt
1
@BenVoigt, tak, cokolwiek. Przy okazji, jestem w pełni świadomy, że grupy Z / (n) nie są uporządkowane, ale jestem również w stanie interpretować wypowiedzi w kontekście.
Carsten S
7

Tak, to się zawija. Możesz go przeczytać na Wikipedii lub na RFC1323 , który pokazuje, jak zabezpieczyć się przed zapakowanymi numerami sekwencji.

Pozwól mi zacytować:

Znaczniki czasu TCP są używane w algorytmie znanym jako Ochrona przed zawiniętymi numerami sekwencji lub PAWS (szczegóły w RFC 1323). PAWS jest używany, gdy okno odbioru przekracza granicę zawijania numeru sekwencji. W przypadku, gdy pakiet został potencjalnie ponownie przesłany, odpowiada on na pytanie: „Czy ten numer sekwencyjny jest w pierwszych 4 GB, czy w drugim?” A znacznik czasu służy do zerwania remisu.

I:

PAWS używa tej samej opcji znaczników czasu TCP, jak opisany wcześniej mechanizm RTTM, i zakłada, że ​​każdy odebrany segment TCP (w tym segmenty danych i ACK) zawiera znacznik czasu SEG.TSval, którego wartości są monotoniczne, nie malejące w czasie. Podstawową ideą jest to, że segment można odrzucić jako stary duplikat, jeśli zostanie odebrany ze znacznikiem czasu SEG.TSval mniejszym niż jakiś znacznik czasu ostatnio otrzymany na tym połączeniu.

Zarówno w mechanizmie PAWS, jak i RTTM „znaczniki czasu” są 32-bitowymi liczbami całkowitymi bez znaku w modułowej przestrzeni 32-bitowej. Zatem „mniej niż” jest zdefiniowane tak samo, jak w przypadku numerów sekwencyjnych TCP i obowiązują te same techniki implementacji. Jeśli s i t są wartościami znaczników czasu, s <t jeśli 0 <(t - s) <2 ** 31, obliczone w 32-bitowej arytmetyce bez znaku.

MariusMatutiae
źródło