Понимание четырех столпов HTTP / 2

Постоянные сеансы, мультиплексированные потоки, сжатие заголовков и приоритезация

Основные принципы архитектуры веб-программного обеспечения, которые мы усвоили в упорных битвах, вот-вот вступят в новую эру. Внутренним инженерам и интерфейсным разработчикам Node.js необходимо понять, как HTTP / 2 сокращает задержку обработки запросов и ответов и увеличивает общую пропускную способность.

Запутанные веб-службы только что закончили вывод из эксплуатации всех своих серверов HTTP / 1.1. Теперь все работает на быстрых серверах HTTP / 2.

Девин и Кен проводили тесты производительности с использованием h2load тестовой системы, чтобы измерить пропускную способность HTTP / 2. Они сообщили о своих выводах в других сообщениях блога. В целом результаты были впечатляющими.

«Но что делает его намного быстрее?» - спросил Эрнесто, ни к кому конкретно. У него было несколько минут до утренней схватки, поэтому он начал читать документы IETF. (Он тот ботаник.) Это было нелегкое чтение.

Во время стендапа он упомянул Девину и Кену, что собирается изучить спекулятивный толчок. «Я хочу посмотреть, может ли push улучшить время загрузки нашей веб-страницы», - объявил он.

"Прохладный!" - сказал Девин.

«Есть драконы!» Кен ухмыльнулся.

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

«Вот что делает HTTP / 2 таким быстрым.

  • постоянные сеансы
  • мультиплексированные потоки
  • сжатие заголовка и
  • расстановка приоритетов

«Вместе эти четыре функции уменьшают задержку обработки запросов и ответов.

«Постоянные сеансы позволяют TCP-соединению между клиентом и сервером оставаться открытым даже при отсутствии активности в сети. Это означает, что накладные расходы на установление соединения должны ложиться только на первый запрос. Последующие запросы не должны выдавать DNS-запрос для разрешения имени хоста - экономия около 30 мс. Им также не нужно использовать протокол обмена ключами TLS - экономия где-то около 70 мс ».

Тут его прервал Девин. "Хм. Я думал, что постоянные сеансы уже доступны в HTTP / 1.1 благодаря использованию keep-alive заголовков ».

«Это правда, - продолжил Эрнесто, - и это оказалось полезным. HTTP / 2, с другой стороны, постоянен по своей конструкции, устраняя необходимость в дополнительных keep-alive заголовках ».

«Хорошо, понял», - сказал Кен, жестикулируя руками, чтобы он ускорил темп.

Эрнесто продолжил. «Мультиплексные потоки позволяют отправлять несколько запросов, не дожидаясь их полного ответа. Это устраняет узкое место head-of-line (HOL), которое было проклятием HTTP / 1.1 и стало корнем многих заветных взломов ».

К этому моменту он стал немного более оживленным. «Угадайте, почему мы используем URL-адреса встроенных данных! Угадайте, почему так много усилий было потрачено на создание спрайтов изображений! Угадайте, почему у Browserify и Webpack такие продуманные стратегии объединения! Ага. Узкое место HOL. И каждый из этих хаков ломает лучший из всех ускорителей производительности: кеширование. Необходимо изменить одно изображение, или один модуль JavaScript, или один компонент CSS - кеширование прекращается, и необходимо получить весь пакет ».

«Мультиплексные потоки - это великолепно, - вмешался Девин. - Похоже, это может изменить наше представление о веб-упаковке и доставке».

«Конечно», - сказал Эрнесто, прежде чем перейти в режим полной лекции. «Сжатие заголовков сокращает накладные расходы на обмен данными тремя способами: за счет индексации имен заголовков, за счет повторного использования неизмененных значений заголовков и за счет упаковки обмена в двоичный формат.

«Индексированные имена заголовков означают, что часто используемые имена заголовков могут быть представлены в виде небольшого числа, а не длинной строки. Например, cookie просто становится порядковым номером 32.

«Повторное использование неизмененных значений заголовка - это оптимизация, при которой значения заголовка добавляются в динамическую таблицу во время первого запроса и на них ссылаются по значению индекса, когда второй запрос повторно использует это же значение. Так, например, если значение заголовка cookie AB12CD34EF5600AABBCC отправляется вместе со 100 запросами ресурсов, только первый запрос несет 20-байтовые накладные расходы. Остальные 99 запросов просто передают номер индекса динамической таблицы, который был установлен для нее.

«Сжатие с использованием двоичного формата означает, что число 32 можно сжать, вставив его всего в 7 бит, а 20-байтовый файл cookie AB12CD34EF5600AABBCC можно сжать всего до 16 байтов. Это кодировка Хаффмана, разработанная специально для заголовков HTTP, где важен каждый бит ».

- TMI, - пробормотал Кен, начиная терять терпение.

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

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

«Итак, - спросил Девин, - приоритезация может позволить отправлять таблицы стилей и веб-шрифты достаточно рано, чтобы предотвратить мигание нестилизованного текста (FOUT)».

«Совершенно верно, - продолжил Эрнесто, - а приоритезация может также позволить отправлять сценарии достаточно рано, чтобы пользователь не столкнулся с« зависшими »приложениями. . . вы знаете, где страница загружается и выглядит красиво, но не реагирует на действия пользователя, потому что ее JavaScript все еще передается.

«Подводя итог - постоянные сеансы, мультиплексированные потоки и сжатие заголовков - все это способствует более быстрой загрузке страницы. А приоритезация позволяет точно настроить расписание передач в соответствии с требованиями конкретного веб-сайта ».

"Прохладный!" Девин был впечатлен. Ему нравились такие детали.

«А как насчет спекулятивного толчка?» спросил Кен, "Разве это не то, что вы собирались изучить?"

«Ааа, да, - замолчал Эрнесто, - это совсем другое». Он тянул время: «Я собираюсь поработать над этим сегодня».

Эрнесто еще не вышел из леса. Но, по крайней мере, он был на твердой ноге.

Никакие миниатюрные персонажи не пострадали при создании этого эпизода Запутанных веб-сервисов.