awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

Объединённое рукопожатие и 1-RTT

Суть QUIC объединяет транспорт и TLS в один обмен — клиент отправляет TLS ClientHello в первом пакете, и данные приложения текут уже после одного RTT.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 12 min

TCP завершает своё рукопожатие. Потом TLS начинает своё. Это отдельные протоколы с отдельными RTT. Каждое новое соединение платит двойную пошлину. QUIC отказывается принимать это — он проводит оба рукопожатия в одном обмене пакетами.

Объединённое рукопожатие

QUIC устраняет отдельный уровень транспортного рукопожатия. Вместо TCP SYN/SYN-ACK (1 RTT), а затем TLS ClientHello/ServerHello (ещё RTT), QUIC переносит TLS-рукопожатие внутри CRYPTO-фреймов, путешествующих в QUIC-пакетах.

Последовательность:

  1. Клиент отправляет Initial-пакет с CRYPTO-фреймом, содержащим TLS ClientHello.
  2. Сервер отвечает собственным Initial-пакетом с CRYPTO-фреймом ServerHello + EncryptedExtensions + Certificate + CertificateVerify — всё в одном пакете.
  3. Клиент отправляет Handshake-пакет с CRYPTO-фреймом Finished.
  4. Обе стороны переходят в состояние 1-RTT. Клиент может отправлять данные потока сразу после завершения шага 1.

Результат: 1 RTT от старта клиента до получения ответа сервера, против 2 RTT у TCP+TLS.

Последовательность пакетов рукопожатия QUIC
КлиентСерверInitial [CRYPTO: ClientHello] + Padding
КлиентСерверInitial [CRYPTO: ServerHello + EE + Cert + CertVerify]
КлиентСерверHandshake [CRYPTO: Finished]
КлиентСерверHandshake [CRYPTO: Finished] + 1-RTT [STREAM data]
Итого: 1 RTT до того, как клиент может отправить данные потока. TCP+TLS = 2 RTT.

Четыре уровня шифрования

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

  1. Initial — детерминированно выводится из Connection ID назначения. Обе стороны могут вычислить эти ключи до обмена материалом, поэтому Initial-пакет может быть зашифрован немедленно.
  2. 0-RTT — выводится из сессионного тикета, кешированного из предыдущего соединения. Позволяет клиенту отправлять данные приложения в ClientHello без ожидания ответа сервера.
  3. Handshake — выводится из общих секретов после обмена ClientHello-ServerHello. Используется для сообщений Finished.
  4. 1-RTT — финальные постхендшейковые ключи. Все последующие данные потоков используют их.

Три пространства номеров пакетов

Четыре уровня шифрования отображаются на три пространства номеров пакетов:

  • Initial/Handshake — каждое имеет собственную последовательность номеров пакетов (0, 1, 2, …).
  • Application Data — 0-RTT и 1-RTT разделяют одно пространство.

Разделение критично: обнаружение потерь независимо для каждого пространства. Потерянный Initial-пакет запускает PTO только в пространстве Initial — он не уменьшает окно перегрузки для 1-RTT-данных.

Викторина

Почему в QUIC разные пространства номеров пакетов для Initial/Handshake и 1-RTT?

Проследи
1/4

Трассируйте QUIC-соединение от инициации клиента до первых данных потока.

1
Step 1 of 4
Клиент отправляет Initial-пакет с ClientHello в CRYPTO-фрейме. Какой ключ шифрования он использует?
2
Locked
Сервер получает Initial-пакет. Что он отвечает?
3
Locked
Клиент получает Initial сервера. В каком состоянии находится клиент?
4
Locked
Клиент отправляет первые данные потока в 1-RTT-пакете. Сколько RTT прошло с Initial?
Расставь шаги по порядку

Расставьте типы пакетов в QUIC-рукопожатии от начала до завершения:

  1. 1 Клиент отправляет Initial-пакет с ClientHello
  2. 2 Сервер отправляет Initial-пакет с ServerHello + EncryptedExtensions + Certificate + CertificateVerify
  3. 3 Сервер отправляет Handshake-пакет с Finished
  4. 4 Клиент отправляет Handshake-пакет с Finished
  5. 5 Обе стороны переходят в состояние 1-RTT и могут отправлять пакеты Short Header с данными потока
Почему это работает

Initial-пакет QUIC использует детерминированные ключи, выведенные из Connection ID — кажущийся парадоксальным выбор. Зачем шифровать, если обе стороны могут вычислить ключ? Цель — не секретность на этом этапе, а целостность: шифрование Initial мешает пассивным наблюдателям тривиально подменить ClientHello. Ключи Handshake и 1-RTT, выведенные из материала DH-обмена, обеспечивают реальную конфиденциальность.

Задержка рукопожатия QUIC
QUIC новое соединение
1 RTT до первого байта потока
TCP + TLS 1.3 новое соединение
2 RTT до первого байта потока
QUIC возобновление 0-RTT
0 RTT (данные в ClientHello)
Экономия на линии 100 ms
100 ms на новое соединение
Экономия на линии 150 ms (Азия-США)
150 ms на новое соединение
Вспомните перед уходом
  1. 01
    Почему 1-RTT рукопожатие QUIC экономит задержку по сравнению с TCP+TLS, и как выглядят числа на межконтинентальных линиях?
  2. 02
    Каковы четыре уровня шифрования QUIC и для чего каждый используется?
  3. 03
    Почему пространства номеров пакетов разделены по уровням шифрования?
Итог

Рукопожатие QUIC объединяет то, что TCP и TLS держали раздельно: CRYPTO-фрейм внутри QUIC Initial-пакета несёт TLS ClientHello, поэтому транспорт и TLS завершаются за один RTT вместо двух. Сервер отвечает полной цепочкой Certificate в том же пакете, и клиент может отправлять данные потока немедленно. Четыре уровня шифрования (Initial, 0-RTT, Handshake, 1-RTT) отображаются на три пространства номеров пакетов, чтобы обнаружение потерь на каждой фазе не мешало другим. На линии 100 ms это экономит 100 ms на каждое новое соединение — 150 ms на трансокеанских путях. Возобновление 0-RTT идёт дальше: кешированный сессионный тикет позволяет клиенту прикрепить данные приложения к самому ClientHello, достигая нулевых RTT ценой уязвимости к реплей-атакам для неидемпотентных запросов.

Связанные уроки
встречается в162
Продолжить восхождение ↑Connection ID и миграция сети
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.