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, часть — нет).