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

kb/network-l4 ── Сеть: L4 и выше ── intermediate

TCP three-way handshake

TCP-соединение открывается тремя пакетами: SYN от клиента, SYN-ACK от сервера, ACK от клиента. После - соединение Established, можно слать данные.

view as markdownaka: tcp-3wh, syn-synack-ack, tcp-3-way-handshake

Что происходит

Когда клиент делает connect() к серверу, ядра обмениваются тремя пакетами:

Client                      Server
  |   ── SYN seq=X ──────►   |  (1)
  |                          |
  |   ◄── SYN-ACK            |  (2)
  |       seq=Y ack=X+1      |
  |                          |
  |   ── ACK ack=Y+1 ─────►  |  (3)
  |                          |
  | <════════════════════════> |  ESTABLISHED, ready to send data

Что в каждом пакете

  • SYN - флаг S в tcpdump. Клиент: «хочу открыть, мой ISN = X»
  • SYN-ACK - флаги S+A. Сервер: «согласен, мой ISN = Y, твоё X+1 я подтверждаю»
  • ACK - флаг A. Клиент: «подтверждаю Y+1»

После третьего пакета обе стороны считают соединение Established - ядро на сервере добавляет в accept-queue, оттуда accept()-syscall достаёт его в приложение.

ISN - Initial Sequence Number

Каждая сторона выбирает случайный 32-битный ISN. Это не нумерация байтов от нуля - нет. Случайность защищает от:

  • Sequence-prediction атак (вставка пакетов в чужое соединение)
  • Перепутывания со старыми пакетами после crash'а

Дальше последовательность инкрементируется на размер payload в каждом пакете данных.

Где видно

В tcpdump каждый пакет имеет флаги:

Flags [S],     seq 1000      ← SYN
Flags [S.],    seq 5000, ack 1001  ← SYN-ACK
Flags [.],     ack 5001      ← ACK
Flags [P.],    seq 1001:1041, ack 5001  ← данные с PUSH (HTTP request)

Точка после буквы ([.]) обозначает ACK.

Когда что-то пошло не так

  • Connection refused - порт закрыт. Сервер вместо SYN-ACK шлёт RST
  • Connection timeout - пакеты теряются или файрвол дропает; клиент ретранслирует SYN несколько раз и сдаётся (~3 минуты по дефолту)
  • SYN+но нет ACK - половина handshake'а застряла; на стороне сервера это SYN_RECV state. Если таких много - атака SYN-flood
  • SYN cookieы - защита от SYN-flood: сервер не аллоцирует state до получения ACK, а кодирует ISN в cookie

Что после

Сразу после ACK обычно идёт первый data-пакет (HTTP GET, TLS ClientHello, etc.). На loopback это всё происходит за микросекунды - на WAN добавляется RTT × 1.5 как минимум (handshake + первый запрос).

§ команды

bash
tcpdump -i lo -nn 'tcp port 8080' -c 10

Снять первые 10 пакетов на порту 8080 - handshake займёт первые три

bash
ss -tn '( dport = 8080 or sport = 8080 )'

TCP-сессии связанные с портом 8080 и их состояние

bash
ss -ti dst 1.2.3.4

-ti: extended TCP info - RTT, cwnd, MSS, retransmits, congestion algo

bash
sysctl net.ipv4.tcp_syncookies

1 = SYN cookies включены - защита от SYN-flood без аллокации state

§ см. также

  • tcp-statesTCP states (LISTEN, ESTABLISHED, TIME_WAIT)TCP-сессия проходит через 11 состояний от LISTEN до CLOSED. Самые важные на проде: LISTEN, ESTABLISHED, TIME_WAIT, CLOSE_WAIT.
  • tcp-keepaliveTCP keepaliveKeepalive шлёт пробы по простаивающему TCP-соединению чтобы поймать мёртвый peer (NAT-таймаут, упавший хост). Дефолт Linux: 7200s простоя, 75s между пробами, 9 проб. Включается через setsockopt(SO_KEEPALIVE).
  • mtu-and-pmtudMTU и Path MTU Discovery (PMTUD)MTU - максимум байт IP-пакета на интерфейсе. PMTUD ищет минимум на пути через ICMP "Fragmentation Needed". Если ICMP режут - blackhole больших пакетов. MSS clamping в iptables/nftables - стандартный фикс на туннелях VXLAN/IPsec.
  • tls-handshakeTLS handshakeTLS - слой шифрования поверх TCP. Перед передачей данных стороны делают handshake: обмениваются ключами, проверяют сертификат, выбирают cipher.
  • mqttMQTT - publish/subscribe для IoT и mobile pushMQTT - lightweight pub/sub поверх TCP. Topics с wildcards, QoS 0/1/2, retained messages, last will. Малый overhead (2 байта min header). Брокер обязателен (mosquitto/EMQX/HiveMQ). Применение: IoT, telemetry, mobile push.
  • http-protocolHTTP/1.1, HTTP/2, HTTP/3HTTP/1.1 - текстовый протокол с keep-alive. HTTP/2 - бинарный с мультиплексированием в одном TCP-соединении. HTTP/3 = HTTP/2-семантика поверх QUIC/UDP без TCP-head-of-line blocking.
  • quic-http3QUIC и HTTP/3 - современный транспорт поверх UDPQUIC - транспорт поверх UDP. TLS 1.3 встроен (1 RTT, 0-RTT для resume). Multiplexing без head-of-line blocking. Connection migration (Wi-Fi → 4G без drop). HTTP/3 = HTTP-семантика поверх QUIC.

§ упоминается в уроках

  • ›advanced-03-tc-netem
  • ›advanced-04-tcp-tuning
  • ›advanced-05-bandwidth-iperf
  • ›intermediate-02-tcp-handshake
  • ›intermediate-09-tls-handshake
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки