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

Примечание.

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

Внимание

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

В текущем выпуске см . версию .NET 8 этой статьи.

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

Внимание

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

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

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

Windows

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

Linux

  • Установлен пакет 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 8. Эта возможность может быть доступна в следующем выпуске.

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

Внимание

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

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

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

Windows

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

Linux

  • Установлен пакет 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

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

Linux

  • Установлен пакет 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. Эта возможность может быть доступна в следующем выпуске.