Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке HTTP/2?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)HTTP/2 - друга основна версія протоколу HTTP (2015 рік), яка зберігає ту саму семантику (GET/POST, заголовки, статус-коди), але передає дані в бінарних фреймах, мультиплексує кілька запитів по одному TCP-з'єднанню, стискає заголовки через HPACK і дозволяє серверу проштовхувати ресурси наперед (Server Push). **Ключове:** на відміну від HTTP/1.1, де кожен запит фактично займає окрему чергу в з'єднанні (Head-of-Line Blocking), HTTP/2 усуває цю проблему на рівні HTTP і на практиці прискорює завантаження сторінок на 20-40%; усі браузери вимагають для HTTP/2 обов'язковий HTTPS.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що таке HTTP/2 **HTTP/2** - це друга основна версія протоколу HTTP, розроблена IETF і випущена в **2015 році**. Вона створювалася з метою: - підвищити швидкість завантаження веб-сторінок, - зменшити затримки, - скоротити кількість TCP-з'єднань, - і зробити протокол ефективнішим. > Простіше кажучи: **HTTP/2 = той самий HTTP, але "упакований" розумніше.** > Семантика (`GET`, `POST`, `headers`, `status codes`) лишилася незмінною, > але формат передачі даних і будова з'єднання змінилися радикально. ## 2. Чому HTTP/1.1 почав гальмувати HTTP/1.1 (1997 р.) мав низку проблем: - **Обмеження: 1 запит = 1 відповідь.** Щоб завантажити 50 ресурсів (картинки, скрипти, CSS), потрібно відкрити десятки з'єднань. - **Head-of-Line Blocking** - якщо один запит у черзі завис, решта чекають. - **Величезні заголовки** (cookies, user-agent тощо) передаються заново в кожному запиті. - **Немає мультиплексування**: кожне з'єднання обслуговує лише один потік. - Щоб пришвидшити сайт, доводилося "хакати" протокол - мінімізувати CSS, об'єднувати JS, використовувати CDN-домени. ## 3. Що змінилося в HTTP/2 ### 1. Мультиплексування (Multiplexing) Тепер **кілька запитів і відповідей можуть передаватися одним TCP-з'єднанням одночасно**. Немає більше "черг" і блокувань. У HTTP/1.1: ```javascript Запит 1 → відповідь 1 Запит 2 → відповідь 2 ``` У HTTP/2: ```javascript Запити 1, 2, 3 → паралельно Відповіді 1, 2, 3 → у будь-якому порядку ``` > Це усуває Head-of-Line Blocking на рівні HTTP (але не TCP). ### 2. Бінарний формат (Binary framing) HTTP/2 передає дані **в бінарних фреймах**, а не текстом, як HTTP/1.1. - Швидше парситься і компактніше. - Усуває неоднозначності текстового формату. - Розділяє потік на незалежні **frames** і **streams**. ### 3. Стиснення заголовків (HPACK) Заголовки (`User-Agent`, `Cookie`, `Accept-Language` тощо) часто повторюються. HTTP/2 кодує їх за допомогою **таблиці й Huffman-стиснення**, зменшуючи обсяг метаданих, що передаються. > Наприклад, 1 КБ заголовків у HTTP/1.1 може займати всього ~100 байт у HTTP/2. ### 4. Server Push (серверне "проштовхування") Сервер може **надіслати клієнту додаткові ресурси** ще до того, як їх запитають. Наприклад: ```javascript Клієнт → GET /index.html Сервер → /index.html + /style.css + /script.js ``` Так браузер отримує все потрібне одразу, без додаткових запитів. (хоча в HTTP/3 ця можливість поступово йде зі стандарту.) ### 5. HTTPS - фактично обов'язковий Хоча HTTP/2 *теоретично* можна використовувати без TLS, усі браузери вимагають **лише HTTPS** для HTTP/2-з'єднань. Шифрування стало стандартом. ## 4. Як це виглядає візуально ```javascript HTTP/1.1: HTTP/2: ─────────── ──────────────── Req1 → Resp1 Stream1: Req1/Resp1 Req2 → Resp2 Stream2: Req2/Resp2 Req3 → Resp3 Stream3: Req3/Resp3 (по черзі) (усе через одне з'єднання) ``` ## 5. Приклад різниці в продуктивності **HTTP/1.1:** браузер відкриває до 6 TCP-з'єднань на один домен, кожне - з окремою чергою запитів. **HTTP/2:** одне з'єднання обслуговує десятки паралельних потоків. → менше overhead, менше затримок, менше рукостискань. Результат: - сторінки завантажуються швидше; - менше навантаження на сервер і мережу; - більше вигоди від HTTPS (TLS використовується ефективніше). ## 6. Підтримка HTTP/2 підтримується: - усіма сучасними браузерами; - більшістю серверів (Nginx, Apache, Node.js, Caddy, Cloudflare тощо); - починаючи з Node.js **v8.4** (`import http2 from 'node:http2'`). ## 7. Приклад у Node.js ```javascript import http2 from 'node:http2'; import fs from 'node:fs'; const server = http2.createSecureServer({ key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem'), }); server.on('stream', (stream, headers) => { stream.respond({ 'content-type': 'text/plain', ':status': 200 }); stream.end('Hello from HTTP/2'); }); server.listen(8443); ``` ## 8. Ключові відмінності в таблиці | Характеристика | **HTTP/1.1** | **HTTP/2** | |---|---|---| | Формат | Текстовий | Бінарний | | К-сть з'єднань | 1 запит = 1 з'єднання | Одне з'єднання, багато потоків | | Мультиплексування | Немає | Є | | Стиснення заголовків | Немає | HPACK | | Server Push | Немає | Є | | Пріоритет потоків | Немає | Є | | Обов'язковий HTTPS | Ні | Фактично так | | Швидкість | Повільніше | Швидше (на 20-40%) | ## 9. У двох словах > **HTTP/2** - це "розумний" HTTP, який передає дані бінарно, > мультиплексує потоки і мінімізує накладні витрати, > роблячи сайти помітно швидшими без зміни логіки застосунків.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.