TCP Fast Open (TFO — ускоренное открытие TCP)

⌘K

TCP Fast Open (TFO — ускоренное открытие TCP)

TCP Fast Open позволяет отправить первые байты данных уже в SYN и тем самым убрать один RTT из классического трёхстороннего рукопожатия. Работает за счёт небольшого cookie, которое сервер выдаёт клиенту и по которому в следующий раз доверяет «ранним» данным.

Как это устроено (по-человечески):

  • При первом подключении клиент запрашивает у сервера TFO-cookie (сервер присылает его в SYN-ACK). Данные ещё не ускоряются.
  • При повторном подключении клиент кладёт cookie в SYN и сразу добавляет ранние данные (например, HTTP-запрос).
  • Сервер проверяет cookie и начинает обрабатывать ранние данные до завершения рукопожатия. Если что-то не нравится (cookie не валиден/сеть режет SYN-data) — происходит обычный TCP-фоллбэк.

Когда это реально помогает

  • Короткие запросы и чаткие API, где основная работа — это один GET/HEAD/небольшой POST.
  • Высокий RTT (между регионами/мобильные сети): минус один RTT заметно ускоряет первую страницу/запрос.
  • Повторные подключения к тому же хосту (cookie привязан к серверу/его секрету).

Про безопасность и ограничения

  • Без шифрования TFO не добавляет криптозащиты — это оптимизация TCP, не TLS.
  • Реплей-риск: ранние данные могут быть переотправлены (редко, но по модели угроз надо учитывать). Поэтому «раннее» стоит ограничивать идемпотентными действиями (GET, метаданные), а не логинами/платежами.
  • Промежуточные устройства иногда режут SYN с данными — стек откатится к обычному подключению, но ускорения не будет.
  • Балансировка: cookie должно приниматься на всех бэкендах (общий секрет/консистентный хеш), иначе часть ранних запросов уйдёт в фоллбэк.

Связь с TLS 1.3 0-RTT

  • TFO сокращает время на TCP, а TLS 1.3 0-RTT — на TLS (свой собственный реплей-риск). Эти механики независимы и могут работать вместе либо по отдельности.

Как включают на практике (обобщённо)

  • Linux (ядро/стек): включают TFO глобально и/или для приложения (опция сокета
    TCP_FASTOPEN
    ). Часто достаточно задать значение, эквивалентное «клиент+сервер», и перезапустить сервис.
  • Серверы/прокси: популярные демоны (например, HTTP-серверы и L4-прокси) умеют включать TFO в конфиге и задавать очередь ранних соединений.
  • Клиенты/библиотеки: если ОС и приложение поддерживают TFO, оно используется прозрачно при повторных коннектах к тому же хосту.

Практические советы

  • Разрешайте ранние данные только для идемпотентных операций; для всего «чувствительного» — требуйте обычный путь после установления соединения.
  • Проверьте маршрут: фаерволы/NAT/IPS должны пропускать SYN-data; при проблемах убедитесь, что происходит фоллбэк без ошибок.
  • На балансировщиках используйте общий секрет TFO-cookie или липкость, чтобы не терять ускорение.
  • Мерьте фактическую пользу: сравните TTFB и общее время запроса для «холодного» и «тёплого» коннекта под реальной задержкой (эмулируйте
    tc netem
    ).

Типичные симптомы несовместимости

  • Соединение устанавливается, но ускорения нет (в логах сервера видно, что ранние данные приходят уже после рукопожатия).
  • Редкие RST/повторные SYN в сетевых трейсах на участках с «строгими» middlebox’ами.
  • Неравномерный эффект за балансировщиком (часть бэкендов принимает cookie, часть — нет).

Немного экономии прямо здесь

Планируете VPS на 12 месяцев? Примените NEWCOM — получите +1 бесплатно.

Месяц в подарок
COPIED
NEWCOM COPIED