0-RTT

0-RTT (Zero Round-Trip Time) — фича TLS 1.3 и QUIC, которая позволяет клиенту отправить прикладные данные сразу в первом пакете, не дожидаясь ответа сервера. Экономия — целый RTT (обычно 50-300 мс).

Как это возможно

Работает только для повторных подключений к серверу, с которым уже была сессия:

  1. Первое подключение: обычный TLS 1.3 handshake (1-RTT). В конце сервер отдаёт Session Ticket / PSK — «в следующий раз можешь использовать это».
  2. Клиент кэширует ticket.
  3. Следующее подключение: клиент шлёт ClientHello + прикладные данные (Early Data) уже зашифрованные ключом из ticket в одном пакете.
  4. Сервер видит ticket, извлекает ключ, дешифрует Early Data, начинает обрабатывать сразу.
Обычный 1-RTT:
Client → SYN
       ← SYN/ACK
Client → ACK + ClientHello
       ← ServerHello + Cert + Finished
Client → Finished + GET /
       ← 200 OK   (2 RTT до данных)

0-RTT:
Client → ClientHello + Early Data (GET /)
       ← ServerHello + Finished + 200 OK   (1 RTT до данных)

QUIC 0-RTT:
Client → Initial + Early Data (GET /)   ← сразу первый пакет
       ← Handshake + Finished + 200 OK   (0 RTT!)

Compromise: replay-атаки

Главная проблема: атакующий может записать 0-RTT пакет и переиграть его позже. Ключ ticket-а тот же, сервер примет. Значит если 0-RTT запрос был POST /transfer money — атака переведёт деньги дважды.

Что делать

Как реализовано

Криптографические тонкости

Числа

HandshakeRound-trips до данных
TLS 1.22 RTT
TLS 1.31 RTT
TLS 1.3 resumption1 RTT
TLS 1.3 0-RTT0 RTT (только с ticket)
QUIC first connection1 RTT (совмещён TCP+TLS)
QUIC resumption 0-RTT0 RTT

См. также