Spec-Zone.ru › HTTP

Управление подключениями в HTTP 1.x

Управление подключениями в HTTP/1.x

Управление подключениями — ключевая тема в HTTP: открытие и поддержание подключений в значительной степени влияют на производительность веб-сайтов и веб-приложений. В HTTP/1.x существуют несколько моделей: кратковременные подключения, постоянные подключения и пипелинизация HTTP.

HTTP в основном использует TCP в качестве транспортного протокола, обеспечивая соединение между клиентом и сервером. В самом начале HTTP использовал одну модель для обработки таких подключений. Эти подключения были кратковременными: новое создавалось каждый раз, когда требовалось отправить запрос, и закрывалось после получения ответа.

Эта простая модель имела внутреннее ограничение производительности: открытие каждого TCP-соединения — ресурсоёмкая операция. Для отправки запроса необходимо обмениваться несколькими сообщениями между клиентом и сервером. Задержка сети и пропускная способность влияют на производительность при необходимости отправки запроса. Современные веб-страницы требуют множества запросов (десятка или более), чтобы отобразить необходимую информацию, что делает эту раннюю модель неэффективной.

В HTTP/1.1 были созданы две новые модели. Модель постоянного подключения поддерживает открытыми подключения между последовательными запросами, уменьшая время, необходимое для открытия новых подключений. Модель пипелизации HTTP идёт ещё дальше, отправляя несколько последовательных запросов без ожидания ответа, уменьшая значительную часть задержки в сети.

Compares the performance of the three HTTP/1.x connection models: short-lived connections, persistent connections, and HTTP pipelining.

Примечание: HTTP/2 добавляет дополнительные модели управления подключениями.

Важно отметить, что управление подключениями в HTTP относится к подключению между двумя последовательными узлами, которое является промежуточным, а не конечным. Модель, используемая при подключении между клиентом и его первым прокси-сервером, может отличаться от модели между прокси-сервером и целевым сервером (или любыми промежуточными прокси-серверами). HTTP-заголовки, участвующие в определении модели подключения, такие как Connection и Keep-Alive, являются промежуточными заголовками, значения которых могут быть изменены промежуточными узлами.

Связанной темой является понятие обновления подключения HTTP, при котором HTTP/1.1 подключение обновляется до другого протокола, такого как TLS/1.0, WebSocket или даже HTTP/2 в открытом тексте. Этот механизм обновления протокола подробно описан в другом месте.

Кратковременные подключения

Исходная модель HTTP и стандартная модель в HTTP/1.0 — кратковременные подключения. Каждый HTTP-запрос завершается на отдельном подключении; это означает, что TCP-рукопожатие происходит перед каждым HTTP-запросом, и они сериализуются.

Само TCP-рукопожатие занимает много времени, но TCP-соединение адаптируется к своей нагрузке, становясь более эффективным с более устойчивыми (или тёплыми) соединениями. Кратковременные соединения не используют эту функцию эффективности TCP, и производительность ухудшается по сравнению с оптимальной из-за постоянной передачи по новому, холодному соединению.

Эта модель является стандартной моделью, используемой в HTTP/1.0 (если нет заголовка Connection или если его значение установлено на close). В HTTP/1.1 эта модель используется только в том случае, если заголовок Connection отправлен со значением close.

Примечание: Если вы не работаете с очень старой системой, которая не поддерживает постоянное подключение, нет веских причин использовать эту модель.

Постоянные подключения

У кратковременных подключений есть две основные проблемы: значительные затраты времени на установление нового подключения и улучшение производительности базового TCP-соединения только после некоторого времени использования (тёплое подключение). Для решения этих проблем было разработано понятие постоянного подключения, даже до HTTP/1.1. Также это может называться подключением с сохранением.

Постоянное подключение остается открытым в течение определенного времени и может быть повторно использовано для нескольких запросов, что экономит необходимость нового TCP-рукопожатия и использует возможности повышения производительности TCP. Это соединение не будет открытым вечно: неактивные соединения закрываются после определенного времени (сервер может использовать заголовок Keep-Alive для указания минимального времени, в течение которого соединение должно оставаться открытым).

Постоянные подключения также имеют недостатки; даже в состоянии ожидания они потребляют ресурсы сервера, а при большой нагрузке атаки типа отказа в обслуживании могут быть проведены. В таких случаях использование непостоянных подключений, которые закрываются сразу после бездействия, может обеспечить лучшую производительность.

Подключения HTTP/1.0 по умолчанию не являются постоянными. Установка Connection на значение, отличное от close, обычно retry-after, сделает их постоянными.

В HTTP/1.1 постоянство является стандартным, и заголовок больше не нужен (но его часто добавляют как защитную меру в случаях, когда требуется откат к HTTP/1.0).

Пипелизация HTTP

Примечание: Пипелизация HTTP не активируется по умолчанию в современных браузерах:

  • По-прежнему распространены глючные прокси-серверы, которые приводят к странному и непредсказуемому поведению, которое веб-разработчики не могут легко предвидеть и диагностировать.
  • Пипелизация сложна для правильной реализации: размер передаваемого ресурса, эффективное время задержки, а также эффективная пропускная способность напрямую влияют на улучшение, обеспечиваемое конвейером. Не зная этих данных, важные сообщения могут быть задержаны за неважными. Понятие важности даже меняется во время макета страницы! Поэтому пипелизация HTTP в большинстве случаев обеспечивает лишь незначительное улучшение.
  • Пипелизация подвержена проблеме задержки.

По этим причинам пипелизация была заменена лучшим алгоритмом — мультиплексированием, который используется в HTTP/2.

По умолчанию HTTP-запросы выполняются последовательно. Следующий запрос отправляется только после получения ответа на текущий запрос. Поскольку они зависят от задержек сети и пропускной способности, это может привести к значительной задержке, прежде чем следующий запрос будет воспринят сервером.

Пипелизация — это процесс отправки последовательных запросов по одному постоянному подключению без ожидания ответа. Это позволяет избежать задержки подключения. Теоретически, производительность также могла бы улучшиться, если бы два HTTP-запроса были упакованы в одно TCP-сообщение. Типичный MSS (максимальный размер сегмента) достаточно велик, чтобы содержать несколько простых запросов, хотя требования к размеру HTTP-запросов продолжают расти.

Не все типы HTTP-запросов могут быть пипелизированы: только идемпотентные методы, то есть GET, HEAD, PUT и DELETE, могут быть безопасно повторены. В случае сбоя содержимое конвейера может быть повторено.

Сегодня любой HTTP/1.1-совместимый прокси-сервер и сервер должны поддерживать пипелизацию, хотя на практике у многих есть ограничения: главная причина, по которой современные браузеры по умолчанию не активируют эту функцию.

Разделение доменов

Примечание: Если у вас нет очень конкретной немедленной потребности, не используйте этот устаревший метод; вместо этого переключитесь на HTTP/2. В HTTP/2 разделение доменов больше не нужно: соединение HTTP/2 отлично справляется с параллельными запросами без приоритетов. Разделение доменов даже ухудшает производительность. Большинство реализаций HTTP/2 используют метод, называемый объединением подключений, чтобы свести разделение доменов к минимуму.

Поскольку HTTP/1.x соединение сериализует запросы, даже без каких-либо упорядочений, оно не может быть оптимальным без достаточной пропускной способности. В качестве решения браузеры открывают несколько подключений к каждому домену, отправляя параллельные запросы. По умолчанию когда-то было от 2 до 3 подключений, но сейчас чаще используется 6 параллельных подключений. Существует риск срабатывания защиты от DoS на стороне сервера при попытке открыть большее количество подключений.

Если серверу требуется более быстрый отклик веб-сайта или приложения, сервер может форсировать открытие большего количества подключений. Например, вместо того, чтобы размещать все ресурсы на одном домене, скажем www.example.com, их можно разделить на несколько доменов, www1.example.com, www2.example.com, www3.example.com. Каждый из этих доменов обращается к одному и тому же серверу, и веб-браузер откроет 6 подключений к каждому (в нашем примере, увеличивая подключения до 18). Этот метод называется разделением доменов.

Заключение

Улучшенное управление подключениями позволяет значительно повысить производительность в HTTP. При использовании HTTP/1.1 или HTTP/1.0 использование постоянного подключения (по крайней мере, до его бездействия) приводит к лучшей производительности. Однако неудача пипелизации привела к разработке более совершенных моделей управления подключениями, которые были включены в HTTP/2.

© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API