← Назад к вопросам

Какие знаешь флаги в TCP?

2.0 Middle🔥 251 комментариев

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Флаги TCP: управление состоянием соединения

Флаги TCP (TCP flags) — это управляющие биты в заголовке TCP-сегмента, которые определяют состояние соединения, тип передаваемых данных и реакцию на события. Они играют ключевую роль в управлении потоком, установлении и завершении соединений, а также обработке аномалий. Всего существует 6 основных флагов, каждый из которых занимает 1 бит в 13-м байте заголовка TCP.

Основные флаги TCP и их назначение

  1. SYN (Synchronize) — устанавливает соединение. Инициирует процедуру трёхстороннего рукопожатия (three-way handshake). Флаг указывает, что сегмент содержит начальный порядковый номер (Initial Sequence Number — ISN).
  2. ACK (Acknowledgment) — подтверждение получения данных. Указывает, что поле «Acknowledgment Number» является валидным. Почти все сегменты после установления соединения имеют установленный ACK=1, подтверждая получение предыдущих данных. Исключение — сегменты с RST.
  3. FIN (Finish) — завершает соединение. Используется для корректного закрытия соединения в обе стороны (four-way handshake). Указывает, что отправитель больше не будет передавать данные.
  4. RST (Reset) — немедленный сброс соединения. Используется для аварийного завершения соединения при обнаружении ошибки (например, получение пакета для несуществующего сокета) или для отказа в соединении.
  5. PSH (Push) — требование отправить данные немедленно. Указывает получающему буферу TCP передать данные приложению без ожидания заполнения буфера. Это уменьшает задержку для интерактивных приложений (например, Telnet, SSH).
  6. URG (Urgent) — указание на срочные данные. Указывает, что часть данных в сегменте является срочной и должна быть обработана вне очереди. Поле «Urgent Pointer» определяет конец срочных данных. Используется редко (например, в Telnet для прерывания команды).

Расположение флагов в заголовке TCP

Флаги занимают биты 107–112 (если считать с 0) в заголовке TCP. Вот как это выглядит в структуре данных и при анализе (например, в Wireshark или tcpdump):

// Структура заголовка TCP (упрощённо)
struct tcphdr {
    uint16_t source;      // Порт отправителя
    uint16_t dest;        // Порт получателя
    uint32_t seq;         // Порядковый номер
    uint32_t ack_seq;     // Номер подтверждения
    uint8_t  res1:4;      // Зарезервировано
    uint8_t  doff:4;      // Длина заголовка в 32-битных словах
    uint8_t  flags;       // Поле флагов (биты: URG|ACK|PSH|RST|SYN|FIN)
    uint16_t window;      // Размер окна
    uint16_t check;       // Контрольная сумма
    uint16_t urg_ptr;     // Указатель на срочные данные (если URG=1)
};

Практическое использование флагов

  • Установление соединения (3-way handshake):
    *   Клиент → Сервер: `SYN=1, ACK=0, seq=X`
    *   Сервер → Клиент: `SYN=1, ACK=1, seq=Y, ack_seq=X+1`
    *   Клиент → Сервер: `SYN=0, ACK=1, seq=X+1, ack_seq=Y+1`

  • Корректное завершение соединения (4-way handshake):
    *   Сторона 1 → Сторона 2: `FIN=1, ACK=1`
    *   Сторона 2 → Сторона 1: `ACK=1` (подтверждение FIN)
    *   (позже) Сторона 2 → Сторона 1: `FIN=1, ACK=1`
    *   Сторона 1 → Сторона 2: `ACK=1`

  • Сброс соединения: Например, при попытке подключиться к закрытому порту сервер ответит: RST=1, ACK=1.

Анализ флагов в DevOps-практике

В работе DevOps-инженера анализ флагов TCP критически важен для:

  • Диагностики сетевых проблем: Неустановленные соединения (SYN без SYN-ACK), массовые RST-пакеты указывают на проблемы с фаерволом, неработающий сервис или проблемы с маршрутизацией.
  • Настройки безопасности: Правила iptables/nftables часто фильтруют пакеты по флагам (например, блокировка SYN-флуда).
  • Мониторинга производительности: Высокое число повторных передач (пакеты с одинаковым seq и установленным ACK) может указывать на потерю пакетов.
  • Оптимизации приложений: Понимание PSH помогает настраивать буферизацию сокетов для снижения задержек.

Пример анализа с помощью tcpdump:

# Отслеживание установления соединения на порт 80
sudo tcpdump -nn -t 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'

# Поиск RST-пакетов (возможные проблемы)
sudo tcpdump -nn 'tcp[tcpflags] & tcp-rst != 0'

Важные нюансы

  • Флаги могут комбинироваться. Например, SYN+ACK или FIN+ACK — это стандартные комбинации.
  • Флаг ECE (ECN-Echo) и CWR (Congestion Window Reduced) — это расширенные флаги, введённые для поддержки явного уведомления о перегрузке (ECN), но они не входят в классическую шестёрку.
  • Поведение флагов в разных ОС: Например, отправка RST вместо FIN при закрытии сокета с непрочитанными данными может зависеть от реализации стека TCP.

Понимание флагов TCP — обязательный навык для глубокой диагностики сетевых взаимодействий, будь то проблемы с подключением в микросервисной архитектуре, настройка балансировщиков нагрузки или анализ дампов трафика сложных инцидентов. Это основа для работы с такими инструментами, как tcpdump, Wireshark, ss, а также для настройки сетевых политик в Kubernetes (Network Policies) и облачных фаерволов.