предисловие
HTTP2.0 значительно повышает производительность сети и дополнительно снижает задержку в сети благодаря полной семантической совместимости HTTP1.1. Добейтесь низкой задержки и высокой пропускной способности. Для фронтенд-разработчиков усилия по оптимизации сокращаются. В этой статье основное внимание будет уделено роли следующих новых функций, рабочему процессу и тому, как лучше завершить работу по оптимизации для внедрения HTTP2.0.
- Бинарное кадрирование
- сжатие заголовка
- управление потоком
- мультиплексирование
- приоритет запроса
- пуш сервера
Бинарное кадрирование
Без изменения семантики, методов и кодов состояния HTTP1.x. В случае полей URL и заголовков, как HTTP 2.0 преодолевает ограничения производительности HTTP 1.1, улучшает производительность передачи и обеспечивает низкую задержку и высокую пропускную способность? Одним из ключевых моментов является добавление уровня двоичного кадрирования между прикладным уровнем (HTTP) и транспортным уровнем (TCP).
Разбираясь с бинарным фреймингом и его ролью, давайте сначала заложим немного знаний о фреймах:
- Кадр: наименьшая единица связи HTTP2.0, все кадры имеют общий 8-байтовый заголовок, который содержит длину, тип, флаг и зарезервированный бит кадра, а также как минимум идентификатор, идентифицирующий поток, к которому относится текущий принадлежит кадру, кадры несут определенные типы данных, такие как заголовки HTTP, полезные данные и т. д.
- Сообщение: коммуникационная единица размером больше кадра, относящаяся к логическим сообщениям HTTP, таким как запросы и ответы. состоит из одного или нескольких кадров
- Поток: единица связи, превышающая размер сообщения. Это виртуальный канал TCP-соединения, который может передавать двунаправленные сообщения. Каждый поток имеет уникальный целочисленный идентификатор
Что такое бинарное кадрирование
На уровне двоичных кадров HTTP 2.0 делит всю передаваемую информацию на более мелкие сообщения и кадры и кодирует их в двоичном формате для их инкапсуляции. Среди них заголовок информации заголовка в HTTP1.X инкапсулируется во фрейм заголовков, а тело запроса будет инкапсулировано в фрейм данных.
Как работает бинарное кадрирование
Связь HTTP2.0 завершается через соединение TCP, которое может передавать любое количество двунаправленных потоков данных, и каждый соответствующий поток данных отправляется в форме сообщения. Вместо этого сообщение состоит из одного или нескольких кадров, которые могут быть отправлены не по порядку, а затем повторно собраны на основе идентификатора потока в заголовке каждого кадра.
Вклад двоичного кадрирования в усилия по оптимизации производительности
Бинарное кадрирование в основном обеспечивает основу для различных функций, описанных ниже. Он может делить и инкапсулировать данные в меньшие и более удобные данные. Во-первых, в одноканальном многоресурсном режиме нагрузка на сервер снижается, использование памяти меньше, а пропускная способность канала выше. Это можно испытать в сочетании с мультиплексированием ниже. С другой стороны, состояние перегрузки сети улучшается за счет сокращения TCP-каналов, и в то же время сокращается время медленного запуска. Более быстрое восстановление после перегрузки и потери пакетов.
сжатие заголовка
HTTP1.1 не поддерживает сжатие заголовков HTTP, для чего появились SPDY и HTTP2.0. SPDY использует алгоритм DEFLATE, а HTTP2.0 использует алгоритм HPACK, специально разработанный для сжатия заголовков.
Что такое сжатие заголовков
Каждое сообщение HTTP1.x (запрос или ответ) содержит информацию заголовка для описания атрибутов ресурса. А HTTP2.0 использует таблицу заголовков между клиентом и сервером для отслеживания и хранения ранее отправленных пар ключ-значение. Определение заголовков запросов и ответов практически не изменилось в HTTP2.0, за исключением того, что все ключи заголовков должны быть строчными, а строки должны быть независимыми :method:, :scheme:, :host:, :path: эти пары ключ-значение
Как работает сжатие заголовков
Для одних и тех же данных больше не нужно повторно отправлять каждый запрос и ответ. Каждая новая пара ключ-значение заголовка либо добавляется в конец текущей таблицы, либо заменяет предыдущее значение в таблице. Таблица заголовков всегда существует во время соединения HTTP2.0 и постепенно обновляется клиентом и сервером.
Вклад первой работы по оптимизации производительности сжатия
Таблица заголовков использует технологию сжатия заголовков в HTTP 2.0. Сделайте заголовок более компактным и быстрым для передачи, что выгодно для среды мобильной сети. Уменьшите объем данных на одно соединение, чтобы можно было улучшить состояние перегрузки сети.
управление потоком
HTTP 2.0 предоставляет простой механизм для потока данных и трафика соединения:
- Трафик основан на каждом переходе HTTP-ссылки, а не на сквозном контроле.
- Управление потоком основано на кадрах обновления окна, то есть приемник вещает, сколько байтов потока данных он готов принять, и сколько байтов он хочет получить для всего канала.
- Управление потоком является направленным, то есть получатель может установить любой размер окна для каждого потока или даже всей ссылки в соответствии со своей ситуацией.
- Управление потоком может быть отключено получателем как для отдельных потоков, так и для всего канала.
- Тип кадра определяет, применяется ли к кадру управление потоком.В настоящее время управлению потоком подлежат только кадры ДАННЫЕ, а все остальные типы кадров не занимают место в окне управления потоком. Это гарантирует, что важные кадры управления не блокируются управлением потоком.
мультиплексирование
В HTTP 1.1 клиент браузера имеет определенное количество ограничений на запросы под одним и тем же доменным именем в одно и то же время. Запросы, превышающие лимит, будут заблокированы. А мультиплексирование в HTTP 2.0 оптимизирует эту производительность.
Что такое мультиплексирование
Основанный на уровне двоичного кадрирования, HTTP 2.0 может одновременно отправлять запросы и ответы на основе общего TCP-канала. Сообщения HTTP разбиваются на отдельные кадры без нарушения семантики самого сообщения, отправляются с чередованием и повторно собираются на другом конце на основе идентификатора потока и заголовков.
Как работает мультиплексирование
Давайте посмотрим, как это работает, сравнив его с HTTP1.X.
- HTTP1.x
- HTTP2.0
Вклад мультиплексирования в усилия по оптимизации производительности
- Запросы и ответы можно отправлять параллельно и чередовать, не влияя друг на друга.
- Отправляйте несколько запросов и ответов параллельно, используя только одну ссылку
- Устраните ненужные задержки, сократив тем самым время загрузки страницы
- Больше никаких усилий по обходу ограничений HTTP1.x
приоритет запроса
Как только сообщение HTTP разделено на множество отдельных кадров, производительность может быть дополнительно оптимизирована за счет оптимизации чередования и порядка передачи этих кадров.
Что такое приоритет запроса
Каждый поток может иметь 31-битное значение приоритета: 0 означает самый высокий приоритет, 2 в 31-й степени -1 означает самый низкий приоритет.
Как работает приоритезация запросов
Клиент четко указывает приоритет, и сервер может использовать этот приоритет в качестве основы для интерактивных данных, например, приоритет клиента установлен как .css>.js>.jpg. Сервер возвращает результаты в таком порядке, что более способствует эффективному использованию базового соединения и улучшает взаимодействие с пользователем. Однако при использовании приоритета запроса следует обратить внимание на то, поддерживает ли сервер приоритет запроса и не вызовет ли это проблему блокировки головы очереди, например, медленный ответный запрос с высоким приоритетом будет блокировать взаимодействие других Ресурсы.
Вклад приоритета запроса в усилия по оптимизации производительности
Сервер может управлять распределением ресурсов (ЦП, памяти, полосы пропускания) в соответствии с приоритетом потока, и после того, как данные ответа готовы, кадр с наивысшим приоритетом отправляется клиенту первым. Браузер может отправлять запросы сразу после обнаружения ресурса, указывать приоритет каждого потока и позволять серверу определять оптимальный порядок ответов. Таким образом, запросы не нужно ставить в очередь, что не только экономит время, но и позволяет максимально использовать каждое соединение.
пуш сервера
Новая мощная функция, добавленная в HTTP 2.0, заключается в том, что сервер может отправлять несколько ответов на клиентский запрос. Сервер отправляет ресурсы клиенту без явного запроса от клиента.
Что такое push-уведомление сервера (в HTTP 2.0)
Сервер заранее возвращает несколько ответов в соответствии с запросом клиента и отправляет клиенту дополнительные ресурсы. Как показано на рисунке ниже, клиент запрашивает поток 1 (/page.html). Сервер отправляет поток 2 (/script.js) и поток 4 (/style.css), возвращая сообщение потока 1.
Как работает отправка сервера
- Кадр PUSH_PROMISE — это сигнал о том, что сервер намеренно передает ресурсы клиенту.
- Кадр PUSH_PROMISE содержит только заголовок предварительно отправленного ресурса. Если у клиента нет мнения о кадре PUSH_PROMISE, сервер отправляет ответный кадр DATA после кадра PUSH_PROMISE. Если клиент кэшировал ресурс и не нуждается в отправке, он может отклонить кадр PUSH_PROMISE.
- PUSH-PROMISE должен следовать принципу «запрос-ответ» и может подталкивать ресурсы, только отвечая на запросы.
- Кадр PUSH_PROMISE должен быть отправлен перед возвратом ответа, чтобы избежать состояния гонки на стороне клиента (состояние гонки означает, что в случае многопоточности разные последовательности выполнения заставят компьютер выполнять разные результаты и правильность).
- После подключения HTTP2.0 клиент и сервер обмениваются кадрами SETTINGS, тем самым ограничивая максимальное количество двусторонних параллелизма. Таким образом, клиенты могут ограничить количество push-потоков или полностью отключить серверное push-уведомление, установив для этого параметра значение 0.
- Все выталкиваемые ресурсы должны подчиняться политике одного и того же источника. Другими словами, сервер не может передавать сторонние ресурсы клиенту по своему желанию, но должен быть подтвержден обеими сторонами.
Вклад сервера в усилия по оптимизации производительности
Серверная отправка — это механизм отправки данных перед запросом клиента. В HTTP 2.0 сервер может отправлять несколько ответов на запрос клиента. Если запрос отправлен с вашей домашней страницы, сервер может ответить содержимым домашней страницы, логотипами и таблицами стилей, поскольку он знает, что клиент будет использовать эти вещи. Это не только сокращает количество избыточных шагов передачи данных, но также увеличивает скорость отклика страницы и улучшает взаимодействие с пользователем.