Вы открываете на смартфоне тот же сайт, что час назад мгновенно загружался дома. В вагоне метро, где сеть постоянно меняется с LTE на Wi-Fi и обратно, соединение мучительно «подвисает», страница отрисовывается рывками, интерактивные элементы не отвечают. Хотя в обиходе это называют «плохой связью», на самом деле мы наблюдаем проблему, находящуюся на фронтире развития протокола передачи связи. 

«Подвисания» — прямое следствие ограничений TCP, протокола, созданного в эпоху стационарных компьютеров и проводного интернета. Сегодня, когда мы переключаемся между сетями десятки раз в день, эти ограничения стали критическими. Для решения этой проблемы был создан HTTP/3 — протокол, спроектированный для мобильного, хаотичного мира (и мы яростно ждем его повсеместного внедрения). 

За 35 лет веб прошел путь от простых текстовых страниц до потокового 4K-видео, от модемов на 2400 бит/с до гигабитного интернета. И каждый раз, когда технология упиралась в очередное «бутылочное горлышко», инженеры находили изящное решение. Которое, как правило, порождало новые проблемы.

Мне было скучно и я проследил эту гонку за производительностью от самых истоков — от HTTP/0.9, умевшего только передавать текст, до современного HTTP/3. И попробовал заглянуть в будущее: какие «горлышки» предстоит расширить завтра.

Дисклеймер. Оооворюсь: этот текст я изначально писал для широкой аудитории. Поэтому термины, даже хорошо знакомые, буду временами объяснять. Кроме того, я не ставлю задачу рассказать обо всех вехах и особенностях каждой итерации протокола HTTP, об этом уже есть множество хороших материалов. Итак, поехали.

Вначале был гипертекст

В основе всего веба лежит идея гипертекста — концепция нелинейного текста, в котором документы связаны друг с другом ссылками. Термин появился в 1965 году, но сама структура «страница → ссылка → страница» знакома человечеству гораздо дольше — по справочникам, энциклопедиям и книгам вроде «Хазарского словаря» Павича.

Но до 1991 года гипертекст существовал только в теории и в виде локальных экспериментов. Тим Бернерс-Ли в CERN соединил три компонента, которые создали веб, каким мы его знаем:

  • HTML (HyperText Markup Language) — язык разметки, описывающий структуру страницы;

  • HTTP (HyperText Transfer Protocol) — протокол для передачи этих страниц между компьютерами;

  • URL (Uniform Resource Locator) — единая система адресации ресурсов.

К этому фундаменту добавилась созданная еще в 1983 году DNS (Domain Name System) — «адресная книга» интернета, превращающая понятные человеку имена сайтов в машинные IP-адреса.

Краткая история HTTP

Функции современного HTTP появились не сразу. Соединения были медленными, ненадежными, пакеты данных забивали каналы связи… Начну рассказ от истоков современного интернета: с HTTP/0.9, появившегося в далеком 1991 году.

HTTP/0.9. С чего все начиналось (1991)

Боль: только GET, без заголовков, без многостраничности.
Решение: минимальный старт для обмена HTML.
Проблема: полное отсутствие масштабируемости.

«Бутылочным горлышком» на этой стадии выступала не только черепашья скорость соединения (2400–9600 бит в секунду), но и отсутствие возможности передавать какие-либо типы данных помимо гипертекста, что еще в 1991 году воспринималось как проблема.

Веб с самого начала задумывался как мультимедийная среда, а не просто текстовая библиотека. К моменту появления HTTP уже существовали зрелые протоколы для работы с разными типами контента. Например, FTP (File Transfer Protocol) позволял передавать файлы любого формата. 

Пользователи уже привыкли к возможности обмениваться не только текстом, поэтому ограничение HTTP только гипертекстом выглядело шагом назад. Появление поддержки различных типов файлов в HTTP было критичным и срочным вопросом. Отчасти именно отсутствие этого функционала не позволило создателю HTTP Тиму Бернерсу-Ли с чистой совестью присвоить первой версии протокола порядковый номер 1.0.

В версии 0.9 не было заголовков — метаданных, которые позже станут неотъемлемой частью веба. Без них протокол был изолирован: не мог работать через прокси-серверы и не был совместим с другими сетевыми протоколами того времени.

Также в этой версии еще не было статус-кодов и поддержки разных типов данных. Единственной командой была GET, предназначенная для запроса ресурса по определенному URL. Весь запрос состоял буквально из одной строки вроде GET /index.html — и сервер либо возвращал HTML-файл, либо просто разрывал соединение.

Несмотря на простоту, этот протокол является самой «голой» версией интернета. Суть обработки запросов за прошедшие 35 лет стала совершеннее, но не изменила своей сути: сервер и пользователь обмениваются текстовым пакетом данных, а на конечном устройстве текст интерпретируется как визуальный интерфейс.

Работа над ошибками. HTTP/1.0 (1996)

Боль: одно соединение на запрос, огромные накладные расходы TCP.
Решение: поддержка заголовков, кеширование, первые шаги к виртуальному хостингу.
Проблема: все равно разрыв соединения на каждый объект, нет host-заголовка по стандарту.

Это первая стандартизованная версия, которая была к тому же ориентирована на графические браузеры. HTTP/1.0 решал сразу несколько критических проблем своего предшественника.

Во-первых, протокол научился работать с разными типами данных. С появлением поддержки изображений и других файлов веб превратился из текстовой библиотеки в мультимедийную среду. Теперь страница могла содержать не только HTML, но и картинки, стили, скрипты.

Во-вторых, появились новые методы запросов. Если HTTP/0.9 умел получать данные только с помощью GET, то в HTTP/1.0 добавились HEAD и POST:

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

  • POST — дал возможность отправлять данные на сервер. Веб стал двусторонним: пользователи могли не только читать, но и отправлять данные через формы, загружать файлы.

В-третьих, появились статус-коды — трехзначные числа, которые сервер отправляет в ответ на запрос. Теперь браузер точно знал, что произошло: успешно ли загрузилась страница (200), не найден ли файл (404), или нужно перейти по другому адресу (3XX). 

Наконец, HTTP/1.0 частично решил проблему виртуального хостинга. Хотя заголовок Host еще не был обязательным, его появление позволило размещать несколько сайтов на одном IP-адресе, что существенно снизило стоимость хостинга.

Однако новые возможности породили новые проблемы. POST открыл двери для атак через формы, HEAD позволил хакерам эффективнее сканировать серверы на уязвимости. «Бутылочным горлышком» теперь стали производительность и безопасность.

HTTP/1.1. Рабочая лошадка, которая изменила все (1997)

Боль: масштабирование с десятками ресурсов на страницу.
Решение: постоянные соединения, host-заголовок, первые механизмы оптимизации.
Проблема: HOL-блокировки из-за pipelining и TCP.

Сложно поверить, что интернет был когда-то практически стартапом. Хотя lean-методологий тогда не было, в терминах нашего времени можно сказать, что интернет столкнулся с проблемой на уровне масштабирования (scale).

К 1997 году проблема стала критической: веб-страницы содержали уже десятки элементов, и для каждого требовалось отдельное TCP-соединение. То есть чтобы загрузить одну страницу с 30 ресурсами (картинками, стилями, скриптами), приходилось создавать и разрывать 30 соединений. Это создавало избыточную нагрузку на серверы. А страниц в новомодном интернете тем временем становилось больше с каждым днем.

HTTP/1.1 решал проблему масштабирования в первую очередь за счет постоянных (persistent) соединений. Теперь одно TCP-соединение можно было использовать для последовательной загрузки множества файлов.

Помимо этого, в  HTTP/1.1 появились и другие важные функции. Кеширование позволило браузерам хранить локальные копии ресурсов, а значит, уменьшить количество запросов к серверу. Виртуальные хосты через обязательный заголовок Host дали возможность размещать несколько сайтов на одном IP-адресе, что экономило ресурсы и упрощало инфраструктуру.

Благодаря постоянным соединениям и кешированию страницы стали сложнее. Гипертекст оброс стилями (CSS) и логикой (JavaScript). Он перестал быть просто набором страниц, превратившись в интерактивную среду. Началась эра веб-приложений.

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

Новые узкие места HTTP/1.1

Решив проблему масштабирования, HTTP/1.1 породил новые «бутылочные горлышки», которые стали вызовом для следующего поколения протоколов.

Цена безопасности: TLS-handshake

Важно отметить, что сам HTTP/1.1 не включал шифрование — оно появилось как дополнительный слой. SSL (Secure Sockets Layer) был разработан Netscape еще в 1995 году, а в 1999 году его сменил более совершенный TLS (Transport Layer Security). Шифрование накладывалось поверх HTTP/1.1, образуя HTTPS.

Это породило новое «горлышко» — задержку из-за обязательного TLS-handshake, процедуры, без которой невозможно установить защищенное соединение.

TLS-handshake представляет собой многоэтапный процесс согласования параметров безопасности между клиентом и сервером. Браузер и сервер вынуждены провести сложное «рукопожатие», состоящее из нескольких этапов:

  • обмен приветствиями и согласование шифрования;

  • проверка подлинности сервера по сертификату;

  • обмен секретными ключами.

На медленных или высоколатентных сетях все это могло добавлять сотни миллисекунд ко времени открытия каждой страницы. Таким образом, решив проблему нагрузки с помощью постоянных соединений, разработчики столкнулись с новой — задержкой при установке безопасного соединения. Борьба с этой задержкой стала ключевой задачей, к которой я вернусь в разговоре о HTTP/3.

Пробки в сети: Head-of-line blocking

Другим фундаментальным ограничением HTTP/1.1 оставались Head-of-line-блокировки, или, попросту, «очереди» из запросов. Хотя соединения стали постоянными, запросы все равно обрабатывались строго последовательно.

Дело в том, что для TCP обязательной (и даже гарантированной) является доставка пакетов в строгой очередности. То есть браузер запрашивает сначала картинку, а затем CSS-файл. Если загрузка картинки застряла на 80%, CSS-файл не загружается, хотя мог бы скачаться в разы быстрей изображения. И пока картинка (например, фон) не загрузится, сайт будет выглядеть криво.

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

Промежуточные технологии SPDY и gQUIC

SPDY

Технологии SPDY и gQUIC (обе от Google), хотя и являются промежуточными в контексте развития протокола HTTP, легли в основу протокола HTTP/2.0 и сыграли важную роль в развитии того интернета, каким мы знаем его сегодня. Можно сказать, что они выступили полигонами, на которых тестировали и отрабатывали концепции, позже включенные в официальный стандарт HTTP.

Экспериментальный протокол SPDY (Speedy) был разработан в 2009 году. Его главной целью было ускорение загрузки веб-страниц и преодоление той самой ситуации с Head-of-line blocking, которую сохранила и пронесла через годы версия 1.1.

Ключевые идеи, реализованные в SPDY:

  • Мультиплексирование потоков: появилась возможность одновременно отправлять несколько запросов и ответов по одному TCP-соединению.

  • Сжатие заголовков позволило уменьшить объем передаваемых данных.

  • Приоритизация потоков браузер мог определять важность ресурсов. Например, сначала загружался HTML, а уже затем — фоновые изображения. 

gQUIC/QUIC

gQUIC, еще один протокол от Google, развивался в экспериментальном режиме с 2012 до 2016 года. Сначала его тестировали только в поиске и YouTube, и только для браузера Chrome. Большинство пользователей не замечали, но в Chrome все сервисы Google работали быстрее именно из-за него.

Революционной идеей gQUIC стал отказ от TCP в пользу UDP: весь веб до этого момента работал поверх TCP с его гарантированной доставкой пакетов в строгом порядке. UDP же — это протокол «выстрелил и забыл», без гарантий доставки и порядка. Google увидела в «безответственности» UDP огромный потенциал: QUIC, работающий поверх UDP, сам решает, какие пакеты критичны, а какие нет. Браузеру больше не нужно ждать, пока догрузится потерянный пакет с баннером.

Продолжая аналогию с дорогами: если TCP — это узкий проезд, то QUIC поверх UDP — это дорога, где каждый тип данных едет по своей полосе. 

Работа поверх UDP также позволила объединить «рукопожатия» (handshakes). Поскольку QUIC не зависит от TCP, разработчики смогли встроить TLS 1.3 прямо в протокол. Теперь вместо последовательности «установить TCP → провести TLS-handshake → начать передачу» все происходило параллельно в рамках одного QUIC-handshake. Ключевая «фишка» — 0-RTT (Zero Round-Trip Time Resumption): при повторном подключении к серверу клиент мог отправлять данные в самом первом пакете, не дожидаясь ответа.

Но главным преимуществом стала миграция соединения: отныне переключение с Wi-Fi на мобильный интернет не прерывало видеозвонок или загрузку файла. QUIC «запоминает» соединение не по IP-адресу, который меняется при смене сети, а по уникальному идентификатору Connection ID, который остается неизменным.

В 2016 году gQUIC передали рабочей группе IETF (Internet Engineering Task Force) — организации, которая стандартизирует все интернет-протоколы. Протокол был унифицирован, потерял букву G в названии и стал просто QUIC, перейдя из разряда проприетарного решения Google к открытому стандарту. Позже он лег в основу HTTP/3.

Новая надежда. HTTP/2 (2015)

Боль: огромная латентность при загрузке множества ресурсов, TCP HOL-блокировка.
Решение: мультиплексирование, бинарные фреймы, сжатие заголовков, приоритеты.
Проблема: TCP все еще удерживает все потоки в одном канале; Server Push оказался спорным.

HTTP/2 вобрал в себя все наработки SPDY от Google, но пошел дальше. Протокол решал главную проблему HTTP/1.1 — невозможность эффективно загружать множество ресурсов параллельно.

Важным нововведением стало мультиплексирование. Если HTTP/1.1 отправлял запросы строго последовательно, то HTTP/2 разбивает данные на небольшие фреймы и передает их параллельно по одному TCP-соединению. Браузер может одновременно запросить HTML, CSS, JavaScript и изображения, не дожидаясь завершения каждого запроса.

Протокол перешел на бинарный формат вместо текстового. HTTP/1.1 передавал команды простым текстом, что было удобно для отладки, но неэффективно. Бинарные фреймы HTTP/2 компактнее и обрабатываются на порядок быстрее.

Сжатие заголовков (HPACK) решило проблему избыточности. Раньше каждый запрос содержал полный набор заголовков — часто больший, чем сами данные. HPACK же создает «словарь» между клиентом и сервером и после первого запроса передает только изменения. Вместо 500 байт заголовков — несколько байт с указанием «как в прошлый раз, но другой URL».

Server Push позволил серверам отправлять ресурсы превентивно. Получив запрос на HTML, сервер может сразу отправить критические CSS и JavaScript, не дожидаясь отдельных запросов. А приоритизация потоков дала браузерам возможность указывать важность ресурсов — CSS получает высокий приоритет, картинки внизу страницы — низкий.

Однако HTTP/2 решил проблему Head-of-line blocking только на уровне протокола HTTP — разные запросы теперь не блокировали друг друга внутри HTTP/2. Но все эти потоки по-прежнему передавались через одно TCP-соединение, и здесь проблема осталась: если TCP терял пакет из любого потока, он останавливал доставку всех последующих пакетов до тех пор, пока потерянный не будет переотправлен и получен. Получается, HTTP/2 устранил очередь на своем уровне, но не смог обойти фундаментальное ограничение TCP — обязательную последовательную доставку. Head-of-line blocking просто спустился на уровень ниже, из HTTP в TCP.

На практике Server Push часто отправлял ресурсы, которые браузер уже имел в кеше, и многие сайты отключили эту функцию.

Эти ограничения показали: для следующего прорыва нужно было пересмотреть сам транспортный уровень. Так началась разработка HTTP/3 на основе QUIC.

HTTP/3. Финальная сборка (2022 — настоящее время)

Боль: потери пакетов и миграции сетей рушат соединения.
Решение: QUIC поверх UDP: независимые потоки, Connection ID, встроенный TLS 1.3.
Проблема: сложнее внедрение, нагрузка на middleboxes, неравномерная поддержка в старых сетях.

В 2018 году рабочая группа IETF приняла решение: протокол HTTP-over-QUIC, который тестировался с 2012 года, станет официальным преемником HTTP/2 под названием HTTP/3. Стандартизация завершилась в июне 2022 года выпуском RFC 9114.

Уникальность ситуации в том, что к моменту официального релиза HTTP/3 уже несколько лет обслуживал миллионы пользователей через Chrome и сервисы Google. Впервые в истории веба практика сильно опередила стандарт.

Почему HTTP/3 — это не HTTP/2 поверх QUIC

Полный отказ от TCP стал точкой невозврата. Тридцать лет веб строился на TCP с его гарантированной доставкой и строгим порядком пакетов. HTTP/3 разорвал эту связь, построив собственную систему надежности поверх «ненадежного» UDP.

Новая модель потоков изменила саму логику передачи данных. В HTTP/2 мультиплексирование работало через фреймы внутри одного TCP-соединения. В HTTP/3 каждый поток QUIC полностью независим — потеря пакета в одном потоке не может повлиять на другие.

QPACK вместо HPACK для сжатия заголовков. Мелочь, но QPACK спроектирован для работы с независимыми потоками QUIC, где пакеты могут приходить в произвольном порядке. HPACK с его строгой последовательностью здесь бы не работал.

Отказ от неудачных экспериментов. Server Push, который в HTTP/2 считался прорывной функцией, в HTTP/3 объявлен устаревшим. На практике оказалось, что серверы плохо предсказывают, что нужно клиенту, и часто отправляют лишнее.

Что HTTP/3 унаследовал и переосмыслил

От HTTP/2 пришли базовые концепции: мультиплексирование, бинарный протокол, приоритизация ресурсов. Но каждая реализована на новом уровне благодаря возможностям QUIC.

От экспериментальных протоколов SPDY и gQUIC — сама идея переизобретения транспортного уровня. HTTP/3 стал кульминацией десятилетних экспериментов Google с альтернативными протоколами.

Встроенное шифрование TLS 1.3 больше не опция, а обязательное требование. В отличие от HTTP/2, где HTTPS был рекомендацией, HTTP/3 в незашифрованном виде не существует.

Реальность внедрения (2025)

По данным на 2025 год, около 30% сайтов из топ-10 000 поддерживают HTTP/3. Cloudflare, Google, Facebook обслуживают большую часть трафика через новый протокол. На мобильных сетях прирост производительности достигает 15–20%, особенно в условиях нестабильного соединения.

Но есть и проблемы. Многие корпоративные сети и старые маршрутизаторы блокируют UDP-трафик, считая его «игровым» или потенциально опасным. Некоторые операторы связи ограничивают UDP, опасаясь DDoS-атак. Middleboxes (промежуточное сетевое оборудование) часто не понимает QUIC и может его блокировать или искажать.

Новые бутылочные горлышки (2025)

HTTP/3 решил фундаментальные проблемы транспортного уровня, но борьба за производительность переместилась на новые фронты.

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

Битва алгоритмов контроля перегрузок. BBR от Google против классического CUBIC — борьба за каждую миллисекунду при высоких нагрузках. BBR агрессивнее занимает полосу, что хорошо для скорости, но создает проблемы справедливого разделения канала.

Приватность против производительности. Encrypted Client Hello (ECH) скрывает, к какому сайту вы подключаетесь, но добавляет задержку. Oblivious HTTP (OHTTP) прячет ваш IP от сервера, но требует промежуточных узлов.

Оптимизация для edge computing. Когда контент раздается с тысяч edge-серверов по всему миру, классические CDN-стратегии перестают работать. Нужны новые подходы к маршрутизации и кешированию.

Что там дальше? 

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

Охота за «бутылочными горлышками» продолжается, но теперь на уровне, где счет идет на микросекунды. Следующие вызовы: квантово-устойчивая криптография потребует новых алгоритмов, edge computing изменит архитектуру сети, а растущие требования видеоконференций и удаленной работы создадут запрос на протоколы с еще меньшей латентностью.

35-летняя история HTTP — это история постоянной борьбы с ограничениями. Каждое решение порождает новые проблемы, каждая версия протокола открывает новые горизонты. И эта гонка, похоже, никогда не закончится.

Комментарии (3)


  1. JBFW
    26.09.2025 09:00

    Тут есть важный вопрос: а кто же создает эти ограничения? (я сейчас не про РКН)

    Когда-то вебмастер сидел, и вручную подбирал степень сжатия jpeg, чтобы картинка не сильно "мылилась", но с 200 кб сжалась до 50 - и это ускоряло загрузку в 4 раза.

    Сейчас "а давайте влепим компонент, создающий вот такой интересный эффект анимации?" + 3 мегабайта. В локальной сети разработчика эффект замедления не выражен, но где-то "на природе" по нестабильному мобильному интернету получаем проблему, вместо секунды загрузки - несколько десятков секунд, в т.ч. с переключениями между БС связи, что еще ухудшает ситуацию.

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


    1. Wadzhio
      26.09.2025 09:00

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


  1. Kabron287
    26.09.2025 09:00

    Давайте лучше поговорим о том какие индусы пишут вам коды для мобильного приложения.

    Весь интернет стонет уже лет 5.

    Приложение не устанавливается поверх себя, а если его снести, теряются все настройки.

    Неужели за пять лет нельзя научиться обходить грабли?

    И, главное долбит при каждом запуске: переустановите!!!!