Введение

HTTP-пайплайнинг — это функция HTTP/1.1, позволяющая отправлять несколько HTTP-запросов по одному TCP-соединению без ожидания соответствующих ответов. HTTP/1.1 требует от серверов корректной обработки пайплайнинговых запросов, возвращая валидные ответы, даже если сервер не поддерживает HTTP-пайплайнинг. Несмотря на это требование, многие устаревшие серверы HTTP/1.1 некорректно поддерживают пайплайнинг, из-за чего большинство HTTP-клиентов не используют эту функцию. Данная техника была вытеснена мультиплексированием в HTTP/2, который поддерживается большинством современных браузеров. В HTTP/3 мультиплексирование реализовано через QUIC, заменяющий TCP. Это дополнительно снижает время загрузки, поскольку отсутствует блокировка первого пакета даже при потере некоторых пакетов.

Мотивация и ограничения

Конвейерная обработка запросов приводит к значительному улучшению времени загрузки HTML-страниц, особенно при соединениях с высокой задержкой, таких как спутниковый интернет. Ускорение менее заметно при широкополосных соединениях, поскольку по-прежнему действует ограничение HTTP 1.1: сервер должен отправлять ответы в том же порядке, в котором были получены запросы, – таким образом, соединение остаётся обслуживаемым по принципу «первым пришёл – первым ушёл». К 2017 году большинство браузеров поддерживали HTTP/2 по умолчанию, который использует мультиплексирование вместо этого. Запросы GET и HEAD могут быть всегда переданы по конвейеру. Последовательность других идемпотентных запросов, таких как PUT и DELETE, может быть передана по конвейеру или нет, в зависимости от того, зависят ли запросы в последовательности от результатов выполнения предыдущих. Большинство проблем с конвейерной обработкой возникают в промежуточных узлах HTTP (hop-by-hop), то есть в прокси-серверах, особенно в прозрачных прокси-серверах (если один из них в цепочке HTTP не обрабатывает запросы по конвейеру должным образом, то всё работает некорректно). То же преимущество сохраняется и в мультиплексированных потоках HTTP/2.

Статус реализации

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

Реализация в веб-браузерах

Из всех основных браузеров только Opera имела полностью рабочую реализацию, включенную по умолчанию. В других браузерах HTTP-конвейеризация была отключена или не реализована. Internet Explorer 11 не поддерживает конвейеризацию. Браузеры Mozilla (такие как Mozilla Firefox, SeaMonkey и Camino) ранее поддерживали конвейеризацию, однако она была удалена в Firefox 54. Когда она поддерживалась, конвейеризация была отключена по умолчанию, чтобы избежать проблем с некорректно работающими серверами. Если пользователь включал конвейеризацию, браузеры Mozilla использовали некоторые эвристики, в основном для отключения конвейеризации для старых серверов Microsoft IIS. Удаление было впоследствии перенесено в SeaMonkey. Konqueror 2.0 поддерживает конвейеризацию, но она отключена по умолчанию. Google Chrome ранее поддерживал конвейеризацию, но она была отключена из-за ошибок и проблем с серверами, работающими с ошибками. Pale Moon (веб-браузер) поддерживает конвейеризацию и она включена по умолчанию.

Реализация в веб-прокси-серверах

Большинство HTTP-прокси не поддерживают конвейерную передачу исходящих запросов. Некоторые HTTP-прокси, включая прозрачные HTTP-прокси, могут очень плохо обрабатывать конвейерные запросы (например, нарушая порядок получения конвейерных ответов). Некоторые версии веб-прокси Squid могут передавать до двух исходящих запросов в конвейере. Эта функция отключена по умолчанию и требует ручной активации для обеспечения управления пропускной способностью и ведения журналов доступа. Squid поддерживает множественные запросы от клиентов. Прокси Polipo поддерживает конвейерную передачу исходящих запросов. Tempesta FW, контроллер доставки приложений с открытым исходным кодом, также передает запросы на серверы бэкенда в конвейерном режиме.