Чи загортається порядковий номер заголовків пакетів TCP?


16

Мені було цікаво, оскільки номер послідовності в полі заголовка TCP вибирається випадковим чином під час рукостискання і поступово збільшується в міру обміну пакетами, що відбувається після передачі 2 ^ 32 - початкова_сек_но? Чи обертається порядковий номер і стає 0 або початкове значення повторно використовується (або ініціалізується нове з'єднання з того місця, де припинено попереднє)?

Відповіді:


19

Він завершує перехід до 0. Відповідно до RFC 793 :

Важливо пам’ятати, що фактичний простір номерів послідовностей є кінцевим, хоча і дуже великим. Цей простір коливається від 0 до 2 ** 32 - 1. Оскільки простір є кінцевим, усі арифметичні справи з порядковими номерами повинні виконуватися за модулем 2 ** 32. Ця непідписана арифметика зберігає співвідношення порядкових чисел, коли вони повторно переходять від 2 ** 32 - 1 до 0. Існують деякі тонкощі комп'ютерної модульної арифметики, тому слід уважно ставитися до програмування порівняння таких значень. Символ "= <" означає "менше або рівний" (модуль 2 ** 32).


3
Кожне число менше або рівне будь-якому іншому номеру, модуль 2 ** 32 ...
користувач253751

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

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.
supercat

@BenVoigt, швидше за все, вони сприйняли як належне те, що було описано пізніше в RFC tools.ietf.org/html/rfc1982
Carsten S

@Carsten - це корисна арифметика, але це не "арифметична модуль N"
Бен Войгт

1
@BenVoigt, так, як би там не було. До речі, я добре знаю, що групи Z / (n) не впорядковані, але я також здатний інтерпретувати твердження в контексті.
Carsten S

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.