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

Эта статья основана на H2O, современном и быстром веб-сервере HTTP/2 и HTTP/1.

Здесь я расскажу о двух основных функциях: приоритизации и Cache-Aware Server-Push.

HTTP/2 сильно отличается по реализации и дизайну от HTTP/1.

HTTP/2 — это бинарный протокол, который использует потоки и фреймы для обмена данными, каждый запрос к серверу HTTP/2 открывает новый поток для каждого сообщения, отправляемого обратно клиенту, эти потоки разбиваются на несколько фреймов. которые имеют атрибуты, связанные с ними. Атрибуты, такие как: родительские потоки, данные, заголовки, вес, push_promise и другие, ознакомьтесь с официальной спецификацией для получения более подробной информации о потоках и кадрах.

Этот пост является перепечаткой https://blog.jacob.uk.com/http-2-and-content-delivery/ из моего блога https://blog.jacob.uk.com.

Приоритизация

При написании веб-приложений мы пытаемся разрешить наши активы в определенном порядке: сначала HTML (index.html) и таблицы стилей, затем JavaScript и изображения.

Мы делаем это для того, чтобы достичь того, что воспринимается как быстро загружаемое веб-приложение, доставка контента и стилей сначала заставляет наши приложения загружаться быстро, в то время как браузер продолжает извлекать все другие активы, такие как JavaScript и изображения под капотом.

Браузеры могут делать это благодаря позиционированию тегов скриптов и внешних ресурсов в нашей иерархии HTML, что позволяет нам установить приоритет для загрузки ресурсов.

Сегодня HTTP/2 может приоритизировать ответы на основе «взвешивания» кадра в потоке (взвешивание зависимостей), которое можно указать в форме заголовка HTTP-запроса. Это означает, что мы можем указать приоритет вручную для каждого HTTP-запроса, независимо от того, где на странице находится разметка.

Многие браузеры способны динамически вычислять, каким ресурсам следует отдавать приоритет при выполнении запросов HTTP/2, и блокировать менее важные. разрабатываем back-end сервисы.

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

Эталон времени загрузки по HTTP/2 через H2O

Сервер Push

HTTP/2 может расставлять приоритеты в порядке обслуживания запросов, но он также может обслуживать (отправлять) ответы клиенту без запроса клиентом этого ресурса в этом конкретном потоке (двунаправленный обмен между клиентом и сервером через HTTP/2). Этот механизм называется server-push.

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

Например, клиент запрашивает файл index.html, который обслуживается веб-сервером, поддерживающим HTTP/2, наш сервер настроен на обслуживание файла index.html и несколько других ресурсов в этом конкретном запросе, включая файлы CSS и JavaScript. , все индивидуально взвешены для определения приоритетов.

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

Однако ясно, что это не всегда оптимально, поскольку веб-браузеры вполне способны кэшировать статическое содержимое, которое не изменяется. HTTP/2 обрабатывает это с помощью CASPer (cache-aware server-push), что, по сути, означает, что веб-сервер хранит некоторую форму снимка кеша веб-браузера, чтобы определить, нужно ли ему отправлять ресурс или откладывать, поскольку браузер уже кэшируется, уменьшая время разговора по сети в приложении!

Факты и цифры

В настоящее время H2O может поддерживать невероятные 256 одновременных запросов на одно HTTP-соединение, это феноменальное число! Четко указывающее, что теперь мы можем доставлять весь наш контент и ресурсы в браузер одним единственным HTTP-запросом.

H2O может изменить приоритет и заблокировать определенные ресурсы по запросу веб-браузера, в настоящее время Firefox поддерживает такую ​​функцию и может запрашивать H2O блокирует запросы на изображения до тех пор, пока все ресурсы CSS и JavaScript не будут переданы в браузер, чтобы обеспечить хорошее восприятие. Пользовательский опыт.

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

Нужен сертификат TLS? Let’s Encrypt поможет вам.

H2O — это невероятно быстрый современный веб-сервер HTTP/1 и HTTP/2, написанный на C.

Посетите мой веб-сайт, подпишитесь на меня в Twitter, GitHub или просмотрите мой профессиональный опыт в LinkedIn.