Последовательный номер заголовков пакетов TCP обернут?


16

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

Ответы:


19

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

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


3
Каждое число меньше или равно любому другому числу, по модулю 2 ** 32 ...
user253751

2
@ user20574 Вот почему размер окна TCP не может превышать 1 ГБ, и сравнение порядковых номеров должно быть кратчайшим (т. е. разница должна быть в диапазоне от -2 ^ 31 до 2 ^ 31).
Касперд

17

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

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


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

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

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

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

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


1
Я не хочу стрелять в мессенджера, но "меньше или равно (по модулю N)"? Ясно, что автор RFC упустил "тонкости компьютерной арифметике модулей".
Бен Фойгт

В тех случаях, когда максимальное окно будет меньше 2 ^ 31, а если xи yявляются типом, uint32_tего целесообразно определить x<=yкак среднее (uint32_t)(y-x) < 0x80000000.
суперкат

@BenVoigt, скорее всего, они воспринимали как должное то, что позже было описано в RFC tools.ietf.org/html/rfc1982
Carsten S

@Carsten, это полезная арифметика, но это не «арифметика по модулю N»
Бен Фойгт

1
@BenVoigt, да что угодно. Кстати, я хорошо знаю, что группы Z / (n) не упорядочены, но я также способен интерпретировать утверждения в контексте.
Карстен С

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-разрядной арифметике без знака.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.