Какие флаги в TCP-заголовке ты знаешь и для чего они используются?

«Какие флаги в TCP-заголовке ты знаешь и для чего они используются?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TCP-флаги — это управляющие биты в заголовке TCP-сегмента, которые управляют состоянием соединения. Понимание их критично для диагностики сетевых проблем (анализ дампов tcpdump, логирование в iptables).

Основные флаги:

  • SYN (Synchronize) — инициирует установление соединения (первый шаг three-way handshake). Вижу его в дампах, когда клиент пытается подключиться к закрытому порту.
  • ACK (Acknowledgment) — подтверждает успешный приём данных. Присутствует почти в каждом пакете после установления соединения.
  • FIN (Finish) — используется для штатного, двустороннего завершения соединения. Каждая сторона отправляет свой FIN.
  • RST (Reset) — немедленный, "грубый" разрыв соединения. Сервер отправляет RST в ответ на SYN к закрытому порту. Вижу RST при таймаутах или когда приложение аварийно завершилось.
  • PSH (Push) — указывает ядру ОС отправить данные из буфера немедленно, не дожидаясь его заполнения. Важен для интерактивных протоколов вроде SSH или Telnet.
  • URG (Urgent) — помечает данные как "срочные". На практике почти не используется современными приложениями.

Пример из реальной диагностики: При проблемах с подключением к веб-серверу я захватываю трафик:

sudo tcpdump -i eth0 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-rst) != 0)'

В выводе могу увидеть:

  • [S] — SYN (попытка подключения).
  • [S.] — SYN-ACK (сервер согласен на соединение).
  • [R] — RST (соединение принудительно сброшено, часто из-за фаервола или отсутствия сервиса). Понимание этих флагов позволяет быстро определить, на каком этапе (установка, передача данных, разрыв) возникает проблема.