Содержание

Мультиплексирование запроса

Мультиплексирование запроса позволяет параллельно выполнять неограниченное количество http запросов в рамках одного tcp соединения.

До появления Keep alive

С первых версий протокола http 1.0 для каждого http запроса от клиента к серверу создавалось отдельное tcp соединение. В рамках этого соединения клиент отправлял серверу запрос, в рамках этого же соединения сервер отправлял ответ и затем tcp соединение разрывалось.

Keep alive

Поскольку для загрузки современной веб-страницы требуется выполнить довольно много запросов, то создание отдельного tcp соединения для каждого запроса выливалось в значительное увеличение накладных расходов. Так, помимо html текста страницы нужно загрузить все сопутствующие css и js файлы, а также файлы изображений. И каждая такая загрузка – отдельный запрос. Для решения этой проблемы было придумано специальное расширение протокола http 1.0 под названием keep-alive: клиент отправлял серверу заголовок Connection: keep-alive и сервер держал tcp соединение с этим клиентом до тех пор, пока тот не стянет все необходимые ресурсы и/или в запросе или ответе не будет передан заголовок Connection: close. Начиная с версии http 1.1 все запросы по умолчанию стали keep-alive.

Ключевым недостатком данного подхода являлось то, что хотя в рамках одного tcp запроса можно было отправить несколько http запросов, но все они должны были быть отправлены строго последовательно. Соответственно, если один из запросов по какой-то причине не мог быть выполнен, он блокировал выполнение всех последующих (т.н. Head-Of-Line Blocking).

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

Мультиплексирование в http 2.0 решает проблему последовательных запросов. На каждый запрашиваемый клиентом ресурс создаётся так называемый поток. Каждый такой поток делится на кусочки, называемые фреймами. Фреймы передаются клиенту вперемешку, что приводит к тому, что потоки (и стоящие за ними ресурсы) передаются по сути параллельно. Задача клиента – воссоздать из фреймов потоки (т.е. сами ресурсы).

Таким образом, при мультиплексировании клиент не просто отправляет несколько http запросов в рамках одного tcp соединения, что-то подобное было уже http 1.0 с расширением keep-alive. Запросы и ответы к тому же распараллеливаются (насколько это в принципе возможно).