Поделиться через


Использование HTTP/3 с веб-сервером Kestrel для ASP.NET Core

Примечание.

Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.

Предупреждение

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.

HTTP/3 является утвержденным стандартом и третьей основной версией HTTP. В этой статье рассматриваются требования к HTTP/3. HTTP/3 полностью поддерживается в .NET 7 или более поздней версии.

Внимание

Приложения, настроенные на использование преимуществ HTTP/3, должны поддерживать протоколы HTTP/1.1 и HTTP/2.

Преимущества HTTP/3

HTTP/3:

  • Является последней версией протокола передачи гипертекста.
  • Опирается на сильные стороны HTTP/2, устраняя некоторые его ограничения, особенно в отношении производительности, задержки, надежности и безопасности.
Функция HTTP/2 HTTP/3
Транспорт Использует TCP Использует QUIC
Подключение Медленнее из-за TCP+TLS Быстрее с протоколом 0-RTT QUIC
Настройка рукопожатие Рукопожатия
Начало очереди Влияет на уровень TCP Устранено с помощью QUIC
Блокировка блокировка потоковое мультиплексирование
Шифрование TLS через TCP TLS встроен в QUIC

Основные отличия между HTTP/2 и HTTP/3 следующие:

  • Транспортный протокол: HTTP/3 вместо TCP использует QUIC. QUIC обеспечивает улучшенную производительность, меньшую задержку и более высокую надежность, особенно в мобильных сетях и сетях с потерями данных.
  • Головная блокировка: HTTP/2 может страдать от головной блокировки на уровне TCP, где задержка в одном потоке может повлиять на другие. HTTP/3с QUIC предоставляет независимые потоки, поэтому потеря пакетов в одном потоке не задерживает другие.
  • Создание подключений: HTTP/3 с QUIC позволяет быстрее устанавливать подключения, иногда с нулевой задержкой (0-RTT) для возвращающихся клиентов, так как он объединяет рукопожатия транспорта и шифрования.
  • Шифрование: требует шифрования TLS 1.3, что обеспечивает повышенную безопасность по умолчанию, в то время как в HTTP/3 это необязательно.
  • Мультиплексирование: хотя оба поддерживают мультиплексирование, HTTP/3реализация с QUIC более эффективна и избегает проблем с блокировкой на уровне TCP.
  • Миграция подключений: QUIC позволяет HTTP/3 подключениям сохраняться, даже если IP-адрес клиента изменяется (например, переход с Wi-Fi на сотовые устройства), что улучшает взаимодействие с мобильными пользователями.

Требования HTTP/3

HTTP/3 использует QUIC в качестве транспортного протокола. Реализация ASP.NET Core http/3 зависит от MsQuic для предоставления функций QUIC. В результате поддержка HTTP/3 в ASP.NET Core зависит от требований платформы MsQuic. Дополнительные сведения об установке MsQuic см. в разделе "Зависимости платформы QUIC". Если платформа, Kestrel на которую запущена, не имеет всех требований для HTTP/3, то она отключена и Kestrel будет возвращаться к другим протоколам HTTP.

Начало работы

По умолчанию HTTP/3 отключен. Добавьте конфигурацию для Program.cs включения HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Предыдущий код настраивает порт 5001 для следующего:

  • Использование HTTP/3 вместе с HTTP/1.1 и HTTP/2 путем указания HttpProtocols.Http1AndHttp2AndHttp3.
  • Включение протокола HTTPS с помощью UseHttps. Для HTTP/3 требуется протокол HTTPS.

Поскольку не все маршрутизаторы, брандмауэры и прокси-серверы поддерживают HTTP/3, рекомендуется настроить HTTP/3 вместе с HTTP/1.1 и HTTP/2. Это можно сделать, указав HttpProtocols.Http1AndHttp2AndHttp3 в качестве поддерживаемых протоколов конечной точки.

Дополнительные сведения см. в статье KestrelНастройка конечных точек для веб-сервера для ASP.NET Core.

Настройка QuicTransportOptions

Параметры транспорта QUIC можно настроить, вызвав UseQuic метод расширения IWebHostBuilder.

        var builder = WebApplication.CreateBuilder(args);

        builder.WebHost.UseQuic(options =>
        {
#pragma warning disable CA2252 // Using preview features
            options.MaxBidirectionalStreamCount = 200;
#pragma warning restore CA2252
        });

        builder.WebHost.ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ListenAnyIP(5001, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
                listenOptions.UseHttps();
            });
        });

В следующей таблице описаны доступные QuicTransportOptions.

Вариант По умолчанию Description
MaxBidirectionalStreamCount 100 Максимальное число параллельных двунаправленных потоков на соединение.
MaxUnidirectionalStreamCount 10 Максимальное число одновременных однонаправленных потоков на одно подключение.
MaxReadBufferSize 1024 * 1024 (1 МБ) Максимальный размер буфера чтения в байтах.
MaxWriteBufferSize 64 * 1024 (64 КБ) Максимальный размер буфера записи в байтах.
Backlog 512 Максимальная длина очереди ожидающих подключений.
DefaultStreamErrorCode 0x010c (Запрос отменён) Код ошибки, используемый, когда поток должен прервать чтение или запись на одной из сторон потока.
DefaultCloseErrorCode 0x100 (H3_NO_ERROR) Код ошибки, используемый при удалении открытого подключения.

Alt-svc

HTTP/3 обнаруживается как обновление с HTTP/1.1 или HTTP/2 с помощью заголовка alt-svc. Это означает, что первый запрос обычно будет использовать HTTP/1.1 или HTTP/2 перед переключением на HTTP/3. Kestrel автоматически добавляет заголовок alt-svc, если включен HTTP/3.

Тестирование localhost

  • Браузеры не разрешают самозаверяющий сертификат http/3, например Kestrel сертификат разработки.

  • HttpClient может использоваться для тестирования localhost/loopback в .NET 6 или более поздних версий. При использовании HttpClient для создания запроса HTTP/3 требуется дополнительная настройка:

Дополнительные сведения о том, как использовать HTTP/3 с HttpClient, см. в статье HTTP/3 с .NET.

HTTP/3 — это предлагаемый стандарт и третья основная версия HTTP. В этой статье рассматриваются требования для HTTP/3. HTTP/3 полностью поддерживается в .NET 7 или более поздней версии.

Внимание

Приложения, настроенные на использование преимуществ HTTP/3, должны поддерживать протоколы HTTP/1.1 и HTTP/2.

Требования HTTP/3

Протокол HTTP/3 имеет разные требования в зависимости от операционной системы. Если платформа, на которой работает Kestrel, не удовлетворяет всем требованиям для HTTP/3, она отключается, а Kestrel переключается на другие протоколы HTTP.

Виндоус

  • Windows 11, сборка 22000 или более поздней версии или Windows Server 2022.
  • Подключение TLS 1.3 или более поздней версии.

Линукс

  • Установлен пакет libmsquic.

libmsquic публикуется через официальный репозиторий пакетов Linux от Майкрософт по адресу packages.microsoft.com. Чтобы установить этот пакет, выполните следующие действия.

  1. Добавьте репозиторий packages.microsoft.com. Инструкции см. в разделе Репозиторий программного обеспечения Linux для продуктов Майкрософт.
  2. Установите пакет libmsquic с помощью диспетчера пакетов дистрибутива. Например, apt install libmsquic=1.9* в Ubuntu.

Примечание. Платформа .NET 6 совместима только с версиями libmsquic версии 1.9.x. Libmsquic 2.x не поддерживается из-за внесенных критических изменений. Libmsquic получает обновления до версии 1.9.x при необходимости добавления исправлений безопасности.

macOS

HTTP/3 сейчас не поддерживается в macOS и может быть доступен в следующем выпуске.

Начало работы

По умолчанию HTTP/3 отключен. Добавьте конфигурацию для Program.cs включения HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Предыдущий код настраивает порт 5001 для следующего:

  • Использование HTTP/3 вместе с HTTP/1.1 и HTTP/2 путем указания HttpProtocols.Http1AndHttp2AndHttp3.
  • Включение протокола HTTPS с помощью UseHttps. Для HTTP/3 требуется протокол HTTPS.

Поскольку не все маршрутизаторы, брандмауэры и прокси-серверы поддерживают HTTP/3, рекомендуется настроить HTTP/3 вместе с HTTP/1.1 и HTTP/2. Это можно сделать, указав HttpProtocols.Http1AndHttp2AndHttp3 в качестве поддерживаемых протоколов конечной точки.

Дополнительные сведения см. в статье KestrelНастройка конечных точек для веб-сервера для ASP.NET Core.

Alt-svc

HTTP/3 обнаруживается как обновление с HTTP/1.1 или HTTP/2 с помощью заголовка alt-svc. Это означает, что первый запрос обычно будет использовать HTTP/1.1 или HTTP/2 перед переключением на HTTP/3. Kestrel автоматически добавляет заголовок alt-svc, если включен HTTP/3.

Тестирование localhost

  • Браузеры не разрешают самозаверяющие сертификаты на HTTP/3, например сертификат разработки Kestrel.

  • HttpClient может использоваться для тестирования localhost/loopback в .NET 6 или более поздних версий. При использовании HttpClient для создания запроса HTTP/3 требуется дополнительная настройка:

Преимущества HTTP/3

HTTP/3 использует ту же семантику, что и HTTP/1.1 и HTTP/2: те же методы запроса, коды состояния и поля сообщений применяются ко всем версиям. Разница заключается в базовой транспортировке. HTTP/1.1 и HTTP/2 используют TCP в качестве транспорта. HTTP/3 использует новую транспортную технологию, разработанную вместе с HTTP/3 и называемую QUIC.

HTTP/3 и QUIC имеют ряд преимуществ по сравнению с HTTP/1.1 и HTTP/2:

  • Сокращенное время отклика первого запроса. QUIC и HTTP/3 согласовывают подключение, требуя меньше циклов взаимодействия между клиентом и сервером. Первый запрос быстрее достигает сервера.
  • Улучшена работа при потере пакетов подключения. HTTP/2 выполняет мультиплексирование нескольких запросов через одно TCP-соединение. Потеря пакетов в соединении влияет на все запросы. Эта проблема называется блокировкой очереди. Так как QUIC обеспечивает собственное мультиплексирование, потерянные пакеты влияют только на запросы, в которых были утеряны данные.
  • Поддерживает переход между сетями. Эта функция полезна для мобильных устройств, которые при смене расположения часто переключаются между Wi-Fi и сотовыми сетями. В настоящее время подключения HTTP/1.1 и HTTP/2 завершаются ошибкой при переключении сетей. Приложение или веб-браузер должны повторить все невыполненные HTTP-запросы. HTTP/3 позволяет приложению или веб-браузеру без перебоев продолжить работу при изменении сети. Kestrel не поддерживает сетевые переходы в .NET 6. Эта возможность может быть доступна в следующем выпуске.

HTTP/3 — это ожидаемая третья основная версия HTTP. В этой статье обсуждаются требования к HTTP/3 и настройка Kestrel для его использования.

Внимание

Протокол HTTP/3 доступен в .NET 6 в качестве предварительной версии функции. Спецификация HTTP/3 не была завершена, и при использовании HTTP/3 с .NET 6 могут возникнуть проблемы с поведением или производительностью.

Дополнительные сведения о поддержке функций предварительной версии см. в этом разделе.

Приложения, настроенные на использование преимуществ HTTP/3, должны поддерживать протоколы HTTP/1.1 и HTTP/2. При обнаружении проблем в HTTP/3 мы рекомендуем отключить HTTP/3, пока проблемы не будут устранены в будущих выпусках ASP.NET Core. Существенные проблемы указываются в репозитории объявлений GitHub.

Требования HTTP/3

Протокол HTTP/3 имеет разные требования в зависимости от операционной системы. Если платформа, на которой работает Kestrel, не удовлетворяет всем требованиям для HTTP/3, она отключается, а Kestrel переключается на другие протоколы HTTP.

Виндоус

  • Windows 11, сборка 22000 или более поздней версии или Windows Server 2022.
  • Подключение TLS 1.3 или более поздней версии.

Линукс

  • Установлен пакет libmsquic.

libmsquic публикуется через официальный репозиторий пакетов Linux от Майкрософт по адресу packages.microsoft.com. Чтобы установить этот пакет, выполните следующие действия.

  1. Добавьте репозиторий packages.microsoft.com. Инструкции см. в разделе Репозиторий программного обеспечения Linux для продуктов Майкрософт.
  2. Установите пакет libmsquic с помощью диспетчера пакетов дистрибутива. Например, apt install libmsquic=1.9* в Ubuntu.

Примечание. Платформа .NET 6 совместима только с версиями libmsquic версии 1.9.x. Libmsquic 2.x не поддерживается из-за внесенных критических изменений. Libmsquic получает обновления до версии 1.9.x при необходимости добавления исправлений безопасности.

macOS

HTTP/3 сейчас не поддерживается в macOS и может быть доступен в следующем выпуске.

Начало работы

По умолчанию HTTP/3 отключен. Добавьте конфигурацию для Program.cs включения HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Предыдущий код настраивает порт 5001 для следующего:

  • Использование HTTP/3 вместе с HTTP/1.1 и HTTP/2 путем указания HttpProtocols.Http1AndHttp2AndHttp3.
  • Включение протокола HTTPS с помощью UseHttps. Для HTTP/3 требуется протокол HTTPS.

Поскольку не все маршрутизаторы, брандмауэры и прокси-серверы поддерживают HTTP/3, рекомендуется настроить HTTP/3 вместе с HTTP/1.1 и HTTP/2. Это можно сделать, указав HttpProtocols.Http1AndHttp2AndHttp3 в качестве поддерживаемых протоколов конечной точки.

Дополнительные сведения см. в статье KestrelНастройка конечных точек для веб-сервера для ASP.NET Core.

Alt-svc

HTTP/3 обнаруживается как обновление с HTTP/1.1 или HTTP/2 с помощью заголовка alt-svc. Это означает, что первый запрос обычно будет использовать HTTP/1.1 или HTTP/2 перед переключением на HTTP/3. Kestrel автоматически добавляет заголовок alt-svc, если включен HTTP/3.

Тестирование localhost

  • Браузеры не разрешают самозаверяющие сертификаты на HTTP/3, например сертификат разработки Kestrel.

  • HttpClient может использоваться для тестирования localhost/loopback в .NET 6 или более поздних версий. При использовании HttpClient для создания запроса HTTP/3 требуется дополнительная настройка:

    • Задайте для HttpRequestMessage.Version значение 3.0 или
    • Задайте для параметра HttpRequestMessage.VersionPolicy значение HttpVersionPolicy.RequestVersionOrHigher.

Ограничения

Некоторые сценарии HTTPS еще не поддерживаются для HTTP/3 в Kestrel. При вызове метода Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps с HttpsConnectionAdapterOptions при использовании HTTP/3 установка следующих параметров в HttpsConnectionAdapterOptions ничего не меняет (ничего не выполняется):

Вызов следующих реализаций метода Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps вызывает ошибку при использовании HTTP/3:

Преимущества HTTP/3

HTTP/3 использует ту же семантику, что и HTTP/1.1 и HTTP/2: те же методы запроса, коды состояния и поля сообщений применяются ко всем версиям. Разница заключается в базовой транспортировке. HTTP/1.1 и HTTP/2 используют TCP в качестве транспорта. HTTP/3 использует новую транспортную технологию, разработанную вместе с HTTP/3 и называемую QUIC.

HTTP/3 и QUIC имеют ряд преимуществ по сравнению с HTTP/1.1 и HTTP/2:

  • Сокращенное время отклика первого запроса. QUIC и HTTP/3 согласовывают подключение, требуя меньше циклов взаимодействия между клиентом и сервером. Первый запрос быстрее достигает сервера.
  • Улучшена работа при потере пакетов подключения. HTTP/2 выполняет мультиплексирование нескольких запросов через одно TCP-соединение. Потеря пакетов в соединении влияет на все запросы. Эта проблема называется блокировкой очереди. Так как QUIC обеспечивает собственное мультиплексирование, потерянные пакеты влияют только на запросы, в которых были утеряны данные.
  • Поддерживает переход между сетями. Эта функция полезна для мобильных устройств, которые при смене расположения часто переключаются между Wi-Fi и сотовыми сетями. В настоящее время подключения HTTP/1.1 и HTTP/2 завершаются ошибкой при переключении сетей. Приложение или веб-браузер должны повторить все невыполненные HTTP-запросы. HTTP/3 позволяет приложению или веб-браузеру без перебоев продолжить работу при изменении сети. Kestrel не поддерживает сетевые переходы в .NET 6. Эта возможность может быть доступна в следующем выпуске.