Сеть
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):
- Клиент шлёт SYN со специальным extension
TCP Fast Open Cookie Request. - Сервер выдаёт cookie (8 байт) в SYN-ACK extension.
- Клиент сохраняет cookie для будущих соединений к этому IP+port.
Повторное соединение:
- Клиент шлёт SYN с
TCP Fast Open Cookie(тот же 8-байт) + payload (HTTP request, OpenVPN handshake-init, что угодно). - Сервер проверяет cookie — если валиден, начинает обрабатывать payload, не дожидаясь финального ACK.
- Клиент получает 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 неприменим.