Cloudflare подготовила модуль для поддержки протокола HTTP / 3 в NGINX. Модуль готов в виде оснастки на библиотеке пирога с заварным кремом разработан в Cloudflare с реализацией транспортного протокола QUIC и HTTP / 3. Код киша написан на Rust., но модуль для NGINX написан на C и обращается к библиотеке через динамические ссылки. Часы работы открыты по лицензии BSD.
Из клиентского программного обеспечения Поддержка HTTP / 3 уже добавлена в экспериментальные сборки Chrome Canary. и утилита curl. На стороне сервера до сих пор требовалось использование изолированных тестовых реализаций с ограниченными возможностями. Возможность обрабатывать HTTP / 3 в nginx значительно упростит развертывание серверов с поддержкой HTTP / 3 и это сделает более доступной тестовую реализацию нового протокола.
HTTP / 3 стандартизирует использование протокола QUIC как транспорт для HTTP / 2. Протокол QUIC был разработан Google в качестве альтернативы TCP + TLS для Интернета, поэтому нацелен на решение проблем с длительным временем установки и согласования компаундов в TCP и задерживает устранение потери пакетов во время передачи данных. QUIC - это плагин к протоколу UDP, который поддерживает мультиплексирование нескольких подключений и предоставляет методы шифрования, эквивалентные TLS / SSL.
Среди ключевых характеристик QUIC выделяются:
- Высокая безопасность, похожая на TLS (по сути, QUIC предоставляет возможность использовать TLS поверх UDP).
- Контроль целостности потока, предотвращающий потерю пакетов.
- Возможность мгновенно установить соединение (0-RTT, примерно в 75% случаев данные могут быть переданы сразу после отправки пакета установки соединения) и обеспечить минимальные задержки между отправкой запроса и получением ответа (RTT, Round Trip Time) .
- Не использовать один и тот же порядковый номер при повторной передаче пакета, что позволяет избежать неоднозначности при определении принятых пакетов и сократить время ожидания.
- Потеря пакета влияет на доставку только связанного с ним потока и не останавливает доставку данных в потоках, передаваемых параллельно по текущему соединению.
- Инструменты исправления ошибок, которые минимизируют задержки из-за повторной передачи потерянных пакетов. Использование специальных кодов исправления ошибок на уровне пакетов для уменьшения ситуаций, требующих повторной передачи потерянных пакетных данных.
- Границы криптографических блоков выровнены с границами пакетов QUIC, что снижает влияние потери пакетов на декодирование содержимого последующих пакетов.
- Нет проблем с блокировкой очереди TCP
- Поддержка идентификатора подключения, что сокращает время установления переподключения для мобильных клиентов.
- Возможность подключения продвинутых механизмов для контроля перегрузки соединения
- Использование техники прогнозирования пропускной способности в каждом направлении для обеспечения оптимальной интенсивности пересылки пакетов, предотвращающей достижение состояния перегрузки, при котором наблюдается потеря пакетов.
- Замечательный прирост производительности и производительности по TCP. Для видеосервисов, таких как YouTube, QUIC продемонстрировал сокращение операций повторной буферизации при просмотре видео на 30%.
Как реализовать модуль для поддержки HTTP / 3 в NGINX?
Для тех, кто заинтересован в возможности реализовать этот модуль на своем сервере, Они могут сделать это, следуя инструкциям, которые мы приводим ниже.
Чтобы скомпилировать его, им просто нужно скачать патч для nginx 1.16 и код библиотеки пирога с заварным кремом.
curl -O https://nginx.org/download/nginx-1.16.1.tar.gz tar xzvf nginx-1.16.1.tar.gz git clone --recursive https://github.com/cloudflare/quiche cd nginx-1.16.1 patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
И мы компилируем NGINX с включенной поддержкой HTTP / 3:
./configure \ --prefix=$PWD \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_v3_module \ --with-openssl=../quiche/deps/boringssl \ --with-quiche=../quiche make
Во время компиляции поддержка TLS должна быть основана на библиотеке BoringSSL («–with-openssl = .. / quiche / deps / boringssl»), использование OpenSSL пока не поддерживается.
Чтобы принимать соединения в конфигурации, им нужно будет добавить директиву listener с флагом quic.