Кратко

  • TLS 1.3 разрешает клиенту с данными возобновления отправить приложение вместе с ClientHello, сэкономив один-два сетевых обмена. Шифрование сохраняется, но гарантии от воспроизведения между соединениями нет.
  • RFC 8470 распределяет знания: посредники переносят Early-Data: 1, источник знает последствия ресурса, а 425 отказывает в раннем выполнении отдельного рискованного запроса.
  • Пользовательский агент должен повторить запрос автоматически, но повтор не может снова быть early data. Метод, цель и тело сохраняются; меняется криптографическое время. HTTP/3 оставил тот же контракт поверх QUIC.

Ускорение вышло раньше нового ответа сервера

Обычный HTTP ждёт TLS-рукопожатия. Обе стороны дают свежие значения, из них получаются ключи конкретного соединения, и только затем идут данные приложения. На длинном пути последовательность стоит времени.

TLS 1.3 позволяет обладателю PSK и билета прошлой сессии отправить приложение рядом с ClientHello. Запрос не ждёт нового ServerHello и экономит один-два RTT.

RFC 8446 точно описывает цену. Данные 0-RTT зашифрованы, но не обладают прямой секретностью и не гарантированы от межсоединительного replay. Они ушли до новой случайности сервера и не могут зависеть от неё как обычные данные 1-RTT.

Это не отсутствие криптографии. Злоумышленник не может свободно изменить аутентифицированные байты, удвоить их внутри одного соединения или превратить в 1-RTT. Риск — предъявить весь ранний полёт другому соединению, которое ещё принимает то же состояние возобновления.

Replay и retry могут сложиться

Повторная попытка известна клиенту: ответ потерян, канал оборван, пользователь повторил действие. Replay создаётся без его ведома. В распределённой службе они могут привести к одному двойному эффекту.

Зона A принимает копию и действует. Зона B не разделяет тот же журнал, отвергает 0-RTT, но завершает рукопожатие. Если ответ A скрыт, клиент законно повторяет на B. Одна операция произошла из-за воспроизведения и ещё раз из-за восстановления.

Одноразовые билеты, запись ClientHello, короткие окна и одна авторитетная зона билета уменьшают прямое воспроизведение. Они требуют согласованности между узлами, регионами и перезапусками. Но TLS всё равно не знает, читает ли сообщение картинку или расходует одноразовое право.

Имя метода не описывает весь ресурс

Безопасные и идемпотентные методы полезны как первая подсказка. Они не доказывают поведение реализации. GET способен израсходовать подписанную ссылку, запустить тарифицируемый расчёт, изменить кэш или создать значимый аудит. Запись с транзакционным ключом, напротив, может распознать повтор.

RFC 8470 делает переносимость replay свойством ресурса. Клиент знает свою спекуляцию, TLS — фазу, шлюз — путь, источник — последствия. Поэтому библиотека TLS не должна сама включать 0-RTT или автоматически пересылать отвергнутые данные.

Три способа сохранить границу

Сервер может отвергнуть весь early data в TLS. Граница проста, но преимущество теряют все запросы полёта: TLS не выбирает отдельную HTTP-команду.

Он может принять доставку и отложить обработку. Разобрать заголовки и выбрать маршрут допустимо, пока не начинается эффект. Мультиплексированные запросы могут ждать по-разному.

Или источник отвечает 425 Too Early одному запросу. Явно разрешённые ресурсы сохраняют быстрый путь, чувствительная операция возвращается клиенту. Оптимизация становится отзывной по ресурсу.

История должна дойти через посредников

Источник часто находится за CDN, прокси и шлюзом. Его непосредственное соединение завершено, хотя первый hop получил запрос рано.

У поля Early-Data только одно правильное значение — 1. Посредник, пересылающий до окончания клиентского рукопожатия, добавляет его; получивший не удаляет. Возможная прежняя пересылка другой копией также сохраняет отметку.

Это происхождение риска, а не просьба об ускорении. Ожидание на следующем hop не стирает возможную копию на предыдущем. Источник, который не может безопасно выполнить отмеченный запрос, возвращает 425 даже по обычному соединению.

Несколько или неверные экземпляры считаются тем же консервативным битом. Поле не предназначено для ответов, trailer и Connection. Синтаксическая путаница не должна очищать историю.

Повтор меняет момент, а не операцию

Получив 425 на раннюю отправку, агент должен автоматически повторить. Новый запрос запрещено снова посылать как early data. Клиент ждёт рукопожатия и использует обычные данные приложения.

URI, метод, тело и намерение могут остаться. Это не redirect. Это не 421: соединение может быть авторитетным для источника; не 429: квоты нет; не 503: служба здорова; не 100 Continue: решение не о передаче тела.

Без ранних данных или Early-Data: 1 серверу не следует применять 425: обычный клиент может не знать специального восстановления. Ответ по умолчанию не кэшируется и не является представлением ресурса. Реестр IANA называет 425 именно Too Early.

Посредник исправляет только собственное начало

Если запрос уже пришёл отмеченным, посредник обязан переслать 425. Экспозиция началась выше и не исчезает из-за нового нижнего соединения.

Если именно текущий посредник первым принял неотмеченный запрос как early data, он может дождаться клиентского рукопожатия и повторить к источнику. Он знает начало истории и действительно переносит запрос за него.

Шлюз не должен передавать early request источнику, чья поддержка RFC 8470 неизвестна. Он ждёт или сам выдаёт 425. Пограничная система не уполномочена принимать риск приложения от его имени.

Важно начало эффекта, а не последний байт

Заголовки могут прийти рано, тело — поздно. QUIC способен доставить ранний stream после завершения рукопожатия. Время доставки не меняет происхождение.

Нужно измерять момент действия. Анализ и маршрутизация могут быть нейтральны; запись, расход токена, внешний вызов или очередь — нет. Все экземпляры, принимающие тот же билет, должны соблюдать инвариант «никакого эффекта до завершения», даже выбирая разные способы защиты.

Перезапущенный узел не помнит прошлые повторы. Пока окно записи пересекает слепой период, ему следует отказывать 0-RTT. Локальная забывчивость не расширяет полномочия запроса.

HTTP/3 добавил отдельную память SETTINGS

RFC 9114 применяет RFC 8470 к QUIC 0-RTT. Ранний клиент также опирается на SETTINGS прошлой сессии, ещё не видя новых.

Сервер отвергает 0-RTT, если не может доказать совместимость. После принятия он не вправе объявить меньшие пределы, нарушающие уже отправленные данные. Совместимость SETTINGS защищает протокол, а 425 — последствия ресурса. Это разные проверки.

Источники и предел доказательств

Закрытый набор включает TLS 1.3, RFC 8446, Using Early Data in HTTP, RFC 8470, HTTP/3, RFC 9114 и текущий реестр кодов HTTP IANA. Они доказывают спецификацию и границы, но не нынешнюю долю внедрения, всеобщую поддержку, конкретный инцидент, измеренную экономию или exactly-once.