Открыть сервис

HTTP.sys

HTTP.sys — это компонент операционной системы Windows, реализующий обработку HTTP-запросов на уровне ядра (kernel-mode). В отличие от пользовательских HTTP-стеков (например, в библиотеках .NET или IIS), HTTP.sys работает непосредственно в режиме ядра, что обеспечивает более высокую производительность, эффективное управление памятью и возможность обработки запросов до того, как они будут переданы в пользовательское приложение. HTTP.sys является частью драйверов сетевой подсистемы Windows и используется в качестве основного протокольного стека для HTTP-серверов, работающих под управлением служб IIS (Internet Information Services) и некоторых других приложений, таких как ASP.NET Core (в режиме HTTP.sys).

Архитектура и принцип работы

HTTP.sys представляет собой драйвер режима ядра (файл http.sys), который загружается при старте системы и функционирует как часть сетевой подсистемы Windows. Его основная задача — принимать входящие HTTP-запросы, разбирать их, управлять очередями запросов и передавать их в пользовательские приложения, зарегистрированные для обработки определённых URL-префиксов.

Основные компоненты

  • Драйвер ядра (http.sys) — центральный элемент, обрабатывающий все входящие HTTP-запросы. Он работает в контексте системного процесса System и имеет прямой доступ к сетевым стекам.
  • Очереди запросов (Request Queues) — каждая зарегистрированная рабочая роль (например, пул приложений IIS) создаёт очередь запросов. HTTP.sys помещает входящие запросы в соответствующую очередь, после чего приложение может их извлечь. Это позволяет изолировать обработку запросов между разными приложениями.
  • Кэш ответов (HTTP Response Cache) — HTTP.sys может кэшировать ответы на уровне ядра, что позволяет обслуживать повторные запросы без переключения в пользовательский режим, значительно ускоряя отдачу статического контента.
  • Пул портов (Port Sharing) — HTTP.sys позволяет нескольким приложениям прослушивать один и тот же TCP-порт (обычно 80 или 443) при условии, что они зарегистрированы на разные URL-префиксы. Это достигается за счёт того, что HTTP.sys принимает все соединения на порту и затем распределяет их по очередям на основе URL.

Процесс обработки запроса

  1. Сетевой стек Windows получает TCP-сегмент на порту 80 или 443.
  2. Драйвер http.sys перехватывает данные и выполняет синтаксический разбор HTTP-запроса (метод, URI, заголовки).
  3. HTTP.sys проверяет, зарегистрирован ли какой-либо процесс для обработки данного URL-префикса.
  4. Если регистрация найдена, запрос помещается в соответствующую очередь запросов.
  5. Приложение (например, рабочий процесс IIS) извлекает запрос из очереди через API HttpReceiveHttpRequest.
  6. После обработки приложение отправляет ответ через API HttpSendHttpResponse, который HTTP.sys может закэшировать.
  7. HTTP.sys отправляет ответ обратно клиенту через сетевой стек.

История и версии

HTTP.sys был впервые представлен в Windows Server 2003 и Windows XP с пакетом обновления 2 (SP2) как часть обновлённой сетевой подсистемы. Он пришёл на смену старому пользовательскому стеку HTTP, который использовался в IIS 5.0.

Основные версии

  • Windows Server 2003 / Windows XP SP2 — первая реализация HTTP.sys. Включала базовую обработку запросов, очереди и кэширование.
  • Windows Vista / Windows Server 2008 — добавлена поддержка SSL/TLS на уровне ядра, что позволило обрабатывать HTTPS-трафик без переключения в пользовательский режим. Расширен кэш ответов.
  • Windows 7 / Windows Server 2008 R2 — улучшена производительность, добавлена поддержка протокола HTTP/1.1 (включая постоянные соединения и конвейеризацию).
  • Windows 8 / Windows Server 2012 — введена поддержка протокола HTTP/2 (начиная с Windows 10 / Server 2016 — полная реализация). Улучшена работа с WebSockets.
  • Windows 10 / Windows Server 2016 — добавлена поддержка HTTP/2, включая мультиплексирование и сжатие заголовков (HPACK). Улучшена обработка больших объёмов трафика.
  • Windows 11 / Windows Server 2022 — поддержка HTTP/3 (на базе QUIC) на уровне ядра. Оптимизация для работы с современными веб-приложениями.

Применение

HTTP.sys является ключевым компонентом для всех веб-серверов на платформе Windows, которые используют стек HTTP на уровне ядра.

IIS (Internet Information Services)

IIS — основной потребитель HTTP.sys. Начиная с версии IIS 6.0, все запросы обрабатываются через HTTP.sys. Это позволяет IIS достигать высокой производительности и масштабируемости, особенно при обслуживании большого количества одновременных подключений.

ASP.NET Core (режим HTTP.sys)

В ASP.NET Core доступен сервер Microsoft.AspNetCore.Server.HttpSys, который напрямую использует API HTTP.sys. Этот режим позволяет создавать высокопроизводительные веб-приложения, работающие на Windows, без необходимости установки IIS. Он особенно полезен для сценариев, где требуется изоляция процессов или использование порт-шеринга.

Другие приложения

Любое приложение на Windows может использовать HTTP.sys через API HTTPAPI (HTTP Server API). Это позволяет создавать собственные HTTP-серверы, работающие на уровне ядра, без необходимости писать низкоуровневый сетевой код.

Преимущества и недостатки

Преимущества

  • Высокая производительность — обработка запросов на уровне ядра снижает накладные расходы на переключение контекста и копирование данных между пользовательским и ядерным пространствами.
  • Эффективное управление памятью — кэширование ответов в ядре позволяет обслуживать повторные запросы без участия пользовательского процесса.
  • Порт-шеринг — несколько приложений могут слушать один порт, что упрощает развёртывание и управление.
  • Встроенная поддержка SSL/TLS — обработка HTTPS на уровне ядра снижает нагрузку на приложение.
  • Надёжность — сбой в пользовательском приложении не приводит к остановке обработки запросов (запросы продолжают накапливаться в очереди).

Недостатки

  • Привязка к Windows — HTTP.sys доступен только в операционной системе Windows, что ограничивает кроссплатформенность.
  • Сложность настройки — для продвинутой конфигурации (например, кэширования, ограничения скорости) требуется работа с системными реестрами или PowerShell.
  • Потенциальные проблемы с безопасностью — ошибки в драйвере ядра могут привести к уязвимостям, затрагивающим всю систему. Примером является уязвимость CVE-2015-1635 (MS15-034), позволявшая выполнить удалённый код через HTTP.sys.

Безопасность и известные уязвимости

Как компонент, работающий в режиме ядра, HTTP.sys является критически важным для безопасности системы. За годы существования в нём были обнаружены несколько серьёзных уязвимостей.

CVE-2015-1635 (MS15-034)

Уязвимость в HTTP.sys, позволявшая удалённо выполнить код на сервере через специально сформированный HTTP-запрос. Проблема была связана с некорректной обработкой заголовка Range. Уязвимость затрагивала Windows 7, Windows Server 2008 R2, Windows 8, Windows Server 2012 и Windows 8.1. Microsoft выпустила обновление безопасности в апреле 2015 года.

Другие уязвимости

  • CVE-2016-3225 — уязвимость, позволявшая повысить привилегии через HTTP.sys.
  • CVE-2021-31166 — уязвимость, связанная с обработкой HTTP/2 трафика, позволявшая вызвать отказ в обслуживании или выполнить код.

Для снижения рисков рекомендуется своевременно устанавливать обновления безопасности Windows и ограничивать доступ к HTTP-серверам только доверенным сетям.

Настройка и управление

Настройка HTTP.sys осуществляется через реестр Windows и утилиту netsh. Основные параметры:

  • HttpPortSharing — включение/отключение порт-шеринга.
  • MaxConnections — максимальное количество одновременных соединений.
  • MaxEndpoints — максимальное количество зарегистрированных URL-префиксов.
  • UrlAcl — управление списками контроля доступа (ACL) для URL-префиксов (через netsh http add urlacl).

Пример команды для регистрации URL-префикса: `` netsh http add urlacl url=http://+:80/MyApp user=Everyone ``

Сравнение с альтернативами

HTTP.sys vs Kestrel (ASP.NET Core)

Kestrel — кроссплатформенный HTTP-сервер на основе .NET, работающий в пользовательском режиме. В отличие от HTTP.sys, Kestrel не требует Windows и может работать на Linux и macOS. Однако HTTP.sys обеспечивает более высокую производительность на Windows за счёт работы в ядре, а также предоставляет дополнительные возможности, такие как порт-шеринг и кэширование ответов.

HTTP.sys vs Apache/Nginx

Apache и Nginx — это полноценные веб-серверы, работающие в пользовательском режиме. Они не могут напрямую использовать HTTP.sys, так как он является частью Windows. Однако на Windows Apache и Nginx могут работать через собственные сетевые стеки, что обычно менее эффективно, чем использование HTTP.sys через IIS.

Источники

  • Microsoft Docs: «HTTP Server API»
  • Microsoft Docs: «HTTP.sys and IIS»
  • Windows Driver Kit (WDK) — документация по драйверу http.sys
  • CVE-2015-1635 (MS15-034) — бюллетень безопасности Microsoft
  • «Windows Internals, Part 1» (7th Edition) — Pavel Yosifovich, Mark Russinovich, David Solomon, Alex Ionescu

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →