Мультиплексирование
С HTTP 1.1 много времени тратится на простое ожидание. Браузер отправляет запросы и ждет ответа, а затем отправляет еще один GET и т. д. Неэффективное использование полосы пропускания. Время от времени он будет использовать конвейерную обработку, но это тоже страдает от того, что иногда запросы должны ждать запросов, выполненных ранее. Проблема блокировки головы линии.
С мультиплексированием практически нет ожидания, но браузеры могут просто запрашивать сотни вещей одновременно, и они будут доставлены в любом порядке, в котором они могут быть доставлены, и без необходимости ожидания отдельных потоков или объектов друг друга. (С приоритизацией и управлением потоком, чтобы помочь контролировать их должным образом.)
Это будет наиболее заметно на соединениях с высокой задержкой. Наглядную и понятную демонстрацию того, что он может делать, см. в демонстрационной версии gophertiles golang по адресу https://http2.golang.org/gophertiles?latency=1000 (требуется браузер с поддержкой HTTP/2)
Сжатие заголовков
Кроме того, HTTP/2 предлагает сжатие заголовков, что позволяет клиенту обрабатывать больше запросов на более ранних этапах существования TCP-соединения. В начале периода медленного запуска нового TCP-соединения может быть полезно втиснуть больше запросов, чтобы ответы возвращались раньше. Заголовки HTTP чрезвычайно повторяющиеся по своей природе.
Отправить на сервер
Сервер HTTP/2 может отправлять данные клиенту как если бы клиент запросил их, до того, как клиент запросит их! Если сервер считает, что клиент, вероятно, тоже этого захочет/нуждается, то можно сэкономить половину RTT.
person
Daniel Stenberg
schedule
06.03.2015