Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Примечание.
Это не последняя версия этой статьи. В текущей версии см. версию .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 требуется дополнительная настройка:- Задайте для
HttpRequestMessage.Versionзначение 3.0 или - Задайте для параметра
HttpRequestMessage.VersionPolicyзначениеHttpVersionPolicy.RequestVersionOrHigher.
- Задайте для
Дополнительные сведения о том, как использовать 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. Чтобы установить этот пакет, выполните следующие действия.
- Добавьте репозиторий
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 11, сборка 22000 или более поздней версии или Windows Server 2022.
- Подключение TLS 1.3 или более поздней версии.
Линукс
- Установлен пакет
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. Эта возможность может быть доступна в следующем выпуске.