2 min. читати

HTTP/2: Повний посібник з сучасної веб-продуктивності

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

У цьому посібнику ви знайдете все, що вам потрібно знати про HTTP/2 – відйого основної механіки та переваг продуктивності до практичних кроків розгортання. Незалежно від того, чи ви розробник, який прагне оптимізувати свій веб-сервер, чи просто цікавитеся тим, як працюють сучасні веб-сайти, тут ви знайдете корисну інформацію.

Швидка відповідь: Що таке HTTP/2 і чому він важливий

HTTP/2 – це значне оновлення протоколу передачі гіпертексту версії 1.1, стандартизоване Робочою групою з розробки інтернету в документі RFC 7540 (травень 2015 року). Він спрямований на зменшення затримок, покращення використання мережевих ресурсів та прискорення завантаження веб-сторінок, зберігаючи при цьому повну зворотну сумісність з існуючою семантикою HTTP.

У 2026 році впровадження HTTP/2 буде майже повсюдним. Згідно з даними W3Techs, понад 1/3 провідних веб-сайтів активно використовують HTTP/2, а більшість великих CDN (Cloudflare, AWS CloudFront, Fastly) вмикають його за замовчуванням для HTTPS-трафіку. Якщо ваш сайт працює по HTTPS на сучасному веб-сервері, ви, швидше за все, вже користуєтеся перевагами HTTP/2 без будь-яких додаткових налаштувань.

Протокол вводить кілька функцій заголовків, які усувають вузькі місця в продуктивності HTTP 1.1:

  • Мультиплексування: Кілька потоків даних одночасно передаються через одне TCP-з’єднання
  • Стиснення заголовків (HPACK): Впровадження стиснення полів заголовків, що значно зменшує надлишкові метадані заголовків HTTP
  • Двійковий рівень кадрування: Повністю загальний рівень кадрування, який замінює текстові команди ефективним двійковим кадруванням повідомлень
  • Серверне проштовхування: Проактивна доставка ресурсів до того, як браузер явно запитує їх
  • Пріоритезація потоків: Підказки клієнта, які повідомляють серверам, які ресурси важливіші

Ось що це означає на практиці:

  • Швидше завантаження сторінок, особливо на ресурсоємних сайтах
  • Менше TCP-з’єднань, необхідних для кожного походження
  • Краща продуктивність у мобільних мережах з високою затримкою
  • Покращене використання мережі в цілому

Від HTTP/0.9 до HTTP/2: коротка історія

Протокол HTTP пройшов довгий шлях відтоді, як Тім Бернерс-Лі представив HTTP/0.9 у 1991 році як простий механізм для отримання HTML-документів. У 1996 році з’явився HTTP/1.0, який додав заголовки і коди стану, а HTTP/1.1 був стандартизований в RFC 2068 (1997) і пізніше доопрацьований в RFC 2616 (1999). Протягом майже двох десятиліть HTTP/1.1 слугував основою клієнт-серверної комунікації в Інтернеті.

Але Інтернет змінився кардинально. Сучасні веб-сторінки перетворилися з простих документів на складні додатки, що завантажують десятки пакетів JavaScript, файлів CSS, зображень та викликів API. Навіть з широкосмуговим підключенням і потужним обладнанням архітектура HTTP/1.1 створювала вузькі місця:

  • Блокування лінії на чолі: Кожне TCP-з’єднання могло обробляти лише один запит за раз, що призводило до зайвого мережевого трафіку, оскільки ресурси ставали в чергу
  • Накладні витрати на з’єднання: Десктопні та мобільні веб-браузери зазвичай відкривають 6-8 паралельних TCP-з’єднань на одне джерело, щоб обійти це обмеження
  • Надлишкові заголовки: Кожен HTTP-запит надсилає одні й ті ж багатослівні заголовки (cookies, user-agent, accept заголовки) кілька разів

Google визнав ці проблеми і запустив проект SPDY у 2009 році. Вперше реалізований у браузері Chrome близько 2010 року, SPDY запровадив кілька інновацій:

  • Двійковий фреймінг замість текстових протоколів
  • Мультиплексування декількох запитів через одне з’єднання
  • Стиснення заголовків для зменшення накладних витрат
  • Пріоритетність потоків для критичних ресурсів

Робоча група IETF HTTP побачила потенціал SPDY і прийняла його як відправну точку для HTTP/2 у 2012 році. Після тривалої роботи робочої групи ietf http, RFC 7540 (HTTP/2) і RFC 7541 (HPACK) були опубліковані в травні 2015 року.

Впровадження браузерів відбулося швидко:

  • Chrome відмовився від SPDY на користь HTTP/2, починаючи з Chrome 51 (травень 2016)
  • Firefox додав підтримку HTTP/2 у версії 36 (лютий 2015)
  • Safari з’явився у версії 9 (вересень 2015 року)
  • Microsoft Edge постачається з підтримкою HTTP/2 з початкового випуску
  • Навіть Internet Explorer 11 отримав підтримку HTTP/2 у Windows 8.1 і новіших версіях

Цілі розробки та ключові відмінності від HTTP/1.1

HTTP/2 зберігає повну сумісність з семантикою HTTP/1.1. Такі методи, як GET і POST, працюють ідентично. Коди стану залишаються незмінними. URI і поля заголовків HTTP відповідають тим же правилам. Змінюється лише те, як ці дані рухаються по дроту – механіка транспортного рівня, яка визначає фактичну швидкість передачі даних.

Цілі розробки протоколу були чіткими:

МетаЯк це досягається за допомогою HTTP/2
Зменшити затримкуМультиплексування усуває блокування на рівні заголовка HTTP
Краще використання з’єднанняЄдине TCP-з’єднання обробляє всі запити до джерела
Вирізати заголовок над головоюСтиснення HPACK зменшує раніше передані значення заголовків
Підвищення продуктивності мобільних пристроївМенша кількість з’єднань і менші заголовки виграють у мережах з високою затримкою

Перевага цього дизайну полягає у зворотній сумісності на рівні програми. Ваш існуючий код веб-додатку – маршрути, обробники, логіка відповідей – не потребує змін. Тільки клієнтський і серверний стек повинні підтримувати HTTP/2, щоб скористатися перевагами.

Це різко контрастує з обхідними шляхами HTTP/1.1, які розробникам доводилося реалізовувати вручну:

  • Шардинг доменів: Розподіл активів між кількома доменами для відкриття більшої кількості з’єднань
  • Конкатенація ресурсів: Об’єднання файлів CSS і JavaScript для зменшення кількості запитів
  • Спрайти зображень: Об’єднання кількох зображень в один файл
  • Вставлення: Вбудовування CSS та JavaScript безпосередньо в HTML

Основна механіка HTTP/2, яка замінює ці хакерські атаки:

  • Двійковий рівень кадрування: Повідомлення, розділені на кадри, ефективно передають дані як одиниці двійкового протоколу
  • Мультиплексовані потоки: Кілька одночасних обмінів відбуваються через одне з’єднання
  • Стиснення заголовків HPACK: Динамічні таблиці відстежують заголовки, усуваючи надмірність
  • Серверний поштовх: Сервери проактивно надсилають ресурси, які знадобляться клієнту
  • Пріоритезація потоків: Клієнти сигналізують про те, які ресурси важливіші, за допомогою вагових коефіцієнтів залежності від потоку

Бінарний фреймінг, потоки, повідомлення та мультиплексування

В основі HTTP/2 лежить двійковий рівень кадрування, що є фундаментальною відмінністю від текстового формату HTTP/1.1. Кожне HTTP-повідомлення розбивається на двійкові кадри з послідовним розташуванням кадрів: 9-байтовий заголовок кадру, що містить довжину, тип, прапори та ідентифікатори потоку, за яким слідують необов’язкові дані корисного навантаження.

Розуміння ієрархії вимагає засвоєння трьох концепцій:

Потоки – це незалежні, двонаправлені канали в межах одного з’єднання. Кожен потік має унікальний 31-бітний ідентифікатор. Клієнти ініціюють потоки з непарними ідентифікаторами (1, 3, 5…), тоді як сервери використовують парні ідентифікатори (2, 4, 6…) для потоків, ініційованих сервером, таких як push. Неочікуваний ідентифікатор потоку спричиняє помилку. Налаштування максимальної кількості одночасних потоків контролює, скільки потоків може бути активними одночасно.

Повідомлення являють собою повні HTTP-запити або відповіді. Повний блок заголовка складається з одного або декількох кадрів, а відповіді можуть включати кілька кадрів даних для тіла. Коли приймач зустрічає фрагменти блоку заголовка, він збирає їх, щоб відновити повне повідомлення.

Кадри – це найменші одиниці на дроті. Поширені типи фреймів і помилок включають в себе:

  • Кадри даних: Переносять вміст тіла запиту/відповіді
  • Фрейм HEADERS: Містить поля заголовка HTTP, можливо, розділені на декілька кадрів, які називаються фрагментами блоку заголовків
  • НАЛАШТУВАННЯ: Повідомлення керування з’єднанням для конфігурації
  • WINDOW_UPDATE: Налаштування вікна керування потоком
  • PUSH_PROMISE: Оголошує серверний пуш
  • RST_STREAM: Завершує потік з кодом помилки
  • ГЕТЬ: Ініціює плавне розірвання з’єднання

Магія відбувається завдяки мультиплексуванню. Оскільки кадри з декількох одночасно відкритих потоків можуть чергуватися через одне TCP-з’єднання – причому будь-яка кінцева точка може чергувати кадри за потребою – очікування не потрібно. Приймач збирає кадри за ідентифікатором потоку.

Розглянемо завантаження типової веб-сторінки, яка потребує:

  • index.html (10 KB)
  • styles.css (25 KB)
  • app.js (100 KB)
  • logo.png (15 KB)
  • hero-image.jpg (200 KB)

У HTTP/1.1 ваш браузер відкриває кілька з’єднань для паралельного отримання даних, але все одно не вичерпує лімітів. У HTTP/2 всі п’ять ресурсів передаються одночасно через одне з’єднання у вигляді декількох потоків даних. Кадри даних з різних потоків чергуються, а клієнт і сервер ефективно керують усім з’єднанням.

Це усуває потребу в декількох TCP-з’єднаннях, зменшує накладні витрати на вікно керування потоком з’єднань і значно підвищує продуктивність веб-сайту.

Стиснення заголовків за допомогою HPACK

HPACK, визначений у RFC 7541 (опублікований разом з HTTP/2 у травні 2015 року), забезпечує стиснення заголовків, спеціально розроблене для HTTP/2. Це важливо, оскільки заголовки HTTP/1.1 були багатослівними і повністю нестиснутими, що призводило до зайвого мережевого трафіку при кожному запиті.

Розглянемо типові заголовки HTTP-запиту:

Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9...
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Cookie: session=abc123def456; tracking=xyz789...

Ці заголовки часто перевищують 700-800 байт на запит. З файлами cookie вони можуть збільшуватися до кількох кілобайт. Помножте на десятки запитів на сторінку, і ви втрачаєте значну пропускну здатність – особливо болісно в мобільних мережах.

HPACK стискає заголовки за допомогою трьох механізмів:

  1. Статична таблиця: 61 заздалегідь визначені загальні пари поле/значення заголовка (наприклад, :method: GET або :status: 200), які ніколи не потрібно передавати
  2. Динамічна таблиця: Специфічна для з’єднання таблиця, яку клієнт і сервер створюють разом, зберігаючи раніше передані значення заголовків для повторного використання
  3. Кодування Хаффмана: Рядкові значення кодуються за допомогою попередньо визначеної таблиці Хаффмана, зменшуючи представлення тексту

Результат драматичний. Після того, як перший запит створює загальні заголовки в динамічній таблиці, наступні запити можуть передавати лише посилання на індекси. Заголовки, які починалися з кілобайт, зменшуються до десятків байт.

HPACK був спеціально розроблений, щоб уникнути вразливостей безпеки, таких як CRIME і BREACH, які впливали на попередні схеми стиснення, такі як DEFLATE від SPDY. Використовуючи статичні коди Хаффмана та ретельне керування таблицями, HPACK не дозволяє зловмисникам використовувати аналіз ступеня стиснення для вилучення секретів зі змішаних даних зловмисника/жертви.

Варто зазначити, що HPACK працює лише з заголовками HTTP. Тіла-відповіді все ще використовують стандартні механізми кодування вмісту, такі як gzip або Brotli на рівні HTTP, повністю відокремлені від стиснення заголовків.

Пріоритезація серверних поштовхів та потоків

HTTP/2 представляє дві функції оптимізації, призначені для заміни обхідних шляхів HTTP/1.1: серверний поштовх для проактивної доставки ресурсів і пріоритезація потоку для інтелектуального замовлення ресурсів.

Серверний поштовх

Серверне проштовхування дозволяє веб-серверу надсилати ресурси клієнту до того, як вони будуть явно запитані. Механізм працює за допомогою фреймів PUSH_PROMISE:

  • Запити клієнтів /index.html
  • Сервер відповідає HTML, але також надсилає фрейми PUSH_PROMISE з повідомленням про те, що він виштовхує /styles.css та /app.js
  • Сервер надсилає ці ресурси у нових потоках, ініційованих сервером (з ідентифікаторами потоків, що містять парні числа, відповідно до правил призначення ідентифікаторів потоків з меншим значенням)
  • Браузер отримує ресурси до того, як розбір HTML виявить, що вони йому потрібні

Це виключає поїздки в обидва кінці. Замість того, щоб

  1. Запросити HTML → Отримати HTML
  2. Розбір HTML, визначення необхідного CSS → Запит CSS
  3. Розбір CSS, визначення необхідних шрифтів → Запит шрифтів

Серверний пуш згортає кроки 2-3 до кроку 1.

Однак на практиці серверне проштовхування виявилося проблематичним:

  • Браузери можуть вже кешувати ресурси, що робить поштовхи марнотратними
  • Неправильно налаштовані сервери надто агресивно штовхають, витрачаючи пропускну здатність
  • Механізми обробки кешу так і не отримали широкого розповсюдження
  • Багато CDN і браузерів тепер обмежують або вимикають push за замовчуванням

Клієнти можуть повністю вимкнути push, встановивши SETTINGS_ENABLE_PUSH = 0 у префайлі з’єднання. Коли преамбула клієнтського з’єднання негайно вимикає push, преамбула серверного з’єднання складається з підтвердження та відповідності.

Пріоритетність потоків

Пріоритезація потоків дозволяє клієнтам сигналізувати про важливість ресурсів, допомагаючи серверам ефективно розподіляти пропускну здатність. Механізм використовує:

  • Ваги: Значення від 1-256, що вказують на відносну важливість
  • Залежності: Потоки можуть залежати від інших потоків, утворюючи дерево залежностей через оголошення залежностей потоків

Практичний приклад:

  • HTML-потік (вага 256, без залежностей) – найвищий пріоритет
  • Потік CSS (вага 200, залежить від HTML) – високий пріоритет
  • Зображення над розворотом (вага 100, залежить від CSS)
  • Аналітика JavaScript (вага 16, залежить від HTML) – низький пріоритет

Це гарантує, що критичні ресурси тракту рендерингу надходять першими, покращуючи сприйняття швидкості завантаження, навіть якщо загальний час передачі залишається однаковим.

Важливі застереження:

  • Визначення пріоритетів є рекомендаційним, а не обов’язковим
  • Реалізації серверів дуже різняться за тим, як вони дотримуються пріоритетів
  • Посередники (проксі-сервери, CDN) можуть перезамовляти фрейми
  • Тюнінг вимагає тестування з реальним трафіком, а не припущень

Оголошений ліміт одночасного потоку впливає на те, скільки потоків можуть мати активні пріоритети одночасно.

Контроль потоку, обробка помилок та міркування щодо безпеки

HTTP/2 реалізує свій власний контроль потоку і обробку помилок над TCP, вирішуючи сценарії, в яких інтелект прикладного рівня перевершує налаштування транспортного рівня за замовчуванням.

Контроль потоку

Контроль потоку не дозволяє швидким відправникам перевантажувати повільні одержувачі. HTTP/2 використовує кредитну систему з кадрами WINDOW_UPDATE:

  • Кожен потік має власне вікно керування потоком приймача
  • З’єднання також має вікно керування потоком з’єднання
  • Розмір вікна за замовчуванням: 65 535 байт (64 KB)
  • Відправники не можуть передавати кадри DATA, що перевищують доступне вікно одержувача
  • Одержувачі надсилають кадри WINDOW_UPDATE, щоб надати більше кредиту

Основні характеристики:

  • Керування потоком відбувається поетапно (застосовується між кожною парою відправник/одержувач)
  • Його не можна вимкнути
  • Тільки фрейми DATA враховуються у вікні; інші обов’язкові дані фреймів не враховуються
  • Регулятор потоку та регулятор потоку з’єднання працюють незалежно один від одного

Це запобігає монополізації ресурсів з’єднання одним швидким потоком, що особливо важливо, коли проксі-сервери або CDN знаходяться між клієнтами та джерелами.

Обробка помилок

HTTP/2 забезпечує гранульовану сигналізацію про помилки:

  • Помилки на рівні потоку: RST_STREAM негайно завершує один потік, не впливаючи на інші, з кодами помилок типу PROTOCOL_ERROR або FLOW_CONTROL_ERROR
  • Помилки на рівні з’єднання: GOAWAY м’яко розриває з’єднання, дозволяючи завершити запити в польоті та запобігаючи появі нових.

Протокол визначає, зокрема, реєстр кодів помилок:

  • PROTOCOL_ERROR (0x1): Загальне порушення протоколу
  • FLOW_CONTROL_ERROR (0x3): Порушено правила керування потоком
  • FRAME_SIZE_ERROR (0x6): Перевищено розмір кадру SETTINGS_MAX_FRAME_SIZE
  • INADEQUATE_SECURITY (0xc): Недостатня конфігурація безпеки транспортного рівня

Міркування безпеки

Хоча RFC 7540 технічно не вимагає шифрування, всі основні веб-браузери вимагають захисту HTTP/2 на транспортному рівні (TLS). Це робить TLS 1.2+ де-факто базовим стандартом:

  • З’єднання починається з рукостискання TLS, включаючи ALPN (узгодження протоколу прикладного рівня)
  • Розширення ALPN узгоджує ідентифікатор “h2” для HTTP/2
  • Сервери не повинні використовувати слабкі набори шифрів з чорного списку специфікації
  • Набори шифрів, що використовують RC4 або інші застарілі алгоритми, викликають помилки INADEQUATE_SECURITY

Зокрема, з міркувань конфіденційності:

  • Налаштування та пріоритетні шаблони можуть дактилоскопіювати клієнтів
  • Одне з’єднання з одним джерелом пов’язує всю активність користувача з цим джерелом
  • Двійковий протокол приховує трафік, але не приховує його від мережевих спостерігачів

Блокування TCP Head-of-Line

HTTP/2 вирішує проблему блокування на рівні HTTP за допомогою мультиплексування, але блокування на рівні TCP залишається. Коли TCP-пакет втрачається, всі потоки на цьому з’єднанні зупиняються до завершення повторної передачі – навіть ті, чиї дані успішно надійшли.

Це обмеження спонукало до створення HTTP/3, який працює поверх QUIC (на основі UDP), щоб забезпечити справжню незалежність потоків. Втрата пакетів, що впливає на один потік, не блокує інші.

Розгортання та використання HTTP/2 на практиці

У 2026 році увімкнути HTTP/2 буде дуже просто. Більшість сучасних веб-серверів і CDN підтримують його з коробки, переважно через HTTPS. Механізм оновлення HTTP обробляє переговори прозоро.

Вимоги на стороні клієнта

Користувачам не потрібно робити нічого особливого:

  • Усі сучасні десктопні веб-браузери (Chrome, Firefox, Safari, Edge) підтримують HTTP/2 за замовчуванням
  • Повна підтримка мобільних веб-браузерів (Chrome для Android, Safari для iOS)
  • Використання актуальних версій браузерів гарантує сумісність
  • HTTP/2 узгоджує автоматично, коли він доступний

Конфігурація на стороні сервера

HTTP-сервер Apache (2.4.17+):

  • Увімкніть модуль mod_http2 (не старий mod_spdy)
  • Додати протоколи h2 http/1.1 до віртуальних хостів TLS
  • Переконайтеся, що версія OpenSSL підтримує ALPN

Nginx (1.9.5+):

server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    # ... rest of configuration
}

IIS (Windows Server 2016+):

  • HTTP/2 увімкнено за замовчуванням для HTTPS з TLS 1.2+
  • Не потребує додаткової конфігурації

CDN-провайдери:

  • Cloudflare: HTTP/2 ввімкнено за замовчуванням на всіх тарифах
  • AWS CloudFront: Увімкнено за замовчуванням для дистрибутивів HTTPS
  • Швидко: Підтримується та ввімкнено за замовчуванням

Перевірка та усунення несправностей

Переконайтеся, що HTTP/2 працює за допомогою цього контрольного списку:

  • Браузер DevTools: Відкрийте вкладку Мережа, увімкніть стовпчик Протокол, знайдіть “h2”
  • Командний рядок: curl –http2 -I https://example.com показує HTTP/2 у відповідь
  • Онлайн-інструменти: Тестові служби HTTP/2 перевіряють конфігурацію
  • Перевірте посередників: CDN або зворотний проксі повинен підтримувати HTTP/2, а не тільки сервер походження

Поширені проблеми, що перешкоджають роботі HTTP/2:

  • Застаріла версія OpenSSL для підтримки ALPN
  • Конфігурація тільки для TLS 1.0/1.1
  • Слабкі набори шифрів запускають резервне копіювання
  • Неправильно налаштована підтримка HTTP/2 для проксі-сервера

HTTP/2 і далі

HTTP/2 залишається домінуючим протоколом для сучасної веб-комунікації, навіть коли починається розгортання HTTP/3 (RFC 9114, опублікований у 2022 році). HTTP/3 вирішує проблему блокування TCP-трафіку в першому рядку, використовуючи QUIC, але модель єдиного TCP-з’єднання HTTP/2 продовжує ефективно обслуговувати більшу частину веб-трафіку.

Для більшості сайтів HTTP/2 забезпечує значне підвищення продуктивності з мінімальними зусиллями по налаштуванню. Почніть обмінюватися фреймами за протоколом HTTP/2 вже сьогодні, і ваші користувачі, незалежно від того, чи працюють вони на десктопах чи мобільних пристроях, відчують більш швидке та ефективне завантаження сторінок.

Основні висновки

  • HTTP/2 революціонізує веб-продуктивність завдяки мультиплексуванню, що дозволяє здійснювати кілька одночасних обмінів через одне з’єднання
  • Стиснення заголовків HPACK усуває надлишкову передачу заголовків, що особливо корисно для мобільних користувачів
  • Пріоритезація серверів і потоків оптимізує доставку ресурсів, хоча реалізація може бути різною
  • Контроль потоку запобігає голодуванню ресурсів між кількома потоками
  • Розгортання на сучасних серверах є простим і вимагає насамперед конфігурації HTTPS
  • Всі основні браузери підтримують HTTP/2, що робить адаптацію безпроблемною для кінцевих користувачів

Наступні кроки

Якщо ви ще не перевірили HTTP/2 на своєму веб-сервері, зараз саме час це зробити. Відкрийте інструменти для розробників у вашому браузері, завантажте ваш сайт і перевірте колонку “Протокол”. Якщо ви бачите “http/1.1” замість “h2”, перегляньте конфігурацію вашого сервера – ви втрачаєте значний приріст продуктивності.

Якщо ви вже використовуєте HTTP/2, подумайте про моніторинг метрик з’єднань HTTP/2 на вашому сервері. Розуміння того, як поводяться кілька паралельних потоків в умовах реального трафіку, допомагає визначити можливості оптимізації ще до того, як ваші користувачі помітять проблеми.