linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
home/linux/how/tcp-handshake

how/network

Жизненный цикл TCP-соединения

Three-way handshake → данные → four-way close. Зачем три рукопожатия и почему `ss` показывает столько состояний после закрытия.

TCP - это разговор с подтверждениями. Прежде чем начать обмен данными, две стороны должны «договориться»: каждая выбирает свой случайный «номер начала», и каждая должна подтвердить что увидела чужой. На это нужно три пакета - это и есть знаменитый three-way handshake.

После handshake'а данные ходят свободно. Когда стороны хотят закончить - они отдельно «прощаются» в обе стороны (TCP полудуплексный по закрытию: одна сторона может «всё, я сказал», а другая ещё что-то отправляет).

Из всех этих переходов рождается state machine - на каждой стороне соединение проходит через цепочку состояний. Их можно увидеть живьём через ss -tn - каждое ESTABLISHED/TIME_WAIT/etc. в выводе именно отсюда.

Нажми ▶ - пройдём весь цикл от первого SYN до финального TIME_WAIT.

step 1/8·00 · сервер слушает, клиент готов подключиться
clientcurl 10.0.0.5:443server:443 nginxCLOSEDLISTENклиент готов открыть соединение, сервер слушает 0.0.0.0:443rfc 793 · полный жизненный цикл tcp-соединения

§ шаги

  1. Сервер открыл слушающий сокет на порту 443 (см. port). Стек ОС знает: «если пакет придёт сюда - отдай его этому приложению». Состояние сервера - LISTEN.

    Клиент пока в CLOSED - никаких сокетов не открыто. Когда приложение вызовет connect() - стек начнёт активный handshake.

итого

Что важно запомнить:

  • Three-way handshake не для красоты: каждая сторона выбирает случайный начальный seq и хочет убедиться что собеседник его получил. Без этого атакующий мог бы инжектить пакеты в чужие соединения
  • SYN_SENT навсегда = сервер не отвечает (фаервол дропает / порт закрыт). SYN_RECEIVED навсегда на сервере = очередь входящих коннектов забита
  • Закрытие четырёхстороннее потому что TCP полудуплексный по отношению к close: одна сторона может закончить отправку, но всё ещё принимать данные
  • TIME_WAIT - это нормально. После закрытия соединение висит ~60-120 секунд, чтобы поздно прилетевшие пакеты от старого соединения не влезли в новое с тем же портом. Если в ss много TIME_WAIT - это след массового скачивания, не утечка
  • Любой пакет с RST-флагом мгновенно закрывает соединение в обе стороны. Это «грубый разрыв», обычно от ошибки на стороне сервера

Если хочешь смотреть состояния руками - есть [[tcp-states|статья про все состояния]] и lab по tcp-handshake с tcpdump'ом.

§ копнуть в базу знаний

  • tcp-handshakeTCP handshake - расширенная статья
  • tcp-statesTCP states - все 11 состояний детально
  • portport - какие порты участвуют в соединении
  • tls-handshakeTLS handshake - что строится поверх TCP

§ попробовать руками

  • ›intermediate-02-tcp-handshake- TCP handshake - посмотреть с tcpdump
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки