<НА ГЛАВНУЮ

tokio-quiche Cloudflare: Новые горизонты для QUIC и HTTP/3 в Rust

Узнайте, как tokio-quiche от Cloudflare меняет интеграцию QUIC и HTTP/3 для Rust.

Обзор tokio-quiche

Cloudflare открыла исходный код tokio-quiche — асинхронной библиотеки QUIC и HTTP/3 на Rust, которая оборачивает проверенную реализацию quiche с использованием Tokio. Библиотека была отлажена в производственных системах, таких как Apple iCloud Private Relay, прокси на основе Oxy и WARP's MASQUE client, где она обрабатывает миллионы HTTP/3 запросов в секунду с низкой задержкой и высокой пропускной способностью. tokio-quiche ориентирована на команды Rust, которым нужен QUIC и HTTP/3 без необходимости написания собственного кода для интеграции UDP и цикла событий.

От quiche к tokio-quiche

quiche — это открытая реализация QUIC и HTTP/3 от Cloudflare, написанная на Rust и предназначенная как низкоуровневая библиотека без ввода-вывода. Она реализует машину состояния транспортного протокола QUIC, включая установку соединения, управление потоком и мультиплексирование потоков, не предполагая, как приложения выполняют ввод-вывод. Для прямого использования quiche интеграторам необходимо открывать UDP-сокеты, отправлять и получать датаграммы, управлять таймерами и передавать все данные пакетов в quiche в правильном порядке. Этот подход обеспечивает гибкость, но делает интеграцию подверженной ошибкам и отнимает много времени.

tokio-quiche упаковывает эту интеграционную работу в переиспользуемый крейт. Он сочетает в себе реализацию sans-io QUIC или HTTP/3 от quiche с асинхронной средой Tokio и предлагает API, который управляет UDP-сокетами, маршрутизацией пакетов и взаимодействием с машиной состояния quiche.

Архитектура на основе актора с Tokio

Внутри tokio-quiche используется модель актора на основе Tokio. Акторы представляют собой небольшие задачи с локальным состоянием, которые общаются через обмен сообщениями по каналам, что хорошо согласуется с реализациями протоколов sans-io, которые владеют внутренним состоянием и работают с буферами в виде сообщений.

Основной актер — это IO loop actor, который перемещает пакеты между quiche и UDP-сокетом. Один из ключевых типов сообщений — это структура Incoming, описывающая полученные UDP-пакеты. Асинхронная интеграция следует фиксированной схеме: IO loop ожидает новые сообщения, переводит их в входные данные для quiche, продвигает машину состояния QUIC, а затем переводит выходные данные в исходящие пакеты, которые записываются обратно в сокет.

Для каждого UDP-сокета tokio-quiche создает две важные задачи: InboundPacketRouter, который управляет принимающей частью сокета и маршрутизирует входящие датаграммы по ID соединения, и IoWorker, который выполняет цикл ввода-вывода для отдельного соединения quiche. Этот дизайн инкапсулирует состояние соединения внутри каждого актива и изолирует обработку QUIC от кода более высокого уровня.

ApplicationOverQuic и H3Driver

QUIC — это транспортный протокол, который может переносить несколько прикладных протоколов, таких как HTTP/3, DNS over QUIC и Media over QUIC, описанные в спецификациях IETF. Чтобы избежать связывания tokio-quiche с одним протоколом, команда Cloudflare предлагает интерфейс ApplicationOverQuic. Этот интерфейс абстрагирует методы quiche и детали ввода-вывода, предоставляя более высокоуровневые события и хуки для приложения, реализующего протокол. Например, HTTP/3 отладочный и тестовый клиент h3i использует не HTTP/3 реализацию ApplicationOverQuic.

На основе этого интерфейса tokio-quiche предоставляет специализированную реализацию для HTTP/3, называемую H3Driver, который связывает HTTP/3 модуль quiche с IO loop actor и преобразует сырые события HTTP/3 в более высокоуровневые события с асинхронными потоками тела, удобными для кода приложения. H3Driver универсален и предлагает варианты ServerH3Driver и ClientH3Driver, добавляющие поведение для серверной и клиентской стороны поверх основного драйвера. Эти компоненты предоставляют строительные блоки для HTTP/3 серверов и клиентов, которые схожи с внутренней инфраструктурой Cloudflare.

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

tokio-quiche использовался Cloudflare в течение нескольких лет до его публичного релиза. Он обеспечивает работу Proxy B в Apple iCloud Private Relay, HTTP/3 серверов на основе Oxy, клиента WARP MASQUE и асинхронной версии h3i. В клиенте WARP туннели на основе MASQUE, построенные на tokio-quiche, заменяют предыдущие туннели на основе WireGuard на туннели на основе QUIC. Эти системы работают на масштабах Cloudflare и демонстрируют способность интеграции поддерживать миллионы HTTP/3 запросов в секунду в производственной среде.

Cloudflare рассматривает tokio-quiche как основу, а не как полный фреймворк для HTTP/3. Библиотека предоставляет низкоуровневые возможности протокола и примерные клиентские и серверные циклы событий, оставляя пространство для более высокоуровневых проектов, чтобы реализовать предвзятые HTTP-серверы, DNS over QUIC клиенты, MASQUE-ориентированные VPN и другие приложения на основе QUIC. Выпуская этот крейт, Cloudflare стремится снизить барьер для команд Rust в адаптации QUIC, HTTP/3 и MASQUE и согласовать внешние интеграции с тем же стеком транспортных протоколов, который используется в его сервисах.

Ключевые выводы

  • tokio-quiche = quiche + Tokio: Асинхронная библиотека Rust, интегрирующая sans-io реализацию QUIC и HTTP/3 от Cloudflare с средой Tokio, устранением необходимости в ручном написании кода для UDP и цикла событий.
  • Архитектура на основе актора для QUIC соединений: Использует модель актора на основе Tokio, с InboundPacketRouter для маршрутизации UDP датаграмм и IoWorker, который управляет одиночным соединением quiche на каждую задачу, сохраняя состояние транспорта изолированным и составным.
  • Абстракция ApplicationOverQuic: Логика протокола разделена через интерфейс ApplicationOverQuic, позволяющий реализовывать различные протоколы на основе QUIC на одном транспортном ядре.
  • HTTP/3 через H3Driver, ServerH3Driver и ClientH3Driver: Включает H3Driver и его варианты для связи модуля HTTP/3 quiche с асинхронным кодом Rust, обеспечивая потоки и тела HTTP/3 в удобной форме для типичных сервисов на базе Tokio.
🇬🇧

Switch Language

Read this article in English

Switch to English