HTTP

22 июля 2026 · ~14 мин чтения

протокол веб сеть http история

HTTP

HTTP (HyperText Transfer Protocol) — это набор правил, по которым один компьютер (обычно браузер или приложение) просит у другого какую-то штуку и получает ответ. Простой диалог из двух реплик: запрос — ответ.

История

1989–1991 год, Швейцария, CERN. Британский физик Тим Бернерс-Ли (Tim Berners-Lee) работает в CERN — крупном европейском центре ядерных исследований. У учёных много документов, разбросанных по разным компьютерам, и нет удобного способа ссылаться из одного на другой. Бернерс-Ли предлагает связку из трёх идей: URL (адрес), HTML (язык разметки) и HTTP (протокол передачи). Так рождается World Wide Web — та самая паутина, которую мы теперь называем «интернетом», хотя интернет и веб — это разные вещи.

1991 — HTTP/0.9. Первая версия. В ней ровно один метод — GET, и в ответ сервер отправлял голый HTML без всяких заголовков. Запрос выглядел так: GET /page.html — одна строка, и всё. Ни статусов, ни типа контента, ни авторизации. Хватило, чтобы веб взлетел.

1996 — HTTP/1.0, RFC 1945. Первый по-настоящему стандартизированный документ. Добавили заголовки, коды состояния (200, 404 и компанию), несколько методов (GET, POST, HEAD), возможность передавать не только HTML, но и картинки, видео, что угодно. Каждый запрос при этом открывал новое TCP-соединение — накладно.

1997 → 1999 → 2014 → 2022 — HTTP/1.1. Долгожитель. Сначала RFC 2068 (1997), потом основной RFC 2616 (1999), который цитируют до сих пор. В 2014 году его переиздали как серию RFC 7230–7235 (разбили на кусочки для удобства), а в 2022 году актуализировали как RFC 9110–9112. Главные фишки HTTP/1.1 — переиспользование TCP-соединений (keep-alive), возможность передавать данные кусками (chunked encoding), обязательный заголовок Host. Именно на HTTP/1.1 до сих пор работает огромная часть интернета.

2015 — HTTP/2, RFC 7540. Вырос из протокола SPDY (произносится «спиди»), который Google придумал в 2009 году. Главное новшество — мультиплексирование: несколько запросов и ответов идут одновременно внутри одного TCP-соединения, не мешая друг другу. Плюс сжатие заголовков (HPACK) и бинарный формат вместо текстового.

2022 — HTTP/3, RFC 9114. Радикально: отказались от TCP, переехали на UDP через новый транспортный протокол QUIC (тоже Google, ~2013 год, потом стандартизирован IETF). Это убирает старую проблему TCP под названием head-of-line blocking (блокировка очереди), про которую разберём ниже.

Кто ведёт стандарт сейчас. IETF HTTP Working Group — открытая рабочая группа при Инженерном совете интернета (IETF). Спецификации бесплатные, обсуждаются публично в списках рассылки. Если завтра появится HTTP/4 — он тоже пройдёт через них.

Что это такое

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

Ключевое свойство — statelessness (без запоминания состояния). Сервер по умолчанию ничего не помнит между запросами. Каждый запрос — самодостаточный кусок: в нём есть всё, что нужно серверу, чтобы понять, что делать. Про то, как это обходят с помощью cookies и токенов, будет ниже.

Внутри одного запроса три части: строка запроса (метод + путь + версия HTTP), заголовки (метаданные — имя сайта, тип содержимого, авторизация, cookies и десятки других полей) и опционально тело (данные, которые ты отправляешь на сервер — например, JSON с новым постом или файл на загрузку).

Ответ устроен зеркально: строка статуса (версия + код состояния + короткая расшифровка вроде «OK» или «Not Found»), заголовки (тип контента, длина, кэш-политика, куки) и тело (собственно HTML, картинка, JSON — что запросил).

HTTP vs HTTPS. HTTPS — это тот же HTTP, но обёрнутый в шифрованный туннель TLS. Логика запросов-ответов та же, но снаружи никто не видит содержимого. В блоге уже подробно разобрано в статье про HTTPS, повторяться не буду.

HTTP vs WebSocket. HTTP — это дискретные запросы-ответы, инициатор всегда клиент. WebSocket — постоянное двустороннее соединение, где и сервер может первым что-то прислать клиенту (например, новое сообщение в чате). WebSocket даже открывается через HTTP-запрос с особым заголовком Upgrade, а потом «переключается» на свой протокол.

HTTP vs FTP. FTP (File Transfer Protocol, 1971 год) — старый специализированный протокол для передачи файлов, с отдельным управляющим соединением и отдельным для данных. HTTP универсальнее и проще, поэтому в вебе он выиграл — сейчас FTP используют разве что старые хостинги и внутренние сервисы.

Аналогии из жизни

Официант в ресторане.
Ты (клиент) подзываешь официанта, говоришь «принеси, пожалуйста, капучино», официант уходит на кухню и приносит чашку. Простой запрос → простой ответ. Официант не помнит, что ты вчера заказывал, — если ты хочешь скидку по программе лояльности, ты сам должен показать карту (это как cookie или токен в HTTP).
Где ломается: реальный официант всё-таки замечает лицо и может подсказать «вам как обычно?». HTTP-сервер лица не помнит — если ты пришёл без cookie, для него ты новый человек, даже если минуту назад залогинился. Ещё в ресторане официант сам инициирует диалог («ещё что-нибудь?»). В HTTP это невозможно — сервер молчит, пока клиент не спросит.

Служба доставки с трек-номерами.
Ты оформляешь заказ (запрос), тебе присылают ответ с трек-номером и статусом «принят» — код 202. Через день статус меняется на «в пути», через два — «доставлен» (200). Если склад закрыт — «попробуйте позже» (503). Если ты указал несуществующий адрес — «не найдено» (404). Каждый статус — это код HTTP-состояния из реальной жизни.
Где ломается: доставка помнит твой заказ и сама тебе звонит, когда курьер подъезжает. В чистом HTTP такого «сама звонит» нет — только клиент опрашивает сервер. Чтобы имитировать пуш-уведомления, используют либо периодический polling (клиент часто спрашивает «есть новости?»), либо WebSocket, либо Server-Sent Events.

Автомат с газировкой.
Ты кидаешь монету (запрос), автомат выдаёт банку (ответ). Никакого запоминания: следующий человек с той же кнопкой получит ровно то же самое, автомат не в курсе, что ты уже брал. Разные кнопки — разные пути (GET /cola, GET /voda). Кнопка сдачи — это POST /refund. Если банок нет — 404 или 503 «временно недоступно».
Где ломается: аналогия ломается там, где автомату надо помнить, что именно ты, конкретный человек, только что купил. Автомат не помнит — и HTTP по умолчанию тоже. Чтобы связать несколько запросов от одного пользователя, придумали cookies (Netscape, 1994 год, инженер Лу Монтулли (Lou Montulli)): сервер в ответе кладёт маленький кусочек данных, браузер сохраняет и прикладывает к следующим запросам. Так родилась «сессия».

Как это работает

Разберём один запрос по шагам. Возьмём простой пример: браузер открывает http://example.com/page.html.

Шаг 1. DNS-резолвинг. Браузер спрашивает у DNS: «какой IP у example.com?» — получает, например, 93.184.216.34. Это ещё не HTTP, но без этого шага никуда.

Шаг 2. TCP-соединение. Браузер открывает TCP-соединение с этим IP на порт 80 (стандартный порт HTTP; для HTTPS — 443). Это три пакета туда-обратно (SYN → SYN-ACK → ACK), но об этом обычно не думают.

Шаг 3. HTTP-запрос. Браузер отправляет в открытый сокет текст примерно такого вида:

GET /page.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml
Accept-Language: ru,en;q=0.9
Cookie: session_id=abc123
Connection: keep-alive

Первая строка — строка запроса: метод (GET), путь (/page.html), версия протокола (HTTP/1.1). Дальше заголовки в формате «имя: значение», каждый на своей строке. Заголовки заканчиваются пустой строкой. У GET тела обычно нет; у POST после пустой строки шло бы тело — например, JSON с данными формы.

Шаг 4. Сервер обрабатывает. Веб-сервер (nginx, Apache, встроенный сервер в приложении) читает запрос, определяет, куда его отправить (статичный файл? код на Python? прокси на другой сервис?), и формирует ответ.

Шаг 5. HTTP-ответ. Сервер отправляет обратно:

HTTP/1.1 200 OK
Date: Wed, 22 Jul 2026 06:00:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1523
Cache-Control: max-age=3600
Set-Cookie: last_visit=2026-07-22

<!DOCTYPE html>
<html>...

Первая строка — строка статуса: версия, код (200), человекочитаемая расшифровка (OK). Дальше заголовки, пустая строка, потом тело (HTML в нашем случае).

Шаг 6. Браузер разбирает и рисует. Смотрит Content-Type, понимает, что это HTML, парсит, находит внутри ссылки на CSS/JS/картинки — и отправляет ещё десятки HTTP-запросов за ними. Каждая современная страница — это не один запрос, а обычно 30–200 отдельных.

Методы HTTP — глаголы, которые говорят серверу, что сделать:

Коды состояния — трёхзначные числа, сгруппированные по классам:

Statelessness — не баг, а фича

То, что HTTP не помнит между запросами, кажется недостатком — но именно это позволило вебу масштабироваться до миллиардов пользователей. Сервер можно перезапустить, заменить, размножить на сотню машин за балансировщиком, и клиент этого не заметит: следующий запрос обработает любой узел, потому что вся нужная информация приезжает вместе с запросом (в заголовках, cookies, токенах). Если бы сервер должен был помнить каждого — пришлось бы всех держать на одной машине или мучиться с синхронизацией состояния.

Где встречается в обычной жизни

Где встречается в IT и бизнесе

Retry без backoff — это шторм повторов

Если наивно ретраить запрос сразу после ошибки, тысячу раз в цикле — легко устроить сервер-адресату DDoS-подобную нагрузку и добить его окончательно. Все продовые клиенты (SDK от крупных сервисов, HTTP-клиенты в языках) идут с встроенным экспоненциальным backoff и максимальным числом попыток. При работе с любым API правило простое: не смог с первого раза — жди, следующий раз жди дольше, после 5–7 попыток сдавайся и логируй.

Кто пользуется

Все. HTTP — самый распространённый протокол прикладного уровня в интернете. По данным W3Techs и Cloudflare Radar (публичные дашборды), к 2025 году примерно половина трафика крупных сайтов идёт по HTTP/2, а доля HTTP/3 стабильно растёт и по разным оценкам приближается к 30–35%. Точных цифр я не помню — проверять на cloudflare-radar.com или w3techs.com.

Конкретно:
- Google, Meta, Cloudflare, Netflix, Amazon — все давно переехали на HTTP/2 и активно катят HTTP/3.
- Российские крупные сайты (Яндекс, VK, Авито, Ozon) — тоже HTTP/2, часть уже поддерживает HTTP/3 через QUIC.
- Маленькие сайты и nginx-по-умолчанию — часто ещё на HTTP/1.1, потому что для одного домена без большого трафика разница почти незаметна.

Альтернативы и конкуренты

Когда НЕ стоит использовать

Связанные понятия

Литература и источники

Где встретилось у меня

Вчера весь день ковырялся с API Яндекс.Директа и параллельно диагностировал странности в iMessage и Telegram-ботах. HTTP-коды мелькали постоянно: 200 — всё ок, 401 — токен протух, надо обновить, 429 — «слишком часто, притормози». Пришлось руками прикручивать нормальный retry с экспоненциальной выдержкой, потому что без него клиент просто заваливал API и получал 429 бесконечным потоком.

Краткое резюме