Команда JavaScript for Devs подготовила перевод статьи о долгом пути протокола QUIC в Node.js. Четыре года сообщество ждало, пока OpenSSL откроет нужные API — и вот, с выходом версии 3.5, это наконец случилось. Уже в Node.js 25 ожидается первая реализация QUIC — шаг, к которому проект шёл почти полдесятилетия.
QUIC — это транспортный протокол, построенный на основе UDP и призванный заменить связку TCP+TLS.
Хотя его относят к транспортному уровню, на практике он сильно отличается от привычных протоколов вроде TCP или UDP. Значительная часть работы, связанной с обработкой протокола, фактически происходит на уровне приложения.
Интересная ситуация: вроде бы транспортный уровень, но половина логики — в приложении.
Главная причина появления QUIC — повышение производительности.
Когда вы работаете с TCP+TLS, вам приходится проходить несколько стадий рукопожатия: сначала TCP, потом TLS, и только после этого можно начинать передавать данные. В сумме это три обмена (2 для TCP + 1 для TLS).

С QUIC тот же результат достигается всего за один обмен.

А при возобновлении уже установленного соединения — вообще за ноль обменов.

Однако это не значит, что QUIC лишён слабых мест и всегда быстрее. Исследования показывают, что стек QUIC (UDP + QUIC + HTTP/3) может быть до 45% медленнее стека HTTP/2 (TCP + TLS + HTTP/2).
И это не единственный недостаток QUIC — но в подробности мы здесь вдаваться не будем.
История QUIC в Node.js
Первая ишью с предложением добавить поддержку QUIC в Node.js появилась ещё в 2018 году.
За первую реализацию отвечал Джеймс Снелл. Он начал работу в марте 2019 года. К сожалению, результаты так и не были влиты в основную ветку Node.js и не стали стабильной функцией, доступной пользователям.
Главная причина, по которой мы до сих пор не видим QUIC в Node.js, связана с зависимостью от OpenSSL. Node.js использует OpenSSL для всех криптографических операций, включая TLS.
Ключевой элемент протокола QUIC — это TLS версии 1.3 и специфичный API, необходимый для того, чтобы QUIC мог обращаться к внутренним механизмам TLS, нарушая традиционное разделение уровней:
Прямой доступ к секретам трафика — QUIC нужно извлекать ключи шифрования напрямую из TLS-рукопожатия.
Обход слоя TLS Record — QUIC должен иметь возможность читать и записывать TLS-сообщения напрямую, без стандартного фрейминга TLS.
Пользовательская обработка транспорта — QUIC сам управляет шифрованием пакетов и транспортом, используя TLS только для криптографического рукопожатия.
В 2021 году появился pull request с поддержкой QUIC API в OpenSSL. Однако он был закрыт с пометкой, что совместимость с API, предложенным в этом PR, не является целью проекта.
Стоит ли говорить, насколько разочаровано было сообщество?
После этого Microsoft и Akamai решили форкнуть OpenSSL и создать отдельный проект под названием quictls. В Node.js даже появился PR, в котором предлагалось перейти с OpenSSL на этот форк, чтобы сделать поддержку QUIC возможной.
К августу 2020 года репозиторий nodejs/quic был заархивирован — это стало переломным моментом. Реализация была удалена из ядра Node.js в январе 2021 года, и, несмотря на продолжающиеся усилия вплоть до 2024 года, стабильного публичного API так и не появилось.
Текущее состояние QUIC в Node.js
Сопротивление со стороны OpenSSL было серьёзным, но наконец, с выходом OpenSSL 3.5 8 апреля 2025 года, мы получили долгожданные изменения — и работа над QUIC в Node.js официально сдвинулась с мёртвой точки.
Есть соответствующее issue, где можно увидеть множество обновлений прогресса от Джеймса Снелла и участников сообщества.
QUIC появится в Node.js 25 уже в октябре 2025 года!
Ну… по крайней мере, таков план.
Да, мы наконец-то подходим к тому моменту, где должны были быть ещё 4–5 лет назад.
Огромная благодарность всем, кто участвовал в этом – командам OpenSSL, ngtcp2 и Node.js core.
Итоги
Мейнтейнеры OpenSSL в течение долгих четырёх лет сопротивлялись запросам сообщества. Но наконец, с выходом OpenSSL 3.5 мы получили всё необходимое для реализации протокола в Node.js.
Благодаря этим изменениям в Node.js 25 появится первая реализация QUIC.
Русскоязычное JavaScript сообщество

Друзья! Эту статью перевела команда «JavaScript for Devs» — сообщества, где мы делимся практическими кейсами, инструментами для разработчиков и свежими новостями из мира Frontend. Подписывайтесь, чтобы быть в курсе и ничего не упустить!
MrZorg
Подождем теперь когда РКН решит, что мы достойны использовать QUIC
Timmek
Ну в ВК же есть