[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-ustroystvo-pk-i-seti-chto-takoe-tryokhstoronnee-rukopozhatie-three-way-handshake":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},231,"chto-takoe-tryokhstoronnee-rukopozhatie-three-way-handshake",7,"ustroystvo-pk-i-seti","Устройство ПК и сети","🖥️","Что такое трёхстороннее рукопожатие (three-way handshake)?","**Three-way handshake** — процедура установления TCP-соединения между клиентом и сервером, состоящая из обмена тремя сегментами (SYN → SYN-ACK → ACK), в ходе которого обе стороны согласовывают начальные номера последовательностей и подтверждают готовность к передаче данных.\n\n> **Аналогия из жизни:** это как телефонный звонок. Вы звоните и говорите «Алло?» (SYN). Собеседник отвечает «Алло, слышу вас!» (SYN-ACK). Вы подтверждаете «Отлично, и я вас слышу, давайте поговорим» (ACK). Только после этого начинается разговор.\n\n### Схема установления соединения\n\n```\nКлиент                              Сервер\n   |                                   |\n   |-------- SYN (seq=x) ------------>|  1. Клиент хочет соединиться\n   |           Состояние: SYN_SENT     |     Состояние: LISTEN\n   |                                   |\n   |\u003C--- SYN-ACK (seq=y, ack=x+1) ---|  2. Сервер подтверждает и предлагает свой номер\n   |           Состояние: SYN_SENT     |     Состояние: SYN_RECEIVED\n   |                                   |\n   |-------- ACK (ack=y+1) ---------->|  3. Клиент подтверждает\n   |           Состояние: ESTABLISHED  |     Состояние: ESTABLISHED\n   |                                   |\n   |       Соединение установлено      |\n```\n\n### Детальное описание шагов\n\n**Шаг 1 — SYN (Synchronize):**\n- Клиент отправляет сегмент с флагом **SYN** и начальным номером последовательности (`seq=x`, где x — случайное число, ISN — Initial Sequence Number)\n- Клиент переходит в состояние `SYN_SENT`\n- ISN генерируется случайно для защиты от атак подмены (TCP sequence prediction)\n\n**Шаг 2 — SYN-ACK:**\n- Сервер получает SYN, отвечает сегментом с флагами **SYN** и **ACK**\n- `seq=y` (свой начальный номер), `ack=x+1` (подтверждает получение SYN клиента)\n- Сервер переходит в состояние `SYN_RECEIVED`\n\n**Шаг 3 — ACK:**\n- Клиент отправляет ACK с `ack=y+1` (подтверждает получение SYN сервера)\n- Оба переходят в состояние `ESTABLISHED` — соединение установлено, можно передавать данные\n- Начиная с этого сегмента, клиент уже может отправлять данные\n\n### Зачем три шага, а не два?\n\n- Оба участника должны согласовать **начальные номера последовательностей (ISN)** для каждого направления — это требует по одному сообщению в каждую сторону плюс подтверждение\n- Два шага не гарантируют, что обе стороны готовы к передаче данных\n- Защита от дублированных SYN-пакетов от прошлых соединений (stale segments)\n\n### Завершение TCP-соединения (four-way handshake)\n\n```\nКлиент                              Сервер\n   |-------- FIN ------------------>|  1. Клиент хочет завершить (FIN_WAIT_1)\n   |\u003C-------- ACK -----------------|  2. Сервер подтверждает (CLOSE_WAIT)\n   |                                |     Клиент: FIN_WAIT_2\n   |\u003C-------- FIN -----------------|  3. Сервер тоже завершает (LAST_ACK)\n   |-------- ACK ------------------>|  4. Клиент подтверждает (TIME_WAIT)\n   |                                |     Сервер: CLOSED\n   |  (ждёт 2×MSL ≈ 60 с)          |\n   |  Состояние: CLOSED             |\n```\n\n### Состояния TCP-соединения\n\n| Состояние | Описание |\n|---|---|\n| `LISTEN` | Сервер ожидает входящих соединений |\n| `SYN_SENT` | Клиент отправил SYN, ожидает SYN-ACK |\n| `SYN_RECEIVED` | Сервер получил SYN, отправил SYN-ACK |\n| `ESTABLISHED` | Соединение установлено, передача данных |\n| `FIN_WAIT_1` | Отправлен FIN, ожидание ACK |\n| `FIN_WAIT_2` | Получен ACK на FIN, ожидание FIN от другой стороны |\n| `CLOSE_WAIT` | Получен FIN, ожидание закрытия от приложения |\n| `TIME_WAIT` | Ожидание гарантии доставки последнего ACK (2×MSL) |\n| `CLOSED` | Соединение закрыто |\n\n### Для Java-разработчика\n\n- `new Socket(\"host\", port)` — внутри происходит three-way handshake\n- `socket.close()` — инициирует four-way handshake\n- При большом количестве короткоживущих соединений состояния `TIME_WAIT` могут исчерпать ресурсы (порты, файловые дескрипторы). Решение: HTTP keep-alive, connection pooling (HikariCP для JDBC)\n- `ServerSocket` с параметром `backlog` управляет очередью входящих соединений в состоянии SYN_RECEIVED\n\n### Вывод\n\nThree-way handshake — обязательный этап установления каждого TCP-соединения. Он гарантирует, что обе стороны готовы к обмену данными и согласовали параметры. Завершение соединения — четырёхэтапное, потому что каждая сторона может иметь данные для отправки.\n\n> **На собеседовании:** уверенно нарисуйте диаграмму SYN → SYN-ACK → ACK. Часто спрашивают, зачем нужен `TIME_WAIT` (чтобы последний ACK гарантированно дошёл и чтобы stale-пакеты от старого соединения не попали в новое). Также стоит упомянуть SYN flood-атаку — злоумышленник отправляет множество SYN, не завершая handshake, и исчерпывает ресурсы сервера (защита — SYN cookies).","","junior",[15,16,17,18,19,20],"tcp","сети","соединение","ack","syn","three-way-handshake",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":35,"featuredSnippetReady":36},"Three-way handshake TCP — SYN, SYN-ACK, ACK — как устанавливается соединение — Gymterview","TCP three-way handshake: SYN (seq=x) → SYN-ACK (seq=y, ack=x+1) → ACK (ack=y+1). Зачем три шага, завершение через four-way handshake и TIME_WAIT.","Three-way handshake — как TCP устанавливает соединение","SYN (seq=x) → SYN-ACK (seq=y, ack=x+1) → ACK (ack=y+1). Три шага нужны для согласования ISN обоих сторон. Завершение: FIN → ACK → FIN → ACK.",[29,30,31,32,33,34],"three-way handshake","трёхстороннее рукопожатие","TCP SYN SYN-ACK ACK","установление TCP соединения","four-way handshake","TIME_WAIT","Three-way handshake — процедура установления TCP-соединения из трёх шагов: 1) клиент отправляет SYN с начальным seq=x, 2) сервер отвечает SYN-ACK (seq=y, ack=x+1), 3) клиент отправляет ACK (ack=y+1). Три шага нужны для согласования ISN обеих сторон и защиты от дублей. Завершение — four-way handshake (FIN\u002FACK), после чего клиент находится в TIME_WAIT ~60 секунд.",true]