3 мин чтения
HTTP и HTTP/2: ключевые различия
Подробно разбираем, чем HTTP/2 отличается от HTTP/1.1: мультиплексирование, сжатие заголовков, Server Push и их влияние на скорость сайтов.

Проблема HTTP/1.1
HTTP — основа современного веба. С момента появления в 1997 году HTTP/1.1 ежедневно обслуживает миллиарды запросов. Но в его архитектуре заложено фундаментальное ограничение: он работает по строгой модели «один запрос — один ответ» на каждое TCP-соединение.
Из-за этого возникает известное узкое место — блокировка начала очереди (Head-of-Line Blocking, HOL): браузер не может отправить следующий запрос, пока не получит ответ на текущий. Чтобы обойти это, браузеры открывают по 6–8 параллельных соединений на домен, а разработчики прибегают к разным ухищрениям:
объединяют CSS- и JavaScript-файлы в один;
используют спрайты, чтобы сократить число запросов за изображениями;
распределяют ресурсы по нескольким доменам (domain sharding).
Такие обходные пути усложняют проект и его поддержку — и именно эти проблемы должен был решить HTTP/2.
Что нового в HTTP/2
Мультиплексирование — главное изменение
Самое важное улучшение HTTP/2 — мультиплексирование. Теперь одно TCP-соединение может одновременно передавать сотни запросов и ответов. Каждый из них разбивается на небольшие бинарные фреймы с уникальным идентификатором потока, поэтому сервер и клиент могут свободно их чередовать.
Это устраняет HOL-блокировку на уровне HTTP и делает ненужными такие приёмы, как domain sharding и склейка файлов.
Бинарный протокол
HTTP/1.1 — текстовый протокол: заголовки и тело сообщения передаются в виде читаемых строк. HTTP/2 перешёл на компактный бинарный формат, поэтому разбор сообщений стал заметно быстрее, эффективнее и надёжнее.
Сжатие заголовков с помощью HPACK
В HTTP/1.1 такие заголовки, как Cookie, User-Agent и Authorization, целиком отправляются с каждым запросом — зачастую это сотни байт, которые повторяются снова и снова.
HTTP/2 сжимает заголовки алгоритмом HPACK. Он хранит общую таблицу уже отправленных заголовков и передаёт только изменения. Обычно это уменьшает объём заголовков на 85–95%.
Server Push
В HTTP/2 у сервера появилась возможность заранее отправлять ресурсы, ещё до того как клиент их запросит. Например, когда браузер запрашивает HTML-страницу, сервер может сразу отправить CSS- и JS-файлы, которые точно понадобятся.
На практике Server Push оказалось сложно правильно настроить, и он не всегда ускорял загрузку. В HTTP/3 от него фактически отказались.
Приоритизация потоков
HTTP/2 позволяет клиенту назначать каждому потоку уровень приоритета. Браузер может сообщить, что CSS важнее фоновых изображений, и сервер распределит пропускную способность разумнее.
Сравнение
Формат: HTTP/1.1 — текстовый, HTTP/2 — бинарный.
Соединения: HTTP/1.1 — 6–8 параллельных, HTTP/2 — одно мультиплексированное.
Заголовки: в HTTP/1.1 повторяются целиком, в HTTP/2 сжимаются с помощью HPACK.
Server Push: в HTTP/1.1 нет, в HTTP/2 есть.
Приоритизация: в HTTP/1.1 нет, в HTTP/2 есть.
Шифрование: в HTTP/1.1 необязательно, в HTTP/2 на практике обязательно (TLS).
Влияние на реальную производительность
Переход на HTTP/2 обычно ускоряет загрузку страниц на 10–50%, особенно если на странице много ресурсов. Сильнее всего выигрыш заметен в сетях с высокой задержкой — на мобильном интернете и при работе с географически удалёнными серверами.
И самое приятное: код приложения менять не нужно. HTTP/2 работает на транспортном уровне, поэтому обычно достаточно включить его на сервере или в CDN.
Как проверить, используется ли HTTP/2
Откройте в браузере DevTools (F12), перейдите на вкладку Network и щёлкните правой кнопкой мыши по заголовкам столбцов, чтобы включить столбец Protocol. Для соединений по HTTP/2 там будет указано h2. Большинство современных сайтов и CDN уже работают по HTTP/2.
Вывод
HTTP/2 — большой шаг вперёд. Мультиплексирование, сжатие заголовков и бинарный протокол ускоряют загрузку сайтов, и разработчикам не приходится менять ни строчки кода. Если ваша инфраструктура всё ещё работает на HTTP/1.1, самое время обновиться.
