Ответ
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 (соединение принудительно сброшено, часто из-за фаервола или отсутствия сервиса). Понимание этих флагов позволяет быстро определить, на каком этапе (установка, передача данных, разрыв) возникает проблема.