TCP 3-стороннее рукопожатие (SYN, SYN-ACK,ACK)
⚡ Умное резюме
Трехстороннее рукопожатие TCP — это ритуал установления соединения, с которого начинается каждая сессия TCP. Клиент и сервер обмениваются пакетами SYN, SYN-ACK и ACK для синхронизации порядковых номеров и подтверждения готовности обеих сторон перед отправкой хотя бы одного байта данных приложения.

Что такое трехстороннее рукопожатие TCP?
Трехстороннее рукопожатие TCP Это процедура, которую используют клиент и сервер. Сеть TCP/IP Для установления надежного соединения до обмена данными приложения. Как следует из названия, этот процесс состоит из трех этапов, в ходе которых обе стороны обмениваются пакетами синхронизации (SYN) и подтверждения (ACK) и согласовывают начальные порядковые номера, которые они будут использовать.
Процедура установления соединения разработана таким образом, чтобы обе конечные точки могли симметрично инициировать, согласовывать и разрывать TCP-сокеты. После завершения установления соединения оно становится полнодуплексным — обе стороны могут отправлять и получать данные параллельно до тех пор, пока одна из них не отправит FIN-код для закрытия сессии.
Типы сообщений TCP
В процессе установления и завершения взаимодействия неоднократно появляются четыре контрольных флага.
| Сообщение | Описание |
|---|---|
| SYN | Инициирует соединение и синхронизирует порядковые номера между устройствами. |
| ACK | Подтверждает другой стороне, что предыдущий сегмент был получен. |
| СИН-АКТ | Объединенное сообщение — SYN-сообщение с локального устройства плюс подтверждение (ACK) более раннего SYN-сообщения от другого устройства. |
| ПЛАВНИК | Используется для корректного завершения соединения. |
Процесс трехстороннего установления связи TCP
TCP-трафик всегда начинается с трехстороннего рукопожатия. Клиент инициирует разговор, запрашивая сессию у сервера.
Схема трехстороннего рукопожатия.
- Шаг 1 — СИН. Клиент отправляет сегмент с установленным флагом SYN. Он сообщает серверу: «Я хочу начать обмен данными» и предлагает начальный порядковый номер.
- Шаг 2 — SYN-ACK: Сервер отвечает сегментом, в котором установлены флаги SYN и ACK. Флаг ACK подтверждает получение SYN-сообщения от клиента, а SYN-сообщение предлагает собственный начальный порядковый номер сервера.
- Шаг 3 — ACK: Клиент подтверждает получение SYN-ACK от сервера окончательным 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-куки.
- Полуоткрытые соединения: Когда теряется третье подтверждение (ACK), соединение остается полуоткрытым и в конечном итоге очищается по истечении времени ожидания.
- Сбои в работе брандмауэра или NAT во время передачи данных: Промежуточные устройства с сохранением состояния, теряющие это состояние, могут отбрасывать пакеты SYN-ACK, заставляя клиента повторять попытку подключения.
- Сброс RST: Если сервер не прослушивает запрошенный порт, он отвечает на SYN-запрос сигналом RST, который немедленно прекращает попытку подключения.


