Команда 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 лет назад.

Огромная благодарность всем, кто участвовал в этом – командам OpenSSLngtcp2 и Node.js core.

Итоги

Мейнтейнеры OpenSSL в течение долгих четырёх лет сопротивлялись запросам сообщества. Но наконец, с выходом OpenSSL 3.5 мы получили всё необходимое для реализации протокола в Node.js.

Благодаря этим изменениям в Node.js 25 появится первая реализация QUIC.

Русскоязычное JavaScript сообщество

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

Комментарии (2)


  1. MrZorg
    08.10.2025 14:37

    Подождем теперь когда РКН решит, что мы достойны использовать QUIC


    1. Timmek
      08.10.2025 14:37

      Ну в ВК же есть