Порядок пакетів (tcp)

Пакети, звичайно, можуть прийти в різному порядку. Але ось ядро ​​віддасть дані вашого додатком завжди в правильному порядку.

Тобто навіть якщо прийшли пакети з SEQ = 1, і довжиною 1000, а також SEQ = 2501 і довжиною 500, то ядро ​​розуміючи, що чогось не вистачає (пропущено 1500 байт в середині - другій SEQ, тобто номер байта, 2501 , а ми поки що мали байти аж до 1000 включно), не віддасть на прикладний рівень другий пакет. А по мережі ядро ​​буде відправляти ACK 1000, що він отримав перший пакет, натякаючи, що там більше немає.

Як тільки прийде пакет з SEQ 1001 і який-небудь довжиною, він буде відданий ядру. Пакет з SEQ = 2501, хоча він у ядра давно вже є, вашому додатка не буде відданий до тих пір, поки всі 1500 байтів з номерами 1001 до 2500 включно не дійдуть, по скільком пакетом б вони не були розкидані (хоч 1500 пакетів по одному байту). Якщо в процесі передачі цих проміжних пакетів відбудеться таймаут, то пакет з SEQ = 2501 ваше додаток і не побачить ніколи, хоча ядро ​​системи-одержувача його мало.

(Хочу звернути увагу на те, що пакети не пронумеровані. Пронумеровано байти. Поле SEQ в пакеті - послідовний номер першого байта даного пакета. Одна тонкість: нумерація починається не з 0 і не з 1, а з випадкового числа, яке визначається відправником при установці з'єднання - в пакеті з прапором SYN. ​​Приклад вище потрібно розуміти так, що SYN був з SEQ = 1).

Тобто, про те, що до вас не дійдуть проміжні пакети, ви можете у випадку з TCP не турбуватися. Якщо ви на одному кінці записали байти в сокет в певному порядку, ви на іншому кінці або отримаєте їх в точно такому ж порядку, або не отримаєте взагалі.

У вашому випадку, поведінка системи передбачити не можна, тобто ви надали недостатньо даних. Потрібно було б знати seqno пакета з прапором «syn»: 1, а ви такий пакет чи то не захопили, чи то забули тут вказати.

Якщо припустити, що перший пакет в даному з'єднанні реально «перший», то у syn-пакета в вашому випадку seqno дорівнював 1455343061, і ваше додаток, хто слухає сокет, не отримає взагалі ніяких даних і подій від цього сокета (наприклад, select (. ) не повернеться, а якщо повернеться, то цей сокет не буде в ньому readable), поки система не отримає пакет з seq = 1455343061, після отримання якого вона дані з нього віддасть додатком, а сама додасть до цього числа розмір пакета (в даному випадку - 1440), і в такий додатком будуть видані дані з пакета з seqno = 1455343061 + 1440 = 1455344501, яким б він по порядку не прийшов з мережі.

select ще як повернеться. після fin, теоретизуючи в цифрах - не забуваємо про rfc і їх реалізаціях.
більш того, у tcp syn (ви ж про tcp, так?) не може бути довільного seqno, це початок «потоку».

Схожі статті