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


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

Примечание.

Это не последняя версия этой статьи. Текущий выпуск можно найти в версии этой статьи о .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 Объединяет подтверждения транспорта и шифрования
Настройка рукопожатие Рукопожатия
Начало очереди Влияет на уровень TCP Устранено с помощью QUIC
Блокировка блокировка потоковое мультиплексирование
Шифрование TLS через TCP TLS встроен в QUIC

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

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

Ранняя обработка запросов

Kestrel может обрабатывать запросы HTTP/3 без предварительного ожидания потока управления и начального кадра SETTINGS. Эта оптимизация снижает задержку первого запроса на новые подключения HTTP/3.

В ASP.NET Core версиях, предшествующих .NET 11, Kestrel ждал получения потока управления QUIC и его начального кадра SETTINGS перед обработкой потоков запросов. Это требование больше не требуется, что означает, что первый запрос на новое подключение завершается быстрее.

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

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

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

Настройка 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_БЕЗ_ОШИБОК) Код ошибки, используемый при удалении открытого подключения.

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 для локального хоста или тестирования через обратную связь в .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:

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

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

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

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

HTTP/3 использует QUIC в качестве транспортного протокола. Реализация HTTP/3 в ASP.NET Core зависит от 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 в качестве поддерживаемых протоколов конечной точки.

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

Настройка 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();
            });
        });

Полный список доступных параметров транспорта QUIC и их описания см. в разделе QuicTransportOptions.

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

  • 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.

Note: .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 в качестве поддерживаемых протоколов конечной точки.

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

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 как компонент preview. Спецификация 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 или более поздней версии.

Линукс

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

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

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

Note: .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 в качестве поддерживаемых протоколов конечной точки.

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

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. При вызове Майкрософт.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps с HttpsConnectionAdapterOptions при использовании HTTP/3 установка следующих опций для HttpsConnectionAdapterOptions не имеет эффекта (no-op, ничего не делает):

Вызов следующих реализаций Майкрософт.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. Эта возможность может быть доступна в следующем выпуске.