Не могли бы вы объяснить мультиплексирование применительно к HTTP / 2 и как оно работает?

user3448600

Ответов: 5

Ответы (5)

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

А теперь гораздо более сложный ответ ...

Когда вы загружаете веб-страницу, она загружает HTML-страницу, видит, что ей нужны CSS, JavaScript, загрузка изображений ... и т. Д.

В HTTP / 1.1 вы можете загружать только один из них за раз по вашему HTTP / 1.1 соединению. Итак, ваш браузер загружает HTML-код, а затем запрашивает файл CSS. Когда он возвращается, он запрашивает файл JavaScript. Когда он возвращается, он запрашивает первый файл изображения ... и т. Д. HTTP / 1.1 в основном синхронный - как только вы отправляете запрос, вы зависаете, пока не получите ответ. Это означает, что большую часть времени браузер не делает очень много, так как он запускает запрос, ожидает ответа, затем запускает другой запрос, затем ждет ответа ... и т. Д. Конечно, сложные сайты с многие JavaScript действительно требуют, чтобы браузер выполнял большую обработку, но это зависит от загружаемого JavaScript, поэтому, по крайней мере, вначале, задержки, наследуемые HTTP / 1.1, действительно вызывают проблемы. Обычно сервер тоже мало что делает (по крайней мере, для каждого запроса - конечно, они складываются для загруженных сайтов), потому что он должен почти мгновенно отвечать на статические ресурсы (например, CSS, JavaScript, изображения, шрифты ... и т. Д.) и, надеюсь, не намного дольше даже для динамических запросов (которые требуют вызова базы данных и т.п.).

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

• 100001 пойти с этим примером). Допустим, каждый запрос проходит через Интернет на веб-сервер и обратно за 100 мс, а время обработки на обоих концах ничтожно (для простоты скажем, 0 для этого примера). Поскольку вам нужно отправлять каждый ресурс и ждать ответа по одному, загрузка всего сайта займет 10 * 100 мс = 1000 мс или 1 секунду.

Чтобы обойти это, браузеры обычно открывают несколько подключений к веб-серверу (обычно 6). Это означает, что браузер может отправлять несколько запросов одновременно, что намного лучше, но за счет сложности настройки и управления несколькими подключениями (что влияет как на браузер, так и на сервер). Продолжим предыдущий пример и также предположим, что имеется 4 соединения и для простоты предположим, что все запросы равны. В этом случае вы можете разделить запросы по всем четырем соединениям, так что у двух будет 3 ресурса для получения, а у двух будет 2 ресурса для получения всех десяти ресурсов (3 + 3 + 2 + 2 = 10). В этом случае наихудший случай - 3 раунда или 300 мс = 0,3 секунды - хорошее улучшение, но этот простой пример не включает в себя затраты на установку этих нескольких подключений, а также последствия для ресурсов, связанные с их управлением (которые я не рассмотрел. здесь, поскольку этот ответ уже достаточно длинный, но настройка отдельных TCP-соединений требует времени и других ресурсов - для выполнения TCP-соединения, установления связи HTTPS и последующего выхода на полную скорость из-за медленного запуска TCP).

HTTP / 2 позволяет отправлять несколько запросов на одно и то же соединение, поэтому вам не нужно открывать несколько подключений, как описано выше. Итак, ваш браузер может сказать: «Дайте мне этот файл CSS. Дайте мне этот файл JavaScript. Дайте мне image1.jpg. Дайте мне image2.jpg ... и т. Д.» чтобы полностью использовать одно-единственное соединение. Это дает очевидное преимущество в производительности, поскольку не задерживает отправку тех запросов, которые ждут свободного соединения. Все эти запросы проходят через Интернет на сервер (почти) параллельно. Сервер отвечает на каждого, а затем они начинают возвращаться. Фактически, это даже более мощно, чем это, поскольку веб-сервер может реагировать на них в любом порядке, который он чувствует, и отправлять файлы в другом порядке или даже разбивать каждый запрошенный файл на части и смешивать файлы вместе. У этого есть вторичное преимущество: один тяжелый запрос не блокирует все остальные последующие запросы (известная как проблема блокировки заголовка строки). Затем перед веб-браузером стоит задача собрать все части воедино. В лучшем случае (при условии отсутствия ограничений пропускной способности - см. Ниже), если все 10 запросов запускаются практически одновременно параллельно и на них немедленно отвечает сервер, это означает, что у вас в основном есть один круговой обход или 100 мс или 0,1 секунды, чтобы скачать все 10 ресурсов. И в этом нет недостатков, которые были у нескольких подключений для HTTP / 1.1! Это также становится более масштабируемым по мере роста ресурсов на каждом веб-сайте (в настоящее время браузеры открывают до 6 параллельных подключений по протоколу HTTP / 1.1, но должно ли это расти по мере того, как сайты становятся более сложными?).

Эта диаграмма показывает различия, а также есть анимированная версия.

Примечание. HTTP / 1.1 имеет концепцию конвейерной обработки, которая также позволяет отправлять несколько запросов одновременно. Однако они все равно должны были быть возвращены в том порядке, в котором они были запрошены, в полном объеме, поэтому они далеко не так хороши, как HTTP / 2, даже если концептуально он похож. Не говоря уже о том, что это настолько плохо поддерживается как браузерами, так и серверами, что используется редко.

Одна вещь, отмеченная в комментариях ниже, - это то, как пропускная способность влияет на нас здесь. Конечно, ваше интернет-соединение ограничено тем, сколько вы можете загрузить, и HTTP / 2 не решает эту проблему. Так что, если все эти 10 ресурсов, описанных в примерах выше, представляют собой массивные изображения с качеством печати, их загрузка все равно будет медленной. Однако для большинства веб-браузеров пропускная способность представляет меньшую проблему, чем задержка. Так что, если эти десять ресурсов представляют собой небольшие элементы (в частности, текстовые ресурсы, такие как CSS и JavaScript, которые можно сжать до крошечных размеров), как это часто бывает на веб-сайтах, тогда пропускная способность на самом деле не проблема - это просто объем ресурсов, который часто проблема, и HTTP / 2 пытается решить эту проблему. По этой же причине конкатенация используется в HTTP / 1.1 в качестве другого обходного пути, так, например, весь CSS часто объединяется в один файл: количество загружаемых CSS одинаково, но выполнение его как одного ресурса дает огромные преимущества в производительности (хотя в меньшей степени с HTTP / 2, и на самом деле некоторые говорят, что конкатенация должна быть анти-шаблоном под HTTP / 2 - хотя есть аргументы против полного отказа от нее).

Чтобы представить это как реальный пример: предположим, вам нужно заказать в магазине 10 товаров с доставкой на дом:

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

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

  • HTTP / 1.1 с конвейерной обработкой означает, что вы можете запросить все 10 элементов один за другим, не дожидаясь ожидания, но затем все они будут доставлены в том порядке, в котором вы их запросили. И если одного товара нет в наличии, вам придется подождать, прежде чем вы получите товары, которые вы заказали после этого, - даже если эти более поздние товары действительно есть в наличии! Это немного лучше, но все же возможны задержки, и, допустим, большинство магазинов все равно не поддерживают этот способ заказа.

  • HTTP / 2 означает, что вы можете заказывать свои товары в любом порядке - без каких-либо задержек (как указано выше). Магазин отправит их по мере готовности, поэтому они могут прибыть в другом порядке, чем вы просили, и они могут даже разделить товары, чтобы некоторые части этого заказа были доставлены первыми (так лучше, чем указано выше). В конечном итоге это должно означать, что вы 1) получите все быстрее и 2) можете начать работу над каждым элементом по мере его поступления («о, это не так хорошо, как я думал, так что я могу заказать что-то еще или вместо этого» ).

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

Надеюсь, что это поможет.

Простой ответ (Источник):

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

Комплексный / Подробный ответ:

Обратите внимание на ответ @ BazzaDP.

Запрос мультиплексирования

HTTP / 2 может отправлять несколько запросов данных параллельно через одно TCP-соединение. Это наиболее продвинутая функция протокола HTTP / 2, поскольку она позволяет загружать веб-файлы асинхронно с одного сервера. Большинство современных браузеров ограничивают TCP-соединения одним сервером. Это сокращает дополнительное время приема-передачи (RTT), ускоряет загрузку вашего веб-сайта без какой-либо оптимизации и делает ненужным сегментирование домена.

enter image description here

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

Мультиплексирование выходит за рамки строгой семантики запроса-ответа и позволяет устанавливать отношения «один-ко-многим» или «многие-ко-многим».

HTTP1 VS HTTP2 interchange process

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

Конвейерная обработка (HTTP / 1.1)

Несколько запросов отправляются через одно и то же HTTP-соединение. Ответы приходят в том же порядке. Если первый ответ занимает много времени, другие ответы должны ждать в очереди. Подобно конвейерной передаче ЦП, когда одна инструкция выбирается, пока другая декодируется. Одновременно выполняется несколько инструкций, но их порядок сохраняется.

Мультиплексирование (HTTP / 2)

Несколько запросов отправляются через одно и то же HTTP-соединение. Ответы принимаются в произвольном порядке. Не нужно ждать медленного ответа, который блокирует других. Аналогично выполнению команд вне очереди в современных ЦП.

Надеюсь, улучшенное изображение проясняет разницу:

Standard HTTP/1.1 flow/Pipelining/Multiplexing

2022 WebDevInsider