Что означает мультиплексирование в HTTP/2

Может кто-нибудь объяснить мультиплексирование в отношении HTTP/2 и как он работает?

Ответ 1

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

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

Когда вы загружаете веб-страницу, она загружает 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 * 100 мс = 1000 мс или 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, которые могут быть сжаты, чтобы быть крошечными), как это часто бывает на веб-сайтах, то пропускная способность на самом деле не является проблемой - проблема заключается в большом количестве ресурсов. и 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) сможете начать работать с каждым предметом по мере его поступления ("о, это не так хорошо, как я думал, так что я мог бы захотеть заказать что-то еще или вместо")).

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

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

Ответ 2

Простые Ans (Источник):

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

Комплексные/подробные анны:

Посмотрите ответ, предоставленный @BazzaDP.

Ответ 3

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

Мультиплексирование нарушает строгую семантику запрос-ответ и позволяет устанавливать отношения один-ко-многим или многие-ко-многим.

HTTP1 VS HTTP2 interchange process

Ответ 4

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

Скажем, у вас есть шахта, и вы выкапываете из нее различные виды руды. У вас есть одна конвейерная лента с такими ведрами:

введите описание изображения здесь

(но действительно большой). Каждое ведро на конвейере может содержать 1 кубический метр (1 м³) руды (позвольте назвать его посылкой), а конвейер доставляет 1 ведро/минуту. Поэтому, теоретически, для извлечения 10 посылок руды требуется 10 ведер и 10 минут. Но средний шахтер не может загружать ленту так быстро, как она перемещается, они могут загружать только половину каждого ведра, поэтому, когда один средний шахтер загружает конвейер, он не полностью используется; 10 посылок из руды занимают 20 полузаполненных ведер, и поэтому занять 20 минут. Только супер-майнер может полностью загрузить ковш.

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

Вы, вероятно, уже сейчас судили, что:

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

Скажем, мы начинаем с трех шахтеров:

  • У Джека есть 2 посылки из серебряной руды для доставки
  • У Джона 10 посылок, которые ему нужно очистить.
  • Стив имеет 1 пакет серебряной руды для доставки

... и затем в какой-то момент, когда они частично участвуют в их поставках, появляются еще два шахтера:

  • У Кевина есть 6 посылок, которые ему нужно очистить.
  • Шейла имеет 1 пакет золота для доставки

(Да, это очень нереалистичная шахта, но выгодная.)

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

Одно соединение HTTP/1.x

Одновременно может загружаться только один шахтер. Джек поднимается, отправляет свою записку в одно ведро и оставляет следующие две пустые, затем начинает загружать свои 2 посылки из серебряной руды на конвейер. Поскольку Джек - средний шахтер, он может загружать только половину ведра, когда конвейер проходит, поэтому его 2 посылки берут 4 ведра. Так было 3 ведра накладных расходов ( "Я загружаю серебро" ) и 4 ведра руды. 7 ведер на 1 ведро/минута = 7 минут.

Затем Джон поднимается, отправляет свою записку и оставляет следующие 2 ведра пустыми. Джон - супер-шахтер (его полное имя - Джон Генри), поэтому он может полностью загружать каждое ведро, и поэтому его 10 партий руды занимают 10 ведер. Таким образом, было 3 ведра накладных расходов и 10 ведер руды; 13 минут.

Между тем появляется Кевин, а затем Шейла; но они должны ждать. Это строгая система массового обслуживания (мы британцы), поэтому Кевин будет следующим в очереди.

Наконец, Стив повернулся, потом Кевин, а затем Шейла.

Итак, вот ведра, которые пошли на конвейер

[           Jack note           ]
[              empty              ]
[              empty              ]
[     half-loaded w/silver ore    ]
[     half-loaded w/silver ore    ]
[     half-loaded w/silver ore    ]
[     half-loaded w/silver ore    ]
[           John 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 note           ]
[              empty              ]
[              empty              ]
[     half-loaded w/silver ore    ]
[     half-loaded w/silver ore    ]
[          Kevins 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 note          ]
[              empty              ]
[              empty              ]
[      half-loaded w/gold ore     ]
[      half-loaded w/gold ore     ]

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

Это одно соединение HTTP/1.x. Браузер (вы на шахте) может получать только один ресурс на нем в любой момент времени. Сервер (шахтеры) может поставлять медленный ресурс (средний шахтер) и/или может иметь дело с большим ресурсом (John 10 посылок добычи). Запрос на следующий ресурс требует времени (латентность).

HTTP/1.x имеет что-то, называемое конвейерной обработкой для смягчения латентности, но есть проблемы с его развертыванием, и это не мешает Джону или Кевину большие нагрузки от добычи на пути загрузки Шейлы золотой руды.

Несколько соединений HTTP/1.x

Фирма конвейерной ленты предлагает вам модернизацию: они могут установить новую модель с ведрами, разделенными пополам, и комнатой для двух горняков для загрузки внизу, каждая в свою половину ведра. Пояс может по-прежнему содержать только одно и то же количество руды, но по крайней мере теперь у вас есть два "канала", поэтому даже пара средних шахтеров может полностью загрузить его. В верхней части каждая половина ведра поставляется на другой выход.

Итак, давайте посмотрим на те самые шахтеры и нагрузки:

  • У Джека есть 2 посылки из серебряной руды для доставки
  • У Джона 10 посылок, которые ему нужно очистить.
  • Стив имеет 1 посылку из серебряной руды для доставки

затем после бит:

  • У Кевина есть 6 посылок, которые ему нужно очистить.
  • Шейла имеет 1 партию золотой руды для доставки
Джек и Джон оба поднимаются, отправляют свои заметки пополам в ведра и оставляют следующие два пустых. Затем Джек использует 4 полукопа, чтобы доставить свои 2 посылки из серебряной руды, в то время как Джон использует 4 полукопа, чтобы доставить 2 из его 10 посылок. Джек отходит, Стив поднимается, отправляет записку и оставляет пустые ведра и доставляет свою руду, пока Джон продолжает доставлять свою добычу.

Пока Стив и Джон загружаются, появляется Кевин, а затем Шейла, и они стоят в очереди. Когда Стив закончил, Кевин берет на себя эту сторону, и когда Джон делает это, Шейла берет на себя эту сторону.

Итак, мы получаем эти ведра, каждый из которых поделен на половину:

[           Jack note           |           John note           ]
[              empty              |              empty              ]
[              empty              |              empty              ]
[           silver ore            |              spoil              ]
[           silver ore            |              spoil              ]
[           silver ore            |              spoil              ]
[           silver ore            |              spoil              ]
[          Steve note           |              spoil              ]
[              empty              |              spoil              ]
[              empty              |              spoil              ]
[           silver ore            |              spoil              ]
[           silver ore            |              spoil              ]
[          Kevins note          |              spoil              ]
[              empty              |              spoil              ]
[              empty              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |              spoil              ]
[              spoil              |          Sheila note          ]
[              spoil              |              empty              ]
[              spoil              |              empty              ]
[              spoil              |            gold ore             ]
[              empty              |            gold ore             ]

28 ведер вместо 45, а золотая руда Шейлы прибыла раньше, но все еще была задержана Джоном и Кевином. 28 минут лучше, но покупатель золота все еще устал ждать и уходить.

Это два соединения HTTP/1.x, каждый из которых может предоставить один ресурс. Если веб-страница имеет несколько ресурсов, браузеры обычно открывают как минимум два подключения (иногда до 6 или 8 для настольных браузеров), чтобы они могли загружать файлы параллельно. Это сложно и требует больше ресурсов на сервере, поскольку он должен управлять большим количеством подключений, но, по крайней мере, он получает ранее добытую золотую руду.

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

У фирмы конвейерная лента новая модернизация: как и многие загрузочные станции внизу, где вы хотите, где каждое ведро можно пометить тем, что у него есть, и все они доставляются до конвейера, где они могут быть выгружены согласно биркам на их ведрах. Хорошо, если ведра смешиваются, они сортируются вверху. По-прежнему требуется одно ведро, чтобы сказать, что произойдет, но вам больше не нужно оставлять пустые ведра. И каждое ведро может быть отправлено, когда оно готово, поэтому средние шахтеры не тратят пространство конвейера с полупустыми ведрами, так как они просто заполняют свое ведро, а затем вставляют его вместе с остальными ковшими.

Итак, посмотрим на наших трудолюбивых шахтеров:

  • У Джека есть 2 посылки из серебряной руды для доставки
  • У Джона 10 посылок, которые ему нужно очистить.
  • Стив имеет 1 посылку из серебряной руды для доставки

затем после бит:

  • У Кевина есть 6 посылок, которые ему нужно очистить.
  • Шейла имеет 1 пакет золота для доставки

Так как ведра могут быть перемешаны, и нам больше не нужны пустые ведра, мы получаем что-то вроде этого (каждая строка представляет собой полный ковш):

[           Jack note           ]
[           John note           ]
[          Steve note           ]
[        Jack silver ore        ]
[           John spoil          ]
[       Steve silver ore        ]
[           John spoil          ]
[        Jack silver ore        ]
[           John spoil          ]
[           John spoil          ]
[           John spoil          ]
[          Kevin note           ] This is when Kevin shows up...
[          Sheila note          ] ...and then Sheila soon after
[           John spoil          ]
[          Kevin spoil          ]
[        Sheila gold ore        ]
[           John spoil          ]
[          Kevin spoil          ]
[           John spoil          ]
[          Kevin spoil          ]
[           John spoil          ]
[          Kevin spoil          ]
[           John spoil          ]
[          Kevin spoil          ]
[          Kevin spoil          ]

25 ведер, 5 с нотами и 20 полностью загружены рудой. 25 минут. Снижение с 28 в основном связано с улучшением системы мечения (не более пустых ведер). Мы не могли сделать конвейер быстрее, мы просто использовали его более эффективно.

Но! Заметьте, что золотая руда Шейлы не была задержана Джоном и Кевином больше портиться, она просто была смешанной (мультиплексированной) с потоком ведер, идущих к шахте, когда она была готова (когда появилась Шейла). Таким образом, он был доставлен через 16 минут вместо 28 или 45. Покупатель все еще был там. Прибыль!

Это HTTP/2 мультиплексирование. Одно соединение, несколько запросов, смешанные ответы.

Случилось так, что когда был отправлен только один ресурс (незадолго до появления Кевина и Шейлы, когда Джон все еще загружал добычу, и он был единственным, кто делал что-либо), это был наш супер-шахтер Джон, который был делая это, поэтому у нас не было полупустых ведер. Если бы я начинал этот ответ с нуля, я бы его настраивал, так что вместо этого у нас был Джек, и у нас было несколько полупустых ведер, потому что мы могли бы иметь, HTTP/2 не может магически сделать медленный ресурс (Джек загружает свои серебряная руда) быстрее, поэтому, если бы Джек работал один, у нас были бы полупустые ведра. (Я бы также подстроил его так, чтобы обычный шахтер мог полностью загружать ведра и просто заставлял Джека замедляться, поскольку медленные ресурсы, вероятно, не являются нормой.)

Подробнее: HTTP/2 часто задаваемые вопросы.