Использование HTTP/3 с веб-сервером Kestrel для ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .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
. Чтобы установить этот пакет, выполните следующие действия.
- Добавьте репозиторий
packages.microsoft.com
. Инструкции см. в разделе Репозиторий программного обеспечения Linux для продуктов Майкрософт. - Установите пакет
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
.
- Задайте для
Преимущества 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
. Чтобы установить этот пакет, выполните следующие действия.
- Добавьте репозиторий
packages.microsoft.com
. Инструкции см. в разделе Репозиторий программного обеспечения Linux для продуктов Майкрософт. - Установите пакет
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
.
- Задайте для
Преимущества 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
. Чтобы установить этот пакет, выполните следующие действия.
- Добавьте репозиторий
packages.microsoft.com
. Инструкции см. в разделе Репозиторий программного обеспечения Linux для продуктов Майкрософт. - Установите пакет
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:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
Преимущества 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. Эта возможность может быть доступна в следующем выпуске.
ASP.NET Core