Компания Cloudflare открыла исходный код tokio-quiche — асинхронной библиотеки Rust для QUIC и HTTP/3, которая объединяет проверенную в бою реализацию quiche с системой Tokio. Библиотека была усовершенствована в производственных системах, таких как Apple iCloud Private Relay, прокси на основе Oxy нового поколения и клиент WARP MASQUE, где она обрабатывает миллионы запросов HTTP/3 в секунду с низкой задержкой и высокой пропускной способностью.
Для кого предназначена tokio-quiche?
Библиотека предназначена для команд, работающих с Rust, которые хотят использовать QUIC и HTTP/3 без написания собственного кода интеграции UDP и event loop.
От quiche к tokio-quiche
quiche — это реализация QUIC и HTTP/3 от Cloudflare, написанная на Rust и разработанная как низкоуровневая библиотека без ввода-вывода (sans-io). Она реализует транспортную конечную машину QUIC, включая установление соединения, управление потоком и мультиплексирование потоков, не предполагая, как приложения выполняют ввод-вывод.
Чтобы использовать quiche напрямую, интеграторы должны открывать UDP-сокеты, отправлять и получать датаграммы, управлять таймерами и передавать все данные пакетов в quiche в правильном порядке. Такая конструкция обеспечивает гибкость, но усложняет интеграцию и требует много времени.
tokio-quiche объединяет эту работу интеграции в многократно используемый модуль. Он сочетает реализацию QUIC или HTTP/3 без ввода-вывода из quiche с асинхронной средой выполнения Tokio и предоставляет API, который уже управляет UDP-сокетами, маршрутизацией пакетов и вызовами в конечную машину quiche.
Архитектура на основе акторов в Tokio
Внутри tokio-quiche использует модель акторов поверх Tokio. Акторы — это небольшие задачи с локальным состоянием, которые взаимодействуют через передачу сообщений по каналам, что хорошо согласуется с реализациями протоколов без ввода-вывода, которые владеют внутренним состоянием и работают с буферами сообщений, подобными сообщениям.
Основным актором является актор цикла ввода-вывода (IO loop actor), который перемещает пакеты между quiche и UDP-сокетом. Одним из ключевых типов сообщений является структура Incoming, которая описывает полученные UDP-пакеты. Асинхронная интеграция следует фиксированному шаблону: цикл ввода-вывода ожидает новых сообщений, переводит их во входные данные для quiche, продвигает конечную машину QUIC, затем переводит выходные данные в исходящие пакеты, которые записываются обратно в сокет.
Для каждого UDP-сокета tokio-quiche запускает две важные задачи:
* InboundPacketRouter владеет принимающей половиной сокета и направляет входящие датаграммы по идентификатору соединения в каналы для каждого соединения.
* IoWorker — это цикл ввода-вывода для каждого соединения и управляет одним соединением quiche, чередуя вызовы в quiche с вызовами логики, специфичной для приложения, реализованной через ApplicationOverQuic.
Такая конструкция инкапсулирует состояние соединения внутри каждого актора и обеспечивает изоляцию обработки QUIC от кода протокола более высокого уровня.
ApplicationOverQuic и H3Driver
QUIC — это транспортный протокол, который может передавать несколько прикладных протоколов. HTTP/3, DNS over QUIC и Media over QUIC — примеры, охватываемые спецификациями IETF. Чтобы избежать привязки tokio-quiche к одному протоколу, команда Cloudflare предоставляет признак ApplicationOverQuic. Этот признак абстрагирует методы quiche и базовый ввод-вывод, а также представляет события более высокого уровня и хуки для приложения, реализующего протокол.
На основе этого признака tokio-quiche поставляется с выделенной реализацией, ориентированной на HTTP/3, под названием H3Driver. H3Driver подключает модуль HTTP/3 quiche к актору цикла ввода-вывода и преобразует необработанные события HTTP/3 в события более высокого уровня с асинхронными потоками данных, удобными для кода приложения.
Использование в производственных условиях и дорожная карта
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, VPN на основе MASQUE и другие приложения QUIC.
Ключевые выводы:
* tokio-quiche = quiche + Tokio: tokio-quiche — это асинхронная библиотека Rust, которая объединяет реализацию quiche от Cloudflare с системой Tokio, поэтому разработчикам не нужно вручную писать код для UDP и event loop.
* Архитектура на основе акторов для QUIC-соединений: библиотека использует модель акторов на Tokio, с InboundPacketRouter, который маршрутизирует UDP-датаграммы по идентификатору соединения, и IoWorker, который управляет одним соединением quiche на задачу, сохраняя состояние транспорта изолированным и компонуемым.
* Абстракция ApplicationOverQuic: логика протокола разделена с помощью признака ApplicationOverQuic, который абстрагирует детали quiche и I/O, чтобы различные протоколы на основе QUIC, такие как HTTP/3, DNS over QUIC или пользовательские протоколы, могли быть реализованы поверх одного и того же транспортного ядра.
* HTTP/3 через H3Driver, ServerH3Driver и ClientH3Driver: tokio-quiche поставляется с H3Driver, а также вариантами ServerH3Driver и ClientH3Driver, которые подключают модуль HTTP/3 quiche к асинхронному коду Rust, предоставляя потоки и тела HTTP/3 в форме, соответствующей типичным службам на основе Tokio.
1. Какие проблемы решает библиотека tokio-quiche для разработчиков, работающих с Rust?
Tokio-quiche упрощает работу с QUIC и HTTP/3 для разработчиков на Rust, объединяя реализацию quiche от Cloudflare с системой Tokio. Это позволяет разработчикам избежать необходимости вручную писать код для UDP и event loop, что упрощает интеграцию QUIC и HTTP/3 в их приложения.
2. Какие основные компоненты включает в себя архитектура tokio-quiche?
Основные компоненты архитектуры tokio-quiche включают:
* InboundPacketRouter — компонент, который маршрутизирует UDP-датаграммы по идентификатору соединения;
* IoWorker — цикл ввода-вывода для каждого соединения, который управляет одним соединением quiche;
* ApplicationOverQuic — признак, который абстрагирует методы quiche и базовый ввод-вывод, а также представляет события более высокого уровня и хуки для приложения, реализующего протокол;
* H3Driver — выделенная реализация, ориентированная на HTTP/3, которая подключает модуль HTTP/3 quiche к актору цикла ввода-вывода.
3. Какие примеры использования tokio-quiche приведены в статье?
В статье приведены следующие примеры использования tokio-quiche:
* поддержка Proxy B в Apple iCloud Private Relay;
* использование в HTTP/3-серверах на основе Oxy;
* применение в клиенте WARP MASQUE;
* асинхронная версия h3i.
4. Какие ключевые выводы можно сделать из статьи о tokio-quiche?
Ключевые выводы из статьи о tokio-quiche:
* tokio-quiche объединяет реализацию quiche от Cloudflare с системой Tokio, предоставляя разработчикам асинхронную библиотеку Rust для работы с QUIC и HTTP/3;
* архитектура на основе акторов в Tokio обеспечивает эффективную обработку QUIC-соединений;
* признак ApplicationOverQuic позволяет абстрагировать логику протокола, что упрощает реализацию различных протоколов на основе QUIC;
* H3Driver и другие компоненты tokio-quiche предоставляют удобные инструменты для работы с HTTP/3 в асинхронном коде Rust.
5. Какие перспективы развития tokio-quiche обозначены в статье?
В статье указано, что Cloudflare позиционирует tokio-quiche как основу, а не как полноценный фреймворк HTTP/3. Библиотека предоставляет низкоуровневые возможности протокола и примеры клиентских и серверных циклов событий, оставляя место для проектов более высокого уровня, которые могут реализовать HTTP-серверы, клиенты DNS over QUIC, VPN на основе MASQUE и другие приложения QUIC.