TCP 3-Way Handshake (SYN, SYN-ACK,ACK)
⚡ Розумний підсумок
Тристороннє рукостискання TCP – це ритуал встановлення з'єднання, з якого починається кожен TCP-сеанс. Клієнт і сервер обмінюються пакетами SYN, SYN-ACK та ACK для синхронізації порядкових номерів та підтвердження готовності обох сторін, перш ніж буде надіслано один байт даних програми.

Що таке тристороннє рукостискання TCP?
Команда Тристороннє рукостискання TCP це процедура, яку використовують клієнт і сервер на Мережа TCP/IP встановити надійне з’єднання перед обміном будь-якими даними програми. Як випливає з назви, це складається з трьох кроків, на яких обидві сторони обмінюються пакетами синхронізації (SYN) та підтвердження (ACK) і узгоджують початкові порядкові номери, які вони використовуватимуть.
Рукостискання розроблено таким чином, щоб обидві кінцеві точки могли симетрично ініціювати, узгоджувати та розривати TCP-сокети. Після завершення рукостискання з'єднання стає повнодуплексним — обидві сторони можуть надсилати та отримувати дані паралельно, доки одна з них не видасть команду FIN для закриття сеансу.
Типи TCP-повідомлень
Чотири контрольні прапорці з'являються неодноразово під час рукостискання та розриву.
| Повідомлення | Опис |
|---|---|
| SYN | Ініціює з'єднання та синхронізує порядкові номери між пристроями. |
| ACK | Підтверджує іншій стороні отримання попереднього сегмента. |
| SYN-ACK | Комбіноване повідомлення — SYN від локального пристрою плюс ACK попереднього SYN вузла. |
| FIN | Використовується для коректного завершення з'єднання. |
Процес тристороннього рукостискання TCP
TCP-трафік завжди починається з тристороннього рукостискання. Клієнт ініціює розмову, запитуючи сеанс із сервером.
Діаграма тристороннього рукостискання.
- Крок 1 — SYN: Клієнт надсилає сегмент із встановленим прапорцем SYN. Він повідомляє серверу: «Я хочу розпочати зв'язок» та пропонує початковий порядковий номер.
- Крок 2 — SYN-ACK: Сервер відповідає сегментом, у якому встановлено прапорці SYN та ACK. ACK підтверджує SYN клієнта, а SYN пропонує власний початковий порядковий номер сервера.
- Крок 3 — ПІДТВЕРДЖЕННЯ: Клієнт підтверджує SYN-ACK сервера остаточним підтвердженням. З'єднання тепер встановлено, і обидві сторони можуть розпочати transmitдані програми.
Реальний приклад
Ось розв'язаний приклад з конкретними порядковими номерами.
- Хост X розпочинає з'єднання, надсилаючи TCP SYN-пакет на сервер. Пакет містить випадковий початковий порядковий номер, наприклад,
4321— що позначає початок потоку байтів, який надсилатиме хост X. - Сервер отримує SYN та відповідає SYN-ACK. Номер ACK – це порядковий номер хоста X, збільшений на 1 (
4322), а SYN пропонує власний початковий порядковий номер сервера. - Хост X відповідає остаточним підтвердженням (ACK), номер підтвердження якого дорівнює порядковому номеру сервера, збільшеному на 1.
Після завершення обміну даними TCP розриває з'єднання за допомогою чотиристоронньої послідовності FIN/ACK, щоб обидві кінцеві точки могли коректно звільнити сокет.
Чому TCP потрібне тристороннє рукостискання
Рукостискання — це не просто формальність, воно вирішує три конкретні проблеми, пов'язані з надійним транспортуванням байтового потоку:
- Синхронізація порядкових номерів: обидва вузли дізнаються початковий порядковий номер іншої сторони, який TCP використовує для виявлення втрачених або невпорядкованих сегментів.
- Угода про стан підключення: Третє підтвердження (ACK) підтверджує отримання SYN-ACK сервера, тому жодна зі сторін не починає надсилати дані, доки обидві не отримають ВСТАНОВЛЕНО стан.
- Захист від дублікатів пакетів: Випадкові початкові порядкові номери та часові стани рукостискання запобігають помилковому прийняттю застарілих сегментів з попереднього сеансу.
Поширені проблеми з TCP-підтвердженням
Рукостискання є надійним, але воно може порушуватися різними способами. Мережеві інженери зазвичай бачать одне з наступного:
- SYN-атаки з перевантаженням: Зловмисний клієнт надсилає тисячі SYN-повідомлень, не відповідаючи на SYN-ACK-повідомлення, вичерпуючи таблицю підключень сервера. SYN-файли cookie є стандартним захистом.
- Напіввідкриті з'єднання: Коли третє підтвердження (ACK) втрачається, з'єднання залишається напіввідкритим і зрештою очищується через тайм-аут.
- Зниження брандмауера або NAT під час роботи: Проміжні блоки з функцією збереження стану, які втрачають стан, можуть скидати пакети SYN-ACK і змушувати клієнта повторювати спробу.
- Скидання RST: Якщо сервер не прослуховує запитуваний порт, він відповідає SYN запитом RST, що негайно завершує спробу.


