Народный

Сеть

TCP Fast Open — TFO (RFC 7413)

Расширение TCP, позволяющее слать payload вместе с SYN-пакетом при повторном соединении. Экономит 1 RTT на каждом handshake. Используется в Shadowsocks, OpenVPN-TCP, Mihomo для ускорения VPN.

Определение

TCP Fast Open (TFO) — расширение TCP, стандартизованное в RFC 7413 (2014), позволяющее клиенту посылать payload данных вместе с SYN-пакетом при повторном соединении к серверу. Стандартный TCP требует 3-way handshake (SYN → SYN-ACK → ACK) прежде чем можно отправить данные, что добавляет 1 RTT задержки. TFO эту задержку устраняет на repeat-сессии за счёт cookie, выданного сервером при первом соединении.

В VPN-контексте TFO ускоряет TCP-based туннели (Shadowsocks, OpenVPN-TCP, ShadowTLS) на 1 RTT каждый handshake — что заметно на мобильных сетях, где RTT 50-150ms.

Как работает

Первое соединение (cold start):

  1. Клиент шлёт SYN со специальным extension TCP Fast Open Cookie Request.
  2. Сервер выдаёт cookie (8 байт) в SYN-ACK extension.
  3. Клиент сохраняет cookie для будущих соединений к этому IP+port.

Повторное соединение:

  1. Клиент шлёт SYN с TCP Fast Open Cookie (тот же 8-байт) + payload (HTTP request, OpenVPN handshake-init, что угодно).
  2. Сервер проверяет cookie — если валиден, начинает обрабатывать payload, не дожидаясь финального ACK.
  3. Клиент получает SYN-ACK + ответ за тот же RTT.

Итог: 1 RTT сэкономлено.

TFO и обход цензуры

  • Замаскировать VPN труднее с TFO: SYN-пакет с payload — нестандартная картина для большинства веб-трафика. ТСПУ может фингерпринтить VPN по «TFO с большим payload в SYN».
  • На практике: ТСПУ TFO не блокирует, но косвенно — IP мобильных операторов часто stripping’уют TFO option на NAT-середине. То есть TFO не работает 30-50% случаев в РФ-mobile.
  • Wi-Fi домохозяйства: TFO работает (Ростелеком, ЭР-Телеком пропускают option).

Какие протоколы используют

  • Shadowsocks-2022 (sing-box, mihomo): опция tcp_fast_open: true в outbound/inbound.
  • OpenVPN 2.6+ TCP: поддерживает (--fast-io + --socket-flags TCP_NODELAY).
  • ShadowTLS: TFO опционален.
  • WireGuard: использует UDP, TFO неприменим.
  • QUIC / Hysteria 2: UDP-based, TFO неприменим. У QUIC есть своё 0-RTT (RFC 9001 §4.6), функционально аналогичное.

Linux настройки

# Включить TFO для исходящих (клиент)
sudo sysctl -w net.ipv4.tcp_fastopen=1

# Включить для входящих (сервер)
sudo sysctl -w net.ipv4.tcp_fastopen=2

# И клиент, и сервер
sudo sysctl -w net.ipv4.tcp_fastopen=3

В sing-box config:

inbounds:
  - type: shadowsocks
    tcp_fast_open: true
outbounds:
  - type: shadowsocks
    tcp_fast_open: true

TFO и безопасность

В 2014 году исследователи отмечали, что TFO открывает поверхность для:

  • Resource exhaustion attacks: cookie-validation требует CPU, можно DDoS’ить через массовый TFO.
  • Cookie hijacking: если злоумышленник перехватил cookie (например, в Wi-Fi-кафе), он может посылать SYN с payload от имени клиента.

Linux mitigation: net.ipv4.tcp_fastopen_blackhole_timeout_sec — автоматически отключает TFO к проблемным destination’ам.

TFO vs 0-RTT QUIC

QUIC встроенный 0-RTT функционально эквивалентен TFO, но:

  • TFO — на транспортном уровне TCP, шифрования не имеет.
  • QUIC 0-RTT — внутри QUIC handshake, payload шифрован эфемерным ключом.
  • TFO не защищает от replay-атак на payload (нужно application-уровень).
  • QUIC 0-RTT защищает от replay только если application-protocol помечает request как idempotent.

В современных VPN-стэках QUIC-based протоколы вытесняют TCP+TFO, кроме там, где UDP блокируется.

Источники

  • RFC 7413 — TCP Fast Open.
  • Cheng, Chu, Radhakrishnan, Jain — Google paper «TCP Fast Open» (2011).

Связанные термины

  • MTU/PMTU — другой параметр TCP-производительности.
  • Shadowsocks-2022 — основной потребитель TFO.
  • OpenVPN — поддерживает TFO в TCP-mode.
  • QUIC — альтернатива с 0-RTT.
  • WireGuard — UDP-based, TFO неприменим.