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

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

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

Я видел некоторые проблемы с безопасностью, такие как DoS-атака уровня 7, если клиент максимально приближает количество конвейерных запросов к URL-адресу, интенсивному для сервера, игнорируя любые ответы, которые могут быть получены.

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

Однако он включен по умолчанию в браузерах Android и мобильных устройствах Chrome.

Почему Chrome, Firefox, IE, Opera и Safari не используют конвейерные HTTP-запросы на своей настольной (а иногда и мобильной) версии? Каковы их аргументы в пользу его отключения?

Ответы

Ответ 1

Конвейеризация отключена по следующим причинам:

  • Firefox:

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

  • Chrome:

Опция включения конвейерной обработки была удалена из Chrome, так как существуют известные сбои в ошибках и известные проблемы блокировки перед очередью. Существует также большое количество серверов и промежуточных ящиков, которые ведут себя плохо и непоследовательно, когда конвейерная обработка включена. Пока это не будет разрешено, рекомендуется, чтобы никто не применял конвейерную обработку. Для этого в настоящее время требуется специальная сборка Chromium.

В общем:

Багги-прокси-серверы все еще распространены, и это приводит к странным и неустойчивым поведениям, которые веб-разработчики не могут предвидеть и легко диагностировать.

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

Конвейеризация подчиняется проблеме HOL.

HTTP/2 предлагает альтернативу:

С помощью HTTP/1.x браузер имеет ограниченную возможность использовать вышеприведенные данные: протокол не поддерживает мультиплексирование, и нет способа передать приоритет запроса серверу. Вместо этого он должен полагаться на использование параллельных соединений, что позволяет ограничить parallelism до шести запросов на источник. В результате запросы ставятся в очередь на клиенте до тех пор, пока не будет доступно соединение, что добавит ненужную задержку в сети. Теоретически, HTTP Pipelining попыталась частично решить эту проблему, но на практике она не получила поддержки.

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

Также может использоваться прокси-сервер:

Вы можете попробовать что-то, что я сделал, чтобы ускорить работу Konqueror в KDE3. Я был недоволен тем, что Konqueror не имел конвейерной обработки HTTP, поэтому после некоторого поиска я установил Polipo в качестве локального прокси HTTP/HTTPS/FTP и установил Konqueror для его использования (localhost на порту 8123, если я правильно помню). В дополнение к конвейерной обработке HTTP, Polipo также обеспечил улучшенное кэширование, и поскольку это был прокси-сервер, я мог бы установить для каждого браузера его использование, и кеширование будет совместно использоваться браузерами. (Это также означает, что рекомендуется отключить каждое независимое от браузера кеширование.)

Ссылки