16

Мне было интересно, так как порядковый номер в поле заголовка TCP случайно выбирается во время рукопожатия и постепенно увеличивается по мере обмена пакетами, что происходит после 2 ^ 32 - initial_seq_no передач? Меняется ли порядковый номер и становится ли он равным 0, или же первоначальное значение используется повторно (или новое соединение инициализируется с того места, где было прервано предыдущее)?

3 ответа3

19

Оборачивается, идя к 0. Согласно RFC 793:

Важно помнить, что фактическое пространство порядковых номеров конечно, хотя и очень велико. Это пространство варьируется от 0 до 2 ** 32 - 1. Поскольку пространство конечно, вся арифметика, связанная с порядковыми номерами, должна выполняться по модулю 2 ** 32. Эта беззнаковая арифметика сохраняет связь порядковых номеров при повторном цикле от 2 ** 32 - 1 до 0. Есть некоторые тонкости в компьютерной арифметике по модулю, поэтому при программировании сравнения таких значений следует проявлять большую осторожность. Символ «= <» означает "меньше или равно" (по модулю 2 ** 32).

17

Порядковый номер оборачивается и становится 0?

Да. Все подробности можно найти в спецификации TCP RFC 793 - Протокол управления передачей.


Порядковые номера

Важно помнить, что фактическое пространство порядковых номеров конечно, хотя и очень велико. Это пространство колеблется от 0 до 2 32 - 1.

Поскольку пространство конечно, вся арифметика, связанная с порядковыми номерами, должна выполняться по модулю 2 32. Эта беззнаковая арифметика сохраняет связь порядковых номеров при повторном цикле от 2 32 - 1 до 0.

Есть некоторые тонкости в компьютерной арифметике по модулю, поэтому при программировании сравнения таких значений следует проявлять большую осторожность. Символ «= <» означает "меньше или равно" (по модулю 2 32).

Источник RFC 793 - Протокол управления передачей

7

Да, это оборачивается. Вы можете прочитать его в Википедии или в RFC1323, который показывает, как защитить от свернутых порядковых номеров.

Позвольте мне процитировать:

Временные метки TCP используются в алгоритме, известном как защита от порядковых номеров в оболочке или PAWS (подробнее см. RFC 1323). PAWS используется, когда окно приема пересекает границу переноса порядкового номера. В случае, когда пакет был потенциально повторно передан, он отвечает на вопрос: «Этот порядковый номер в первых 4 ГБ или во втором?"И отметка времени используется для разрыва связи.

А также:

PAWS использует ту же опцию TCP Timestamps, что и механизм RTTM, описанный ранее, и предполагает, что каждый полученный сегмент TCP (включая сегменты данных и ACK) содержит метку времени SEG.TSval, значения которой являются монотонными, не убывающими во времени. Основная идея состоит в том, что сегмент может быть отброшен как старый дубликат, если он получен с временной меткой SEG.TSval меньше, чем некоторая временная метка, недавно полученная по этому соединению.

И в PAWS, и в механизме RTTM временные метки представляют собой 32-разрядные целые числа без знака в модульном 32-разрядном пространстве. Таким образом, "меньше чем" определяется так же, как и для порядковых номеров TCP, и применяются те же методы реализации. Если s и t являются значениями меток времени, s <t, если 0 <(t - s) <2 ** 31, вычисляется в 32-разрядной арифметике без знака.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .