vyvchy
    Теми розділу

    03 · Веб і мережі для AQA

    HTTP/2 і HTTP/3: еволюція протоколу

    Зміст

    Версія протоколу — те, що тестувальник згадує останнім. Тест падає «через раз» на мобільній мережі, сторінка завмирає вся одразу, домен- у старому проєкті нічого не прискорює, а за питанням «HTTP/2 усунув HOL-блокування — правда?» на співбесіді ховається пастка. Спільне тут одне: симптом породжує транспорт, а шукають його в застосунку.

    Ця глава — повний виклад теми на сайті, інші глави посилаються сюди по механіку версій. Мета — розводити два шари: що змінюється між HTTP/1.1, HTTP/2 і HTTP/3 (і що не змінюється взагалі) та які симптоми законно пояснювати версією, а які ні.

    Що змінює версія протоколу, а що ні

    HTTP/2 — не нова семантика HTTP, а оптимізоване подання тієї самої семантики: методи, статус-коди й заголовки лишаються ті самі, змінюється спосіб, у який вони їдуть по зʼєднанню. Виграш дають дві речі: стиснення полів і кілька одночасних обмінів на одному зʼєднанні. Чинна специфікація — RFC 9113, вона скасовує RFC 7540 і RFC 8740.

    HTTP/3 — те саме відображення семантики HTTP на новий транспорт: замість TCP під ним працює QUIC. Дизайн успадковано від HTTP/2, але життєвий цикл потоків, контроль потоку, шифрування й автентифікацію сторін делеговано транспорту.

    Мапа специфікацій після ревізії 2022 року показує це формально: семантика (RFC 9110) і кешування (RFC 9111) спільні для всіх версій, версійні лише RFC 9112 (HTTP/1.1), RFC 9113 (HTTP/2) і RFC 9114 (HTTP/3). MDN зводить різницю HTTP/2 з HTTP/1.1 до трьох пунктів: бінарний замість текстового (руками не почитаєш і не складеш), мультиплексований, зі стисненням заголовків.

    Головний практичний наслідок: переїзд на HTTP/2 чи HTTP/3 не переписує ваші перевірки на статус, тіло, кукі й заголовки лишаються чинними. Якщо тест зламався «через HTTP/2», підозра має падати на щось конкретне: розмір заголовків, кількість паралельних потоків, поведінку проміжного вузла.

    Обмеження HTTP/1.x: чому браузер відкриває шість зʼєднань

    Зʼєднання HTTP/1.x серіалізує запити: наступний іде після відповіді на попередній. Саме зʼєднання при цьому постійне — канал перевикористовується й економить TCP. Але один канал — одна черга, тож єдиний спосіб працювати паралельно — відкрити кілька зʼєднань до домену. Колишній дефолт — 2–3, нинішній поширений — шість на домен; перевищувати ризиковано, бо на боці сервера це може зачепити захист від DoS.

    Пастка

    Шість — це поточна практика браузерів, а не норма протоколу: у RFC такого числа немає. Подавати його треба саме так: «браузери зазвичай відкривають до шести зʼєднань на домен», а не «протокол дозволяє шість».

    Звідси домен-шардінг (domain sharding): розкласти статику по піддоменах www1, www2, www3, які резолвляться в той самий сервер, — і браузер відкриє по шість зʼєднань до кожного, у прикладі MDN 18 замість 6. MDN уже позначає техніку застарілою: на HTTP/2 вона не просто зайва, а шкідлива для продуктивності, і більшість реалізацій «розшивають» шардінг назад обʼєднанням зʼєднань (connection coalescing).

    На HTTP/2 картина протилежна: специфікація каже, що клієнт не повинен відкривати більш ніж одне зʼєднання на пару «хост+порт». Модальність тут важлива: SHOULD NOT — наполеглива рекомендація з винятками (заміна наявного зʼєднання, різні значення SNI, різні клієнтські сертифікати), а не заборона. Задум однозначний: паралельність дають потоки, а не зʼєднання.

    Ще один спадок тієї самої проблеми — (pipelining). Сучасні браузери його не вмикають: він все одно страждає на , а надсилати пайплайном можна лише (GET, HEAD, OPTIONS, TRACE, PUT, DELETE) — при збої вміст пайплайна доводиться повторювати.

    Скільки зʼєднань браузер підняв насправді — видно в колонці Connection ID панелі Network. Звідси й гіпотеза з терміном придатності: «сторінка гальмує, бо забагато дрібних файлів» правдоподібна на HTTP/1.1 і неправдоподібна на HTTP/2, а піддомени «для швидкості» в старому проєкті — кандидат на видалення, а не на перевірку.

    HOL-блокування: два рівні, а не один

    HOL-блокування (head-of-line blocking) — ситуація, коли перший елемент черги, який не може завершитися, тримає всі наступні, навіть якщо ті вже готові. У вебі це поняття живе на двох різних рівнях, і кожна версія HTTP розвʼязує рівно один із них. Плутати рівні — головна помилка в темі «HTTP/2 усе полагодив».

    Рівень 1, прикладний. У HTTP/1.0 на одному TCP-зʼєднанні міг «висіти» лише один запит одночасно. у HTTP/1.1 вирішив паралельність частково й лишила блокування на прикладному рівні — саме тому клієнти відкривають кілька зʼєднань. Обхід має ціну: TCP не ділить контроль перевантаження між зʼєднаннями, тож зайві зʼєднання шкодять і йому, і ефективності мережі. Друга вада того самого рівня — повторювані багатослівні заголовки: вони не лише жеруть трафік, а й швидко заповнюють початкове вікно перевантаження TCP, даючи надмірну на нових зʼєднаннях. Додає й текстова природа HTTP/1.1: розділення повідомлень пробільними символами читабельне для людини, але «веде до складності розбору й надмірної терпимості до відхилень у поведінці» — два можуть по-різному зрозуміти той самий кривий запит.

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

    Рівень 2 закриває HTTP/3. QUIC гарантує порядок лише всередині потоку й нічого не обіцяє щодо порядку між потоками — тому втрата в одному потоці не гальмує решту: кожна пара «запит-відповідь» займає окремий QUIC-потік. Одне джерело блокування лишається й тут — саме стиснення заголовків: QPACK тому й дає кодувальнику важіль балансувати між ступенем стиснення й блокування, спричиненого стисненням.

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

    HTTP/3: втрата бʼє по одному потоку

    втрачено пакет QUIC

    потік 1 чекає

    потік 2 їде далі

    потік 3 їде далі

    HTTP/2: черги немає, лишається TCP

    втрачено пакет TCP

    потік 1 завмер

    потік 3 завмер

    потік 5 завмер

    HTTP/1.1: блокує черга запитів

    запит 1 не завершився

    запит 2 чекає

    запит 3 чекає

    HTTP/3: втрата бʼє по одному потоку

    втрачено пакет QUIC

    потік 1 чекає

    потік 2 їде далі

    потік 3 їде далі

    HTTP/2: черги немає, лишається TCP

    втрачено пакет TCP

    потік 1 завмер

    потік 3 завмер

    потік 5 завмер

    HTTP/1.1: блокує черга запитів

    запит 1 не завершився

    запит 2 чекає

    запит 3 чекає

    Рівень блокуванняHTTP/1.1HTTP/2HTTP/3
    Прикладний (черга запитів)єнемаєнемає
    Транспортний (втрата пакета)єєнемає
    ТранспортTCPTCPQUIC

    Робочих тез для тестувальника звідси дві. «Один повільний запит гальмує всю сторінку» — діагноз, що залежить від версії: на HTTP/1.1 винна черга запитів, на HTTP/2 — втрата пакета в TCP, на HTTP/3 обидва пояснення відпадають. І різниця між HTTP/2 та HTTP/3 найпомітніша саме на мережі з втратами: на ідеальному дротовому каналі втрачати нічого, тож звичайний smoke на офісному Wi-Fi «перевіркою HTTP/3» не є.

    HTTP/2 зсередини: кадри, потоки, ліміти

    HTTP/2 — протокол прикладного рівня, орієнтований на зʼєднання, який працює поверх TCP; ініціює зʼєднання клієнт.

    Базова одиниця обміну — кадр (frame): найменша одиниця обміну в межах зʼєднання, що складається із заголовка і послідовності октетів змінної довжини, структурованої за типом кадру. Запити й відповіді будуються з кадрів HEADERS і DATA, службові функції несуть SETTINGS, WINDOW_UPDATE, PUSH_PROMISE. Поверх кадрів живуть потоки (streams): потік — незалежна двонаправлена послідовність кадрів у межах одного зʼєднання, кожен обмін «запит/відповідь» живе у власному потоці, а цілочисельний ідентифікатор призначає та сторона, що потік ініціює. Одне зʼєднання тримає багато одночасно відкритих потоків, і будь-яка зі сторін перемежовує їхні кадри — це і є мультиплексування (multiplexing).

    Паралелізм не безмежний і не таємний: його обмежує параметр SETTINGS_MAX_CONCURRENT_STREAMS, який кожна сторона оголошує для свого партнера — клієнт задає ліміт для сервера, сервер для клієнта. Тому коли e2e- чи навантажувальний сценарій упирається в стелю паралельності, дивляться на оголошений сервером ліміт, а не гадають про браузер. Тримається все це на контролі потоку (не надсилати більше, ніж отримувач здатен обробити) і на пріоритезації.

    Заголовки стискаються, бо містять багато надлишкових даних; у типовому випадку це дозволяє вмістити багато запитів в один пакет. Алгоритм визначено окремою специфікацією (HPACK): стиснений блок полів їде в кадрі HEADERS (або PUSH_PROMISE), а якщо не влазить — у наступних кадрах CONTINUATION.

    Пастка

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

    Зʼєднання HTTP/2 постійні: їх тримають відкритими, доки не стане зрозуміло, що спілкування з сервером більше не потрібне. Коректне закриття починається з кадру GOAWAY — щоб обидві сторони знали, які кадри вже оброблено.

    Сервер-пуш (server push) — необовʼязковий режим, у якому сервер спекулятивно надсилає дані, що, за його прогнозом, знадобляться клієнту: він синтезує запит і шле його кадром PUSH_PROMISE. Чому це рідко окупається, фіксує сама специфікація: сервер має правильно вгадати додаткові запити з урахуванням , узгодження вмісту й поведінки користувача, а помилка прогнозу коштує зайвих даних у мережі й може погіршити продуктивність. Ключове слово — кешування: сервер не знає, що вже лежить у браузера. Клієнт може вимкнути пуш параметром SETTINGS_ENABLE_PUSH = 0, і домовленість діє окремо на кожному «стрибку».

    Повчальна й історія з пріоритетами: схему сигналізації з RFC 7540 визнано невдалою і в RFC 9113 оголошено застарілою.

    Як клієнт і сервер домовляються про версію

    Версію HTTP не «вмикають» — про неї домовляються на старті зʼєднання. Способів три: узгодження через захищене зʼєднання з TLS і ALPN (Application-Layer Protocol Negotiation); апгрейд відкритого зʼєднання без попереднього знання; старт відкритого HTTP/2 із попереднім знанням. Рекомендований перший: протокол узгоджують усередині рукостискання TLS, без додаткових .

    Далі — місце хибного висновку зі специфікації. Стандарт HTTP/2 TLS не вимагає: незашифроване зʼєднання технічно можливе, але зі зайвою складністю — HTTP/1.x і HTTP/2 живуть на тому самому порту 80, тож версію доводиться узгоджувати механізмом Upgrade (токен h2c, відповідь 101 Switching Protocols). Вимагають браузери: усі популярні взялися підтримувати HTTP/2 поверх TLS, а частина — зокрема Firefox і Google Chrome — заявила, що вмикатиме його лише поверх TLS. Звідси «TLS з ALPN — де-факто вимога для HTTP/2 в браузері»; база сумісності додає умову з боку сервера: браузер підніме HTTP/2, тільки якщо сервер уміє узгоджувати протокол через ALPN. Практичний наслідок: локальний стенд на http:// завжди піде по HTTP/1.1, і дефект на це не заводять.

    З HTTP/3 механізм інший. Клієнт не може просто «спробувати HTTP/3» — він спершу має дізнатися, що точка HTTP/3 узагалі є. оголошує її заголовком відповіді Alt-Svc (або кадром ALTSVC у HTTP/2) з токеном h3:

    HTTP/2 200
    content-type: text/html; charset=utf-8
    alt-svc: h3=":50781"

    Отримавши такий запис, клієнт може спробувати підняти QUIC-зʼєднання; сам вибір HTTP/3 позначається токеном ALPN h3 під час рукостискання, у якому QUIC заразом узгоджує транспортні параметри. Якщо мережа ріже UDP, зʼєднання не встановиться, і клієнтові рекомендовано (SHOULD) спробувати версії HTTP поверх TCP — сайт працюватиме, просто тихо, по HTTP/2.

    СерверКлієнтСерверКлієнтТепер відомо, що HTTP/3 єUDP заблоковано → лишаємось на TCPЗапит по HTTP/2 (TCP)Відповідь + Alt-Svc: h3=":50781"QUIC-рукостискання, ALPN «h3»Наступні відповіді по HTTP/3СерверКлієнтСерверКлієнтТепер відомо, що HTTP/3 єUDP заблоковано → лишаємось на TCPЗапит по HTTP/2 (TCP)Відповідь + Alt-Svc: h3=":50781"QUIC-рукостискання, ALPN «h3»Наступні відповіді по HTTP/3

    Звідси спостереження, що рятують від хибних дефектів. Перше завантаження часто йде не по HTTP/3: спершу приходить Alt-Svc, і лише наступні запити браузер пробує по QUIC. Різні протоколи в одному сеансі — теж норма: на одній сторінці частина запитів може йти h2, частина h3, частина http/1.1, залежно від того, з ким і як домовилися. А ще версію здатен «зняти» проміжний вузол: керування зʼєднанням діє між двома сусідніми вузлами, а не наскрізно, тож браузер і сервер цілком можуть бачити різне.

    HTTP/3 і QUIC: що дає новий транспорт

    QUIC — захищений транспортний протокол загального призначення, орієнтований на зʼєднання; RFC 9000 визначає його першу версію. Він дає три речі, яких не було в стеку TCP+TLS: потоки з власним контролем потоку, низьколатентне встановлення зʼєднання і міграцію між мережевими шляхами.

    Транспорт і шифрування. QUIC-пакети їдуть у UDP-датаграмах; автентифікується весь пакет, а шифрується максимум можливого. HTTP/3 працює поверх QUIC версії 1, а той використовує TLS 1.3 або новішу як протокол рукостискання — незашифрованого HTTP/3 не буває. Більше того, схема http:// привʼязана до здатності приймати TCP-зʼєднання, а HTTP/3 TCP не використовує, тож прямого доступу по HTTP/3 до http://-ресурсу не існує взагалі. Сервер при цьому може віддавати HTTP/3 на будь-якому UDP-порту — «а чому не 443» дефектом не є.

    Швидший старт і 0-RTT. QUIC зливає криптографічне й транспортне рукостискання в одне — звідси менша затримка на старті. Для повторних зʼєднань є режим 0-RTT: клієнт шле прикладні дані ще до відповіді сервера.

    Пастка

    Ціну 0-RTT специфікація називає прямо: він не захищає від replay-. Не ідемпотентні запити — оплату, створення замовлення — в 0-RTT слати не можна, і в тест-плані це окремий рядок: перевіряють не таймінги, а те, які операції застосунок дозволяє в ранній фазі зʼєднання.

    Потоки. Кожна пара «запит-відповідь» займає один QUIC-потік, і мультиплексування тут — робота транспорту, а не прикладного рівня: HTTP не потребує окремого мультиплексування поверх QUIC. Усередині потоку одиниця обміну — кадр (HEADERS, DATA тощо), а кадри рівня зʼєднання їдуть окремим керівним потоком. Специфікація радить дозволяти щонайменше 100 одночасних потоків-запитів, тож «мало паралельності» на HTTP/3-стенді — привід дивитися в конфігурацію, а не в протокол. Стиснення довелося замінити: HPACK вимагає впорядкованої доставки, якої QUIC не дає, тому заголовки стискає QPACK, а стан його таблиці тримають на окремих однонаправлених потоках. Сервер-пуш формально лишився, але ініціативу віддано клієнту ще жорсткіше: сервер не може нічого пушити, доки клієнт не надішле кадр MAX_PUSH_ID.

    Міграція зʼєднання. Зʼєднання впізнається за ідентифікатором зʼєднання (connection ID), а не за парою «IP+порт», тому переживає зміну мережевого шляху чи переприсвоєння адрес у NAT — на TCP воно б розірвалося. Обмеження варто знати: ініціювати міграцію може лише клієнт і лише після підтвердження рукостискання, а зміну адреси партнера треба підтвердити валідацією шляху. Тому «активна сесія переживає перехід із Wi-Fi у мобільну мережу» — законний тест-кейс, а перемикання мережі до підтвердження рукостискання міграцією не є взагалі: до цього моменту специфікація її забороняє.

    Що з версії видно у вкладці Network

    Питання «по якій версії пішов цей запит» має точну відповідь. У панелі Network є колонка Protocol: вона показує протокол запиту — наприклад h2 для HTTP/2 і h3 для HTTP/3. Пастка в тому, що типово її не видно: частина колонок показана за замовчуванням, решта ні, і вмикають їх правою кнопкою по шапці таблиці. Поруч варті уваги ще дві: Connection ID — ідентифікатор зʼєднання запиту (на HTTP/1.1 чекайте кілька значень на домен, на HTTP/2 — одне на «хост+порт»), і Remote address — віддалена IP-адреса й порт, чим зручно доводити, що піддомени резолвляться в той самий сервер. Під конкретний заголовок відповіді можна додати власну колонку через Response Headers > Manage Header Columns.

    Механіку панелі розбирає глава «DevTools: вкладка Network і дебаг»; тут важливий один висновок: версію протоколу й кількість зʼєднань не вгадують — їх вмикають. І спостереження з панелі має продовження в автотесті: побачили, який запит завершує дію, — чекайте саме на нього, а не на фіксовану паузу.

    // чекаємо на конкретну відповідь, а не на секунди
    await page.waitForResponse((r) => r.url().includes('/api/orders') && r.ok());

    Поширеність версій: цифри лише з датою

    HTTP/2 стандартизували у травні 2015; за даними, на які посилається MDN, його вживання досягло піку в січні 2022 — 46,9 % усіх сайтів. Найшвидше переходили високонавантажені сайти, заради економії на передачі даних. HTTP/3 станом на жовтень 2022 використовували 26 % усіх сайтів, і його підтримує більшість основних браузерів — зокрема Chromium і його похідні (Chrome, Edge) та Firefox.

    Пастка

    Обидві цифри — частка сайтів, а не частка трафіку: це різні метрики, і джерела зі статистикою трафіку тут немає. «46,9 % сайтів у січні 2022 за даними, на які посилається MDN» — коректно; «більшість трафіку — HTTP/2» — ні.

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

    Типові помилки

    • Виглядає як «HTTP/2 усунув HOL-блокування», а насправді усунув на прикладному рівні, а на рівні TCP — ні, і специфікація каже це прямо.
    • Виглядає як «перейшли на HTTP/2, отже швидше», а насправді за поганої пріоритезації буває повільніше, ніж на HTTP/1.1: паралелізму на рівні TCP уже немає.
    • Виглядає як «HTTP/2 не вмикається — баг конфігурації», а насправді стенд відкривається по http://, а браузери вмикають HTTP/2 лише поверх TLS з ALPN.
    • Виглядає як «HTTP/3 не працює, перший запит пішов по h2», а насправді так і має бути: спершу приходить Alt-Svc, і лише наступні запити йдуть по QUIC.
    • Виглядає як «шість зʼєднань — норма протоколу», а насправді це практика браузерів; у RFC такого числа немає.
    • Виглядає як «розкладемо статику по піддоменах — буде паралельніше», а насправді на HTTP/2 шардінг шкідливий, а реалізації ще й обʼєднують зʼєднання назад.
    • Виглядає як «0-RTT — це просто швидше», а насправді це обмін гарантій на швидкість: захисту від replay-атак там немає.
    • Виглядає як «сайт працює по HTTP/3», а насправді версія — властивість запиту: в одному сеансі законно співіснують h3, h2 і http/1.1.

    Підсумок

    1. Версія протоколу міняє подання, а не семантику: методи, й заголовки ті самі, тому переїзд на HTTP/2 чи HTTP/3 не переписує перевірки.
    2. HOL-блокування живе на двох рівнях: прикладний закриває HTTP/2, транспортний — лише HTTP/3 поверх QUIC.
    3. Паралельність на HTTP/1.x купують зʼєднаннями (звідси шість на домен і домен-шардінг), на HTTP/2 — потоками в одному зʼєднанні з оголошеним лімітом SETTINGS_MAX_CONCURRENT_STREAMS.
    4. QUIC дає те, чого не було в TCP+TLS: незалежні потоки, злите рукостискання з обовʼязковим TLS 1.3 і міграцію зʼєднання за його ідентифікатором — а ціна 0-RTT називається окремо.
    5. Версію не припускають: її вмикають колонкою Protocol, а різниця HTTP/2 проти HTTP/3 стає видимою лише на мережі з втратами або при зміні мережі.

    Можливі питання

    • «Чим HTTP/2 відрізняється від HTTP/1.1?» Перевіряють, чи не почнете з «він швидший». Сильна відповідь розводить семантику й подання, а тоді називає механізм: бінарні кадри, потоки в одному зʼєднанні, стиснення полів.
    • «HTTP/2 прибрав HOL-блокування — правда?» Питання про акуратність: очікують «на прикладному рівні так, на рівні TCP ні» з механікою втраченого пакета.
    • «Чому на HTTP/2 не потрібен домен-шардінг?» Дивляться, чи знаєте рекомендацію одного зʼєднання на «хост+порт» — і чи не перетворите SHOULD NOT на заборону.
    • «Що дає QUIC понад TCP?» Очікують три пункти зі специфікації — потоки з власним контролем потоку, низьколатентне встановлення, міграція — і згадку про обовʼязковий TLS 1.3.
    • «Як браузер дізнається, що є HTTP/3?» Механізм оголошення: Alt-Svc з токеном h3, далі ALPN у рукостисканні, і на TCP-версії, якщо UDP заблоковано.
    • «Як перевірити те, чим HTTP/3 справді відрізняється від HTTP/2?» Слухають, чи не запропонуєте smoke на офісному Wi-Fi. Очікують втрати пакетів і зміну мережі під час активної сесії.

    Джерела

    Що змінює версія протоколу, а що ні

    Обмеження HTTP/1.x: чому браузер відкриває шість зʼєднань

    • MDN — Connection management in HTTP/1.x — серіалізація запитів, постійні зʼєднання, 2–3 проти шести, домен-шардінг і його застарілість, вимкнений пайплайнінг.
    • RFC 9113 — HTTP/2 — рекомендація одного зʼєднання на «хост+порт» і її модальність.
    • Chrome DevTools — Network features reference — колонка Connection ID як спосіб побачити реальну кількість зʼєднань.

    HOL-блокування: два рівні, а не один

    • RFC 9113 — HTTP/2 — блокування на прикладному рівні в HTTP/1.x, застереження про TCP, багатослівні заголовки й вікно перевантаження, ризик гіршої за HTTP/1.1 продуктивності.
    • RFC 9114 — HTTP/3 — ціна кількох TCP-зʼєднань, зупинка всіх транзакцій при втраті пакета, текстовий формат HTTP/1.1 і складність розбору, залишкове блокування через стиснення.
    • RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport — порядок гарантовано лише всередині потоку.

    HTTP/2 зсередини: кадри, потоки, ліміти

    • RFC 9113 — HTTP/2 — кадри й потоки, мультиплексування, SETTINGS_MAX_CONCURRENT_STREAMS для партнера, HPACK і суцільний блок полів, GOAWAY, сервер-пуш та його межі, застаріла схема пріоритетів.

    Як клієнт і сервер домовляються про версію

    HTTP/3 і QUIC: що дає новий транспорт

    • RFC 9114 — HTTP/3 — обовʼязковий TLS 1.3 під HTTP/3, схема http:// і TCP, будь-який UDP-порт, потік на пару «запит-відповідь», мультиплексування як робота транспорту, порада про 100 потоків, QPACK, MAX_PUSH_ID.
    • RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport — три властивості QUIC понад TCP, UDP-датаграми й шифрування, злите рукостискання, 0-RTT і replay-атаки, ідентифікатор зʼєднання та міграція.

    Що з версії видно у вкладці Network

    • Chrome DevTools — Network features reference — колонки Protocol, Connection ID, Remote address, вмикання колонок правою кнопкою і Manage Header Columns.
    • Playwright — Network — очікування конкретного мережевого запиту в тесті замість паузи.

    Поширеність версій: цифри лише з датою

    • MDN — Evolution of HTTP — дати й частки сайтів для HTTP/2 і HTTP/3, підтримка браузерами, нульова ціна переходу для застосунку.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.