Кратко

  • RFC 7413 позволяет клиенту с ранее полученным серверным cookie отправить данные приложения в SYN, а серверу — передать их приложению до завершения трёхэтапного рукопожатия.
  • Можно сэкономить до одного RTT, но данные SYN способны попасть в приложение повторно; операция, которая не переносит дубликат, не должна использовать этот режим.
  • Быстрый путь требует управляемой смены ключей, лимита неподтверждённых запросов, отрицательной памяти по маршрутам и проверенного возврата к обычному TCP.

В обычном TCP первый пакет прежде всего просит начать соединение. TCP Fast Open разрешает вложить в него и первый запрос приложения. Если сервер узнаёт cookie, он может отдать данные приложению до получения третьего пакета рукопожатия. Сеть не стала короче — изменилась последовательность ожидания.

RFC 7413 была опубликована в декабре 2014 года как экспериментальная спецификация, а не стандарт Internet Standards Track. Документ не подтверждает современное развёртывание или одинаковый выигрыш на всех путях. Он описывает условную возможность: у клиента уже есть cookie, первая единица данных помещается в начальный сегмент, а промежуточное оборудование пропускает SYN с полезной нагрузкой. Тогда ожидание может сократиться максимум на один RTT.

При первом соединении клиент отправляет пустую опцию Fast Open и просит cookie. Сервер возвращает в SYN-ACK непрозрачную аутентификационную метку, которую клиент сохраняет. В следующий раз SYN содержит cookie и данные. Успешно проверив cookie, сервер подтверждает SYN и данные, передаёт запрос приложению и может ответить до завершения рукопожатия. При неудаче он отбрасывает ранние данные, подтверждает только SYN и продолжает обычный обмен.

Cookie доказывает прежнюю достижимость адреса источника, но не личность пользователя и не право на операцию. RFC задаёт длину от 4 до 16 байт и обычно предполагает MAC, связанный с исходным IP-адресом. Клиент не разбирает содержимое. Сервер управляет созданием, проверкой и истечением. Смена ключа делает старые cookie недействительными; ограниченное одновременное принятие старого и нового ключа смягчает переход. Поэтому ротация ключей влияет и на доступность.

Главная семантическая цена — повтор. Трёхэтапное рукопожатие помогает TCP отличить новое соединение от старого или продублированного SYN. Fast Open отдаёт данные раньше этой границы, и после утраты исходного состояния первый блок иногда может быть доставлен снова. Поэтому TFO запрещено включать по умолчанию: приложение должно явно запросить его для конкретного сервисного порта.

Идемпотентность становится условием транспортной оптимизации. Чтение часто можно повторить. Создание объекта, списание средств или незащищённый POST не должны считать одну доставку гарантией одного выполнения. Идентификатор транзакции на уровне приложения способен обнаружить дубликат, но Fast Open cookie не даёт exactly-once. Ранние байты не означают раннюю определённость.

Сервер раньше несёт и стоимость. До полного подтверждения адреса он может расходовать процессор, память и формировать ответ. RFC 7413 вводит счётчик ожидающих запросов Fast Open и требует отключить быстрый режим для новых соединений после превышения системного лимита. Ранние данные отбрасываются, и управление возвращается обычному TCP. Cookie должен работать вместе с пределом ресурсов.

Промежуточный путь сохраняет фактическое право отказа. Некоторые межсетевые экраны и middlebox-устройства удаляют SYN с данными или незнакомыми опциями. После срабатывания таймера клиент должен повторить SYN без данных и Fast Open. Отсутствие подтверждения ранних данных, ICMP-ошибка или полное отсутствие SYN-ACK — отрицательные результаты, которые надо кэшировать. Для соответствующей пары адресов и портов TFO рекомендуется временно отключить.

Без отрицательной памяти каждое новое соединение сначала платит один и тот же тайм-аут. Слишком долгий срок превращает временный сбой в постоянную блокировку. Оператору нужны правила повторной проверки и различения устойчивой несовместимости от обычной потери пакетов.

Полный выигрыш возможен, только если первая единица приложения помещается в свободное место начального сегмента. Опции TCP занимают часть пространства, а сохранённый MSS ограничивает объём. Когда оставшиеся данные приходят после рукопожатия, преимущество уменьшается. Повторное использование установленного соединения остаётся полезным; избыток коротких соединений может завершаться раньше, чем контроль перегрузки проявит себя.

Историческое значение TCP Fast Open — в явном учёте задержки. Сэкономленный RTT создаёт новое состояние: какие адреса были достижимы, какие cookie действуют, какие операции переносят повтор, сколько неподтверждённой работы допустимо и на каких путях эксперимент нужно прекратить. Ранний запрос становится действительно быстрым только тогда, когда это состояние наблюдаемо, ограничено и обратимо.

Sources