📡 Что внутри TCP-пакета и зачем тестировщику знать его флаг

Когда бэкенд «не отвечает» или соединение рвётся по таймауту, смотреть только логи сервера недостаточно. Понимание TCP-пакета — это как рентген для сетевого трафика. Разберём анатомию заголовка и главные сигнальные флаги, которые управляют каждой сессией.

🧱 Содержимое TCP-заголовка (база) Заголовок TCP обычно 20 байт (без опций) и содержит:

· Порты отправителя и получателя — кому и от кого. · Sequence Number (SEQ) — номер первого байта данных в сегменте. · Acknowledgment Number (ACK) — номер следующего ожидаемого байта (если флаг ACK установлен). · Размер окна (Window) — сколько данных готов принять получатель (управление потоком). · Контрольная сумма — проверка целостности. · Флаги (9 бит) — главные «рычаги» состояния соединения.

Именно флаги рассказывают, что происходит: начало диалога, передача данных, разрыв или экстренный сброс.

🚦 Флаги TCP — азбука состояний Каждый флаг — 1 бит. Вот главные герои и их роли:

1. SYN (Synchronize) — «Давай знакомиться». Открывает соединение. Видите SYN в Wireshark → клиент инициирует handshake. 2. ACK (Acknowledgment) — «Принято». Подтверждает получение данных или SYN. Практически каждый пакет после handshake содержит ACK. 3. FIN (Finish) — «Я всё сказал, давай закругляться». Инициирует корректное закрытие соединения (graceful shutdown). Приходит от стороны, которая хочет завершить сессию. 4. RST (Reset) — «Обрыв! Забудь это соединение». Жёсткий сброс. Сервер может ответить RST на попытку подключиться к закрытому порту или при ошибке протокола. В тестах — верный признак, что сервер не ожидает трафика на этом порту. 5. PSH (Push) — «Отправь данные приложению немедленно». Указывает, что сегмент нужно доставить на прикладной уровень без буферизации. Часто встречается в HTTP-запросах/ответах. 6. URG (Urgent) — «Срочные данные вне очереди». Включает поле Urgent Pointer. Редко используется, но знать стоит — иногда встречается в специфичных протоколах.

Дополнительные (для явного контроля перегрузок, RFC 3168):

7. ECE (ECN Echo) — сигнал о перегрузке сети (используется с ECN). 8. CWR (Congestion Window Reduced) — «Я уменьшил окно из-за перегрузки».

🔍 Почему это важно для QA При анализе дампов трафика (tcpdump, Wireshark) вы легко читаете сценарий:

· SYN → SYN-ACK → ACK — классическое трёхстороннее рукопожатие, соединение установлено. · Отсутствие SYN-ACK после SYN — порт не слушается, фаервол режет, сервер упал. · Повторные SYN (ретрансмиты) без ответа → сетевые проблемы или недоступность. · FIN → ACK, FIN → ACK — аккуратное закрытие с обеих сторон. · Внезапный RST после нескольких успешных пакетов → сервер рухнул или приложение аварийно закрыло сокет. · Отсутствие PSH может объяснять задержки в доставке данных, если сервер накапливает буфер. · Постоянные ECE/CWR указывают на перегрузки в сети.

Всё это превращает «магический баг» в читаемый диалог клиента и сервера. А значит, локализация проблемы ускоряется в разы.

💡 Совет: в Wireshark используйте фильтры вроде tcp.flags.syn == 1 && tcp.flags.ack == 0 чтобы найти все входящие запросы на соединение, или tcp.flags.reset == 1 — чтобы выловить моменты жёсткого обрыва.

Делитесь в комментариях, какие TCP-флаги чаще всего всплывали в ваших расследованиях 👇

#qa #network #tcp #wireshark #testing #backend