Урок 3 из 4 · 7 мин
Рукопожатие TCP и жизнь соединения
Как два компьютера договариваются об общении прежде, чем кто-либо из них отправит реальные данные, как они завершают разговор, и что на самом деле видит файрвол, наблюдающий за этим со стороны.
Прежде чем ваш Mac отправит хоть один байт запроса веб-страницы, он уже обменивается тремя короткими сообщениями с сервером. Именно этот обмен, тройное рукопожатие TCP, превращает обещания надёжности TCP из предыдущего урока в реальное, отслеживаемое соединение между двумя машинами.
Три сообщения до первого слова
RFC 9293, действующая спецификация TCP, описывает этот процесс как синхронизированный обмен: «синхронизация требует, чтобы каждая сторона отправила свой собственный начальный номер последовательности и получила его подтверждение от удалённого узла TCP» (the synchronization requires each side to send its own initial sequence number and to receive a confirmation of it in acknowledgment from the remote TCP peer).
- SYN. Устройство, открывающее соединение, отправляет сегмент с установленным флагом SYN, несущий начальный номер последовательности.
- SYN-ACK. Другая сторона отвечает собственным SYN плюс подтверждением первого номера.
- ACK. Первое устройство подтверждает этот ответ. RFC 9293 отмечает, что «поскольку шаги 2 и 3 можно объединить в одно сообщение, это называется тройным (или трёхсообщенческим) рукопожатием» (because steps 2 and 3 can be combined in a single message this is called the three-way (or three message) handshake). После его завершения обе стороны считают соединение установленным (ESTABLISHED) и начинают отправлять реальные данные.
Учебный центр Cloudflare даёт то же самое простыми словами, используя электронное письмо как пример: «сначала источник отправляет целевому серверу пакет SYN — „начальный запрос“, — чтобы начать диалог. Затем целевой сервер отправляет пакет SYN-ACK, соглашаясь на процесс. Наконец, источник отправляет целевому серверу пакет ACK, подтверждая процесс, после чего можно отправлять содержимое сообщения» (first, the source sends an SYN "initial request" packet to the target server in order to start the dialogue. Then the target server sends a SYN-ACK packet to agree to the process. Lastly, the source sends an ACK packet to the target to confirm the process, after which the message contents can be sent).
Аккуратное завершение соединения
Закрытие происходит более обдуманно, чем открытие. RFC 9293 объясняет, что «обычная последовательность закрытия TCP надёжно доставляет буферизованные данные в обоих направлениях» (the normal TCP close sequence delivers buffered data reliably in both directions), прежде чем соединение завершится: каждая сторона отправляет сегмент FIN, как только у неё больше нет данных для отправки, другая сторона его подтверждает, и только когда завершены оба направления, соединение полностью закрывается. Далее следует короткий период ожидания (TIME-WAIT), чтобы случайный запоздалый пакет из старого соединения нельзя было принять за часть нового.
Что видит файрвол посередине
Файрволу с отслеживанием состояния (stateful) — а таким оснащено большинство роутеров и сама macOS — не нужно проверять каждый пакет, чтобы принять решение. Объяснение Cloudflare описывает это так: он «сохраняет информацию об открытых соединениях и использует эту информацию для анализа входящего и исходящего трафика, вместо того чтобы проверять каждый пакет» (saves information regarding open connections and uses this information to analyze incoming and outgoing traffic, rather than inspecting each packet). На практике это означает, что он следит за SYN, открывающим соединение, запоминает, что это приложение ждёт ответа, а затем незаметно пропускает соответствующий SYN-ACK обратно; ответ, не соответствующий ни одному исходящему SYN, отбрасывается. Именно так файрвол отличает обычный ответ от незапрошенной попытки подключения, возникшей ниоткуда, — на этом строится блокировка нежелательного входящего трафика.
Ничего из этого обмена сам TCP не шифрует: SYN, SYN-ACK и ACK видны в открытом виде всему, что наблюдает за сетевым путём, включая ваш Wi-Fi роутер. То, что скрыто, а что нет, зависит от уровня над TCP, например TLS для HTTPS-сайта, — это отдельно рассматривается в курсе «Как устроен интернет».
Главное
- Соединения TCP открываются тройным рукопожатием: сначала SYN, затем SYN-ACK, затем ACK, согласно RFC 9293.
- Только после завершения рукопожатия обе стороны начинают обмениваться реальными данными.
- Закрытие соединения — это двусторонний обмен сегментами FIN, благодаря которому буферизованные данные доставляются до завершения соединения.
- Файрвол с отслеживанием состояния запоминает, какие SYN были отправлены, чтобы распознавать и пропускать соответствующие ответы, а незапрошенные — отбрасывать.
- Само рукопожатие не зашифровано; оно видно всему, что находится на сетевом пути.
Проверьте себя
1. Каков правильный порядок тройного рукопожатия TCP?
- ACK, SYN, SYN-ACK
- SYN, SYN-ACK, ACK — Верно.
- SYN-ACK, SYN, ACK
- FIN, SYN, ACK
RFC 9293 описывает, что подключающаяся сторона сначала отправляет SYN, другая сторона отвечает SYN-ACK, а подключающаяся сторона подтверждает ACK.
2. Когда реальные данные приложения начинают передаваться по соединению TCP?
- До отправки SYN
- Только после завершения тройного рукопожатия — Верно.
- На этапе SYN-ACK
- Данные передаются непрерывно, без рукопожатия
Рукопожатие существует для того, чтобы синхронизировать номера последовательности, прежде чем любая из сторон достаточно доверится соединению, чтобы отправить реальные данные.
3. Как файрвол с отслеживанием состояния решает пропустить входящий пакет-ответ?
- Он по умолчанию пропускает все входящие пакеты
- Он проверяет, соответствует ли пакет соединению, открытому этим устройством, — по ранее запомненному исходящему SYN — Верно.
- Он проверяет содержимое пакета на наличие ключевых слов
- Он смотрит только на порт назначения, никогда на состояние соединения
Cloudflare описывает файрвол с отслеживанием состояния как тот, что «сохраняет информацию об открытых соединениях», чтобы распознавать законные ответы, вместо того чтобы заново проверять каждый пакет.
4. Зашифровано ли само рукопожатие TCP?
- Да, всегда
- Нет, оно открытое и видно всему на сетевом пути — Верно.
- Зашифрован только SYN
- Только при HTTPS-соединениях
TCP обеспечивает порядок и надёжность, но не конфиденциальность. Шифрование, если оно есть, обеспечивается уровнем над TCP, например TLS.
Примените на практике в FireAI
Примените этот урок на своём Mac.
- Узнайте, куда приложение отправляет данные, на World map — Увидьте, с какой именно компанией и страной незаметно общается одно приложение.
- Правила: приложение, сайт, домен, IP или диапазон, навсегда или до перезагрузки — Напишите правило, точное как один адрес, или широкое как целый домен.
- Глубокая проверка без расшифровки чего-либо — Получайте реальные подробности о защищённом соединении, при этом FireAI никогда не читает то, что внутри него.
Источники
- RFC 9293: Transmission Control Protocol (TCP)
- Cloudflare Learning: What is TCP/IP?
- Cloudflare Learning: What is a Firewall?
Примените это на своём Mac
Все функции бесплатно на 17 дней, без банковской карты.