HTTP-конвейерная обработка

HTTP |
---|
![]() |
Методы запроса |
Поля заголовка |
Коды статуса ответа |
Методы безопасного контроля доступа |
Уязвимости безопасности |
Конвейерная обработка HTTP — это функция HTTP/1.1 несколько HTTP- , которая позволяет отправлять запросов через одно TCP -соединение, не дожидаясь соответствующих ответов. [1] HTTP/1.1 требует, чтобы серверы правильно отвечали на конвейерные запросы, предоставляя неконвейерные, но действительные ответы, даже если сервер не поддерживает конвейерную обработку HTTP. Несмотря на это требование, многие устаревшие серверы HTTP/1.1 не поддерживают конвейерную обработку должным образом, что вынуждает большинство HTTP-клиентов не использовать конвейерную обработку HTTP.
На смену этому методу пришло мультиплексирование через HTTP/2 . [2] который поддерживается большинством современных браузеров . [3]
В HTTP/3 мультиплексирование осуществляется через QUIC , который заменяет TCP . не происходит, Это еще больше сокращает время загрузки, поскольку блокировка начала строки даже если некоторые пакеты потеряны.
Мотивация и ограничения
[ редактировать ]Конвейерная обработка запросов приводит к значительному улучшению [4] во время загрузки HTML-страниц, особенно при соединениях с высокой задержкой, таких как спутниковое подключение к Интернету . Ускорение менее заметно при широкополосных соединениях, поскольку ограничение HTTP 1.1 все еще действует: сервер должен отправлять свои ответы в том же порядке, в котором были получены запросы, поэтому все соединение остается в порядке очереди. [1] и блокировка HOL может произойти .
асинхронные операции HTTP/2 и SPDY . Решением этой проблемы являются [5] К 2017 году большинство браузеров по умолчанию поддерживали HTTP/2, вместо которого используется мультиплексирование. [2]
Неидемпотентные запросы , такие как POST
не должно быть конвейерным. [6] Читать запросы типа GET
и HEAD
всегда можно конвейеризировать. Последовательность других идемпотентных запросов, таких как PUT
и DELETE
могут быть конвейерными или нет в зависимости от того, зависят ли запросы в последовательности от влияния других. [1]
Конвейерная обработка HTTP требует, чтобы ее поддерживали как клиент, так и сервер. Серверы, соответствующие HTTP/1.1, обязаны выдавать действительные ответы на конвейерные запросы, но на самом деле не могут обрабатывать запросы одновременно. [7]
Большинство проблем с конвейеризацией происходят в промежуточных узлах HTTP (пошагово), т. е. на прокси-серверах , особенно на прозрачных прокси-серверах (если один из них в цепочке HTTP не обрабатывает конвейерные запросы должным образом, тогда ничего не работает должным образом). [8]
Использование конвейерной обработки с прокси-серверами HTTP обычно не рекомендуется еще и потому, что проблема блокировки HOL может сильно замедлить ответы прокси-сервера (поскольку ответы сервера должны быть в том же порядке, что и полученные запросы). [1] [9]
Пример : если клиент отправляет 4 конвейерных запроса GET прокси-серверу через одно соединение, и первого из них нет в его кеше, то прокси-сервер должен переслать этот запрос на целевой веб-сервер; если вместо этого в его кеше обнаружены следующие три запроса, прокси-сервер должен дождаться ответа веб-сервера, затем отправить его клиенту и только после этого он может отправить также три кэшированных ответа.
Если вместо этого клиент открывает 4 соединения с прокси-сервером и отправляет 1 запрос GET на каждое соединение (без использования конвейерной обработки), прокси-сервер может отправить три кэшированных ответа клиенту параллельно до того, как будет получен ответ от сервера, уменьшая общее время завершения (поскольку запросы обслуживаются параллельно, без проблем с блокировкой начала линии). [10] То же преимущество существует в мультиплексированных потоках HTTP/2.
Статус реализации
[ редактировать ]Конвейерная обработка была представлена в HTTP/1.1 и отсутствовала в HTTP/1.0. [11]
Всегда были жалобы на то, что браузеры, прокси-серверы и т. д. плохо работают при использовании конвейерных запросов/ответов, вплоть до того, что на протяжении многих лет (по крайней мере, до 2011 г.) разработчики программного обеспечения, инженеры, веб-эксперты и т. д. пытались обобщить отмечали различные проблемы, исправляли проблемы и давали советы о том, как бороться с конвейерной обработкой в открытой сети. [8]
Реализация в веб-браузерах
[ редактировать ]Из всех основных браузеров только Opera имела полностью работающую реализацию, включенную по умолчанию. В других браузерах конвейерная обработка HTTP была отключена или не реализована. [5]
- Internet Explorer 8 не поддерживает запросы конвейера из-за опасений, связанных с ошибками прокси-серверов и блокировкой начала строки . [9]
- Internet Explorer 11 не поддерживает конвейерную обработку. [12]
- Браузеры Mozilla (такие как Mozilla Firefox , SeaMonkey и Camino ), используемые для поддержки конвейерной обработки; однако он был удален в Firefox 54. [13] Когда эта возможность поддерживалась, конвейерная обработка была отключена по умолчанию, чтобы избежать проблем с некорректным поведением серверов. [14] Если конвейерная обработка была включена пользователем, браузеры Mozilla использовали некоторую эвристику, в основном для отключения конвейерной обработки для старых серверов Microsoft IIS . [15] В конечном итоге удаление было перенесено в SeaMonkey.
- Konqueror 2.0 поддерживает конвейерную обработку, но по умолчанию она отключена. [16]
- Google Chrome ранее поддерживал конвейерную обработку, но был отключен из-за ошибок и проблем с плохо работающими серверами. [17]
- Pale Moon (веб-браузер) поддерживает конвейерную обработку и включен по умолчанию. [18]
Реализация на веб-прокси-серверах
[ редактировать ]Большинство HTTP-прокси не обрабатывают исходящие запросы. [19]
Некоторые HTTP-прокси, включая прозрачные HTTP-прокси, могут очень плохо управлять конвейерными запросами (например, смешивая порядок конвейерных ответов). [20]
Некоторые версии веб-прокси Squid могут передавать до двух исходящих запросов. Эта функция отключена по умолчанию, и ее необходимо включить вручную по «причинам управления пропускной способностью и регистрации доступа». [21] Squid поддерживает несколько запросов от клиентов.
Прокси -сервер Polipo передает исходящие запросы по конвейеру. [22]
Tempesta FW, контроллер доставки приложений с открытым исходным кодом , [23] также передает запросы на внутренние серверы. [24]
Другие реализации
[ редактировать ]Библиотека libwww, созданная Консорциумом World Wide Web (W3C), поддерживает конвейерную обработку, начиная с версии 5.1, выпущенной 18 февраля 1997 года. [25]
Другие библиотеки разработки приложений, поддерживающие конвейерную обработку HTTP, включают:
- Модулями Perl, обеспечивающими клиентскую поддержку конвейерной обработки HTTP, являются HTTP::Async и библиотека LWPng ( libwww-perl New Generation). [26]
- Microsoft .NET Framework 3.5 поддерживает конвейерную обработку HTTP в модуле.
System.Net.HttpWebRequest
. [27] - Qt Класс
QNetworkRequest
, введенный в 4.4. [28]
Некоторые другие приложения, в настоящее время использующие конвейерную обработку:
- Сервер приложений IceBreak начиная с BUILD389
- phttpget из FreeBSD (минималистский конвейерный HTTP-клиент) [29]
- libcurl ранее имел ограниченную поддержку конвейерной обработки с использованием опции CURLMOPT_PIPELINING, [30] но эта поддержка была удалена в версии 7.65.0 [31]
- portsnap ( FreeBSD система распределения дерева портов )
- Advanced Packaging Tool (APT) поддерживает конвейерную обработку. [ нужна ссылка ]
- Subversion (SVN) имеет дополнительную поддержку конвейерной обработки HTTP с помощью модуля доступа serf WebDAV (модуль по умолчанию, neon, не имеет поддержки конвейерной обработки). [32] [33]
- Служба очереди сообщений Microsoft в Windows Server 2003 по умолчанию использует конвейерную передачу по HTTP, и ее можно настроить для использования по HTTPS. [34]
- IBM CICS 3.1 поддерживает конвейерную обработку HTTP внутри своего клиента. [35]
Инструменты тестирования, поддерживающие конвейерную обработку HTTP, включают:
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с д Филдинг, Р.; Решке, Дж. (2014). Филдинг, Р.; Решке, Дж. (ред.). «Протокол передачи гипертекста (HTTP/1.1): синтаксис и маршрутизация сообщений: конвейерная обработка» . ietf.org. дои : 10.17487/RFC7230 . Проверено 24 июля 2014 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б «Редакция 1330814 | Управление соединениями в HTTP/1.x | MDN» . Веб-документы MDN . Архивировано из оригинала 19 марта 2018 г. Проверено 19 марта 2018 г.
- ^ «Поддержка браузера HTTP2» . Проверено 9 марта 2017 г.
- ^ Нильсен, Хенрик Фристик ; Геттис, Джим ; Бэрд-Смит, Ансельм; Прюдоммо, Эрик; Ложь, Хокон Виум ; Лилли, Крис (24 июня 1997 г.). «Влияние HTTP/1.1, CSS1 и PNG на производительность сети» . Консорциум Всемирной паутины . Проверено 14 января 2010 г.
- ^ Jump up to: а б Уиллис, Натан (18 ноября 2009 г.). «Уменьшение задержки HTTP с помощью SPDY» . LWN.net .
- ^ «Связи» . w3.org .
- ^ «Часто задаваемые вопросы по конвейерной работе HTTP/1.1 » .
- ^ Jump up to: а б Марк Ноттингем (14 марта 2011 г.). «Как сделать HTTP-конвейерную обработку доступной в открытой сети» . Проверено 16 октября 2021 г.
- ^ Jump up to: а б «Обратная ссылка «Чата экспертной зоны Windows Internet Explorer 8 (14 августа 2008 г.) » . Майкрософт . 14 августа 2008 года. Архивировано из оригинала 4 декабря 2010 года . Проверено 10 мая 2012 г.
- ^ Филдинг, Р.; Решке, Дж. (2014). Филдинг, Р.; Решке, Дж. (ред.). «Протокол передачи гипертекста (HTTP/1.1): синтаксис и маршрутизация сообщений: параллелизм» . ietf.org. дои : 10.17487/RFC7230 . Проверено 24 июля 2014 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ «Ключевые различия между HTTP/1.0 и HTTP/1.1» . Архивировано из оригинала 24 апреля 2016 г. Проверено 16 апреля 2016 г.
- ^ «Internet Explorer и ограничения на подключение» . IEBlog . Проверено 14 ноября 2016 г.
- ^ Примечания к выпуску Firefox 54
- ^ «Ошибка 264354: включить конвейерную обработку HTTP по умолчанию» . Мозилла . Проверено 16 сентября 2011 г.
- ^ «Исходный код — nsHttpConnection.cpp» . Исходный код Firefox . Мозилла. 7 мая 2010 года . Проверено 5 декабря 2010 г.
- ^ Эмир Ариан. Интернет-коммуникация: протоколы и связанные с ними предметы . Проверено 16 октября 2021 г.
- ^ Конвейерная обработка HTTP - Проекты Chromium
- ^ «Поддержка конвейерной обработки HTTP/1 удалена в Firefox 54 — форум Pale Moon» . forum.palemoon.org . Проверено 7 июня 2018 г.
- ^ Марк Ноттингем (20 июня 2007 г.). «Состояние кэширования прокси» . Проверено 16 мая 2009 г.
- ^ Марк Ноттингем (11 июля 2011 г.). «Что должны делать прокси» . Проверено 16 октября 2021 г.
- ^ «squid: директива конфигурации Pipeline_prefetch» . Кальмар . 9 ноября 2009 года . Проверено 1 декабря 2009 г.
- ^ «Polipo — кеширующий веб-прокси» . Юлиуш Хробочек. 18 сентября 2009 года . Проверено 12 ноября 2009 г.
- ^ «Tempesta FW — контроллер доставки приложений Linux» . Гитхаб . Проверено 29 марта 2018 г.
- ^ «Серверы: сторона Темпесты — tempesta-tech/tempesta Wiki» . Tempesta Technologies INC. 1 августа 2017 г. Проверено 29 марта 2018 г.
- ^ Кахан, Хосе (7 июня 2002 г.). «История изменений libwww» . Консорциум Всемирной паутины . Проверено 3 августа 2010 г.
- ^ «Использование HTTP::Async для параллельных HTTP-запросов (Колин Брэдфорд)» (PDF) . Архивировано из оригинала (PDF) 10 марта 2012 г. Проверено 3 августа 2010 г.
- ^ System.Net.HttpWebRequest и конвейерная обработка
- ^ Справочник классов QNetworkRequest. Архивировано 22 декабря 2009 г. на Wayback Machine , документация Nokia QT.
- ^ Конвейерная утилита HTTP GET
- ^ Объяснение конвейерной обработки Curl. Архивировано 27 июня 2012 г. на Wayback Machine , документация разработчика Curl.
- ^ Объявление об удалении конвейера Curl. Архивировано 5 февраля 2021 г. на Wayback Machine.
- ^ К. Майкл Пилато; Бен Коллинз-Сассман; Брайан В. Фицпатрик (2008). Контроль версий с помощью Subversion . О'Рейли Медиа . п. 238. ИСБН 978-0-596-51033-6 .
- ^ Джастин Р. Эренкранц (2007). «Подрывная деятельность: новые мощные игрушки» (PDF) .
- ^ «Сообщения HTTP/HTTPS» . Microsoft TechNet . 21 января 2005 г.
- ^ Как веб-поддержка CICS обеспечивает конвейерную обработку
- ^ «HTTP-сайт» . Архивировано из оригинала 8 июня 2012 г. Проверено 1 октября 2010 г.
Внешние ссылки
[ редактировать ]- RFC 7230 Филдинг, Р.; Решке, Дж. (2014). Филдинг, Р; Решке, Дж. (ред.). «Протокол передачи гипертекста (HTTP/1.1): синтаксис сообщений и маршрутизация» . ietf.org. дои : 10.17487/RFC7230 . Проверено 24 июля 2014 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - Часто задаваемые вопросы по конвейерной обработке HTTP/1.1 на сайте mozilla.org.
- «Влияние HTTP/1.1, CSS1 и PNG на производительность сети» на сайте w3.org.
- Статья «Оптимизация времени загрузки страницы»
- phttpget
- Serf библиотека C