Что означает мультиплексирование в HTTP/2
может кто-нибудь объяснить мультиплексирование по отношению к HTTP/2 и как это работает?
3 ответов
проще говоря, мультиплексирование позволяет вашему браузеру запускать несколько запросов одновременно на одном соединении и получать запросы обратно в любом порядке.
а теперь о гораздо более сложном ответе...
когда вы загружаете веб-страницу, она загружает HTML-страницу, она видит, что ей нужен CSS, JavaScript, загрузка изображений... так далее.
под HTTP / 1.1 вы можете загрузить только один из них одновременно на вашем соединении HTTP/1.1. Итак, ваш браузер загружает HTML, затем он запрашивает файл CSS. Когда это возвращается, он запрашивает файл JavaScript. Когда это возвращается, он запрашивает первый файл изображения... так далее. HTTP / 1.1 в основном синхронный - после отправки запроса вы застряли, пока не получите ответ. Это означает, что большую часть времени браузер не делает очень много, так как он запустил запрос, ждет ответа, затем запускает другой запрос, затем ждет ответа... так далее. Конечно, сложные сайты с большим количеством JavaScript требуется ли браузеру выполнять много обработки, но это зависит от загружаемого JavaScript, поэтому, по крайней мере для начала, задержки наследования HTTP/1.1 вызывают проблемы. Как правило, сервер тоже не очень много делает (по крайней мере, по запросу - конечно, они складываются для занятых сайтов), потому что он должен почти мгновенно реагировать на статические ресурсы (например, CSS, JavaScript, изображения, шрифты... так далее.) и, надеюсь, не слишком долго даже для динамических запросов (которые требуют вызова базы данных или подобный.)
таким образом, одной из основных проблем в интернете сегодня является сетевая задержка при отправке запросов между браузером и сервером. Это может быть всего лишь десятки или, возможно, сотни миллисекунд, что может показаться немного, но они складываются и часто являются самой медленной частью веб - просмотра-особенно, когда веб-сайты становятся более сложными и требуют дополнительных ресурсов (поскольку они получают), а доступ в Интернет все чаще осуществляется через мобильный (с более медленной задержкой, чем широкополосный).
Как пример допустим, есть 10 ресурсов, которые ваша веб-страница должна загрузить после того, как HTML загружен сам (который является очень маленьким сайтом по сегодняшним стандартам, поскольку 100 + ресурсов является общим, но мы будем держать его простым и идти с этим примером). И предположим, что каждый запрос занимает 100 мс для перемещения через Интернет на веб-сервер и обратно, а время обработки на обоих концах незначительно (скажем, 0 для этого примера для простоты). Как вы должны отправить каждый ресурс и ждать ответа по одному на время, это займет 10 * 100ms = 1,000 ms или 1 секунду, чтобы загрузить весь сайт.
чтобы обойти это, браузеры обычно открывают несколько подключений к веб-серверу (обычно 6). Это означает, что браузер может запускать несколько запросов одновременно, что намного лучше, но за счет сложности настройки и управления несколькими соединениями (что влияет как на браузер, так и на сервер). Давайте продолжим предыдущий пример и также говорят, что есть 4 соединения и простота, допустим, все запросы равны. В этом случае вы можете разделить запросы на все четыре соединения, поэтому у двух будет 3 ресурса для получения, а у двух будет 2 ресурса для получения всего десяти ресурсов (3 + 3 + 2 + 2 = 10). В этом случае наихудший случай - 3 круглых раза или 300 мс = 0,3 секунды-хорошее улучшение, но этот простой пример не включает в себя затраты на настройку этих нескольких соединений, а также ресурсные последствия их управления (которые я здесь не рассматривал поскольку этот ответ уже достаточно длинный, но настройка отдельных TCP-соединений требует времени и других ресурсов - для выполнения TCP-соединения, рукопожатия HTTPS, а затем до полной скорости из-за медленного запуска TCP).
HTTP / 2 позволяет отправлять несколько запросов на то же самое соединение - так что вам не нужно открывать несколько соединений, как указано выше. Таким образом, ваш браузер может сказать: "Дайте мне этот файл CSS. Дай мне этот файл JavaScript. Дай рис1.формат jpg. Дай рис2.формат jpg... Так далее." полностью использовать одно единственное соединение. Это имеет очевидное преимущество в производительности, не задерживая отправку тех запросов, ожидающих бесплатного соединения. Все эти запросы проходят через Интернет к серверу параллельно. Сервер отвечает на каждый из них,а затем они начинают возвращаться. На самом деле он даже более мощный, чем это, поскольку веб-сервер может реагировать на них в любом порядке и отправлять файлы в другом порядке или даже разбивать каждый запрошенный файл по кусочкам и перемешать файлы вместе. Это имеет вторичное преимущество одного тяжелого запроса, не блокирующего все другие последующие запросы (известные как глава блокировки линии проблема). Затем веб-браузеру поручено собрать все части вместе. В лучшем случае (при условии отсутствия ограничений пропускной способности-см. ниже), если все 10 запросов запускаются практически одновременно параллельно и сразу же отвечают на сервер, это означает, что у вас в основном есть одна поездка туда и обратно или 100 мс или 0,1 секунды, чтобы загрузить все 10 ресурсов. И это не имеет ни одного из недостатков, которые имели несколько соединений для HTTP / 1.1! Это также гораздо более масштабируемо, поскольку ресурсы на каждом веб-сайте растут (в настоящее время браузеры открывают до 6 параллельных соединений под HTTP/1.1, но должны ли они расти по мере усложнения сайтов?).
этой схемы показывает различия, и есть анимационная версия тоже.
Примечание: HTTP / 1.1 имеет концепцию из конвейеризация что также позволяет отправлять сразу несколько запросов. Однако их все равно нужно было вернуть, чтобы они были запрошены полностью, поэтому нигде не так хорошо, как HTTP/2, даже если концептуально это похоже. Не говоря уже о том, что это настолько плохо поддерживается как браузерами, так и серверами, что редко используется.
одна вещь, выделенная в комментариях ниже, - это то, как полоса пропускания влияет на нас здесь. Конечно, ваше интернет-соединение ограничено, как вы можете скачать и HTTP/2 Не адрес. Таким образом, если эти 10 ресурсов, рассмотренные в приведенных выше примерах, являются массивными изображениями качества печати, то они все равно будут загружаться медленно. Однако для большинства веб-браузеров пропускная способность является меньшей проблемой, чем задержка. Поэтому, если эти десять ресурсов являются небольшими элементами (особенно текстовые ресурсы, такие как CSS и JavaScript, которые могут быть gzipped, чтобы быть крошечными), как это очень распространено на веб-сайтах, то пропускная способность на самом деле не проблема - это просто объем ресурсы, которые являются проблемой, и 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) можете начать работать над каждым пунктом по мере его поступления ("О, это не так хорошо, как я думал, что это будет, поэтому я мог бы заказать что-то еще или вместо этого").
конечно, вы все еще ограничены размером вашего фургона почтальона (пропускной способностью), поэтому им, возможно, придется оставить некоторые пакеты в сортировочном офисе до следующего дня, если они заполнены на этот день, но это редко проблема по сравнению с задержкой в фактической отправке заказа через и обратно. Большая часть просмотра веб-страниц включает в себя отправку небольших букв взад и вперед, а не чем громоздкие пакеты.
надеюсь, это поможет.
Простые Ans (источник):
мультиплексирование означает, что ваш браузер может отправлять несколько запросов и получать несколько ответов "в комплекте" в одно TCP-соединение. Так что нагрузка, связанная с DNS-запросы и рукопожатий сохраняются файлы из того же сервера.
Сложный / Подробный Ans:
посмотрите ответ, предоставленный @BazzaDP.
HTTP/2 мультиплексирование - это отсутствие больших или медленных ресурсов, задерживающих доставку меньших или более быстрых ресурсов, и отсутствие необходимости в нескольких соединениях (и связанных с ними сложностях и накладных расходах) для загрузки нескольких ресурсов.
предположим, у вас есть шахта, и вы добываете из нее различные виды руды. У вас есть один конвейер с ведрами, как этот:
(а действительно большой). Каждое ведро на транспортере может содержать 1 кубический метр (1м3) руды (назовем это посылкой), а транспортер доставляет 1 ведро/минуту. Так что теоретически, чтобы извлечь 10 кусков руды, требуется 10 ведер, и так 10 минут. Но средний Шахтер не может загрузить ленту так быстро, как она движется, они могут загружать только половину каждого ведра, поэтому, когда один средний Шахтер загружает конвейер, он не используется полностью; 10 участков руды занимают 20 наполовину заполненных ведер и поэтому занимают 20 минут. Только супер-Шахтер смогите полно нагрузить ведро.
когда вы звоните вниз, чтобы сказать, какую нагрузку загрузить дальше, Шахтер должен отправить записку о том, что происходит (в одном ведре) и оставить следующие два ведра пустыми, чтобы люди наверху могли переместить правильные контейнеры в положение.
вы, наверное, уже догадались, что:
- конвейерная лента ваше сетевое соединение, своя скорость ваша ширина полосы частот.
- примечание и пустые ведра-это стоимость задержки. (Это не очень хорошая аналогия для латентности, но фундаментальный момент заключается в том, что запрос ресурса стоит дорого.)
сказать, мы начинаем с трех шахтеров:
- Джек имеет 2 посылки серебряной руды, чтобы доставить
- Иоанн 10 земельных гадить он должен убрать
- Стив имеет 1 посылку серебряной руды, чтобы доставить
...а потом, в какой-то момент, когда они частично закончили свои поставки, еще двое шахтеров показать:
- Кевин 6 земельных гадить он должен убрать
- Шейла имеет 1 посылку золотой руды, чтобы доставить
(Да, это очень нереально помоему. Но выгодно.)
на шахте у вас есть много людей и грузовиков, чтобы унести руду и извлечь из нее серебро, золото и железо (и взять добычу для использования в дорожных работах). Чем раньше вы получите материал, тем быстрее вы можете продать его, и вы действительно хотите чтобы продать этот материал как можно быстрее, прежде чем покупатели уйдут куда-то еще.
один HTTP / 1.соединение X
только один шахтер может загрузить одновременно. Джек подходит, отправляет записку в одном ведре и оставляет следующие 2 пустыми, затем начинает загружать свои 2 пакета серебряной руды на конвейер. Поскольку Джек-средний Шахтер, он может загрузить только половину ведра, когда конвейер проходит, поэтому его 2 посылки берут 4 ведра. Так что было 3 ведра накладных расходов ("я загружаю серебро") и 4 ведра руды. 7 ведер по 1 ведру в минуту = 7 минут.
затем Джон подходит, отправляет свою записку и оставляет следующие 2 ведра пустыми. Джон-супер-Шахтер (его полное имя Джон Генри), поэтому он может полностью загрузить каждое ведро, и поэтому его 10 пакетов руды берут 10 ведер. Таким образом, это было 3 ведра накладных расходов и 10 ведер руды; 13 минут.
Итак, вот ведра, которые пошли на конвейер
[ Jack's note ] [ empty ] [ empty ] [ half-loaded w/silver ore ] [ half-loaded w/silver ore ] [ half-loaded w/silver ore ] [ half-loaded w/silver ore ] [ John's note ] [ empty ] [ empty ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ fully-loaded w/spoil ] [ Steve's note ] [ empty ] [ empty ] [ half-loaded w/silver ore ] [ half-loaded w/silver ore ] [ Kevins's note ] [ empty ] [ empty ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ half-loaded w/spoil ] [ Sheila's note ] [ empty ] [ empty ] [ half-loaded w/gold ore ] [ half-loaded w/gold ore ]
45 ведер использовали в общей сложности, многие из них пустые или полупустые. Потребовалось 45 минут, чтобы достать золотую руду Шейлы, потому что она застряла за добычей Джона и Кевина. Тем временем золотодобытчику надоело смотреть, как добыча выходит, и он отправился на другую шахту.
Это один HTTP / 1.х соединение. Этот браузер (вы на minehead) может получать только один ресурс на нем в любой момент времени. Сервер (майнеры) может поставлять медленный ресурс (средний майнер), и/или может иметь дело с большим ресурсом (10 посылок Джона spoil). Запрос следующего ресурса занимает время (задержка).
HTTP / 1.у x есть что-то под названием конвейеризация для смягчения задержки, но есть проблемы с ее развертыванием, и это не останавливает большие нагрузки Джона или Кевина от получения на пути Шейлы груз золотой руды.
несколько HTTP / 1.X соединений
фирма конвейерной ленты предлагает вам подъем: они могут установить более новую модель с ведрами разделенными в половине и комнате для 2 шахтеров для того чтобы нагрузить на дне, каждом в его половину ведра. Пояс все еще может нести только то же самое количество руды, но, по крайней мере, теперь у вас есть два "канала" в нем, поэтому даже пара средних шахтеров может держать его полностью загруженным. В верхней части, каждая половина ведра поставлена к различному выход.
Итак, давайте посмотрим на тех же шахтеров и нагрузки:
- Джек имеет 2 посылки серебряной руды, чтобы доставить
- Иоанн 10 земельных гадить он должен убрать
- у Стива есть 1 Посылка серебряной руды для доставки
затем через некоторое время:
- Кевин 6 земельных гадить он должен убрать
- Шейла 1 участки рудного золота поставить
Джек и Джон оба шагают, посылают свои заметки в своих половинах ведер и оставляют следующие 2 пустыми. Затем Джек использует 4 половинки ведра, чтобы доставить свои 2 посылки серебряной руды пока Джон использует 4 половинки ведра, чтобы доставить 2 из своих 10 посылок с добычей. Джек отходит в сторону, Стив подходит, посылает записку, оставляет пустые ведра и доставляет руду, а Джон продолжает доставлять добычу.
пока Стив и Джон загружаются, Кевин появляется, а затем Шейла, и они стоят в очереди. Когда Стив закончит, Кевин займет ту сторону, а когда Джон закончит, Шейла займет ту сторону.
Итак, мы получаем эти ведра, каждое из которых разделено пополам:
[ Jack's note | John's note ] [ empty | empty ] [ empty | empty ] [ silver ore | spoil ] [ silver ore | spoil ] [ silver ore | spoil ] [ silver ore | spoil ] [ Steve's note | spoil ] [ empty | spoil ] [ empty | spoil ] [ silver ore | spoil ] [ silver ore | spoil ] [ Kevins's note | spoil ] [ empty | spoil ] [ empty | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | spoil ] [ spoil | Sheila's note ] [ spoil | empty ] [ spoil | empty ] [ spoil | gold ore ] [ empty | gold ore ]
Это два HTTP / 1.х соединений, каждое из которых может доставить один ресурс. Если веб-страница имеет несколько ресурсов, браузеры обычно открывают по крайней мере два соединения (иногда до 6 или 8 для настольных браузеров), чтобы они могли загружать вещи параллельно. Это сложно и занимает больше ресурсов на сервере, поскольку он должен управлять большим количеством соединений, но, по крайней мере, он получает золотую руду раньше.
HTTP/2 мультиплексирование
фирма конвейерной ленты имеет более новый подъем: как много станций загрузки на дне как вы хотите, где каждое ведро может быть помечено тем, что в нем есть, и все они доставляются на конвейер, где их можно выгрузить согласно тегам на их ведрах. Это нормально, если ведра перемешаны, они сортируются наверху. Все еще требуется одно ведро, чтобы сказать, что происходит, но вам больше не нужно оставлять пустые ведра. И каждое ведро может быть отправлено, когда оно будет готово, поэтому средние шахтеры не тратят пространство конвейера с полупустыми ведрами, так как они просто заполняют свое ведро а потом воткнуть его в щель вместе с другими ведрами.
Итак, давайте посмотрим на наших трудолюбивых шахтеров:
- Джек имеет 2 посылки серебряной руды, чтобы доставить
- Иоанн 10 земельных гадить он должен убрать
- у Стива есть 1 Посылка серебряной руды для доставки
затем через некоторое время:
- Кевин 6 земельных гадить он должен убрать
- Шейла имеет 1 пакет руды золота к доставить
поскольку ведра могут быть перемешаны, и нам больше не нужны пустые ведра, мы получаем что-то вроде этого (каждая строка-полное ведро):
[ Jack's note ] [ John's note ] [ Steve's note ] [ Jack's silver ore ] [ John's spoil ] [ Steve's silver ore ] [ John's spoil ] [ Jack's silver ore ] [ John's spoil ] [ John's spoil ] [ John's spoil ] [ Kevin's note ] This is when Kevin shows up... [ Sheila's note ] ...and then Sheila soon after [ John's spoil ] [ Kevin's spoil ] [ Sheila's gold ore ] [ John's spoil ] [ Kevin's spoil ] [ John's spoil ] [ Kevin's spoil ] [ John's spoil ] [ Kevin's spoil ] [ John's spoil ] [ Kevin's spoil ] [ Kevin's spoil ]
25 ведер, 5 с примечаниями и 20 полн-нагруженных с рудой. 25 минут. Сокращение с 28 в основном связано с улучшением системы маркировки (больше нет пустых ведер). Мы не могли сделать конвейерную ленту быстрее, мы просто использовали ее более эффективно.
но! Обратите внимание на золотую руду Шейлы. добыча Джона и Кевина больше не задерживалась, она просто смешивалась (мультиплексировалась) с потоком ведер, идущих к шахте, когда она была готова (когда появилась Шейла). Таким образом, он был доставлен всего через 16 минут вместо 28 или 45. Покупатель все еще был там. Выгода!
это мультиплексирование HTTP/2. Одно соединение, несколько запросов, смешанные ответы.
Это случилось играть, когда был только один ресурс для отправки (просто до того, как появились Кевин и Шейла, когда Джон все еще загружал добычу, и он был единственным, кто что-то делал), это делал наш супер-Шахтер Джон, поэтому у нас не было полупустых ведер. Если бы я начинал этот ответ с нуля, я бы настроил его так, чтобы это был Джек, и у нас была пара полупустых ведер, потому что мы могли бы, HTTP / 2 не может волшебным образом сделать медленный ресурс (Джек загружает свою серебряную руду) быстрее, поэтому, если бы это был Джек, работающий в одиночку, у нас был бы полупустой ковши. (Я бы также настроил его так, чтобы обычный шахтер мог полностью загрузить ведра и просто сделать Джек медленным, поскольку медленные ресурсы, вероятно, не являются нормой.)
Подробнее: HTTP / 2 Часто задаваемые вопросы.