Мало кто задумывается о том, как работает интернет. Мы переходим по ссылкам, работаем с приложениями, играем в игры, загружаем и скачиваем файлы. Что происходит в эти моменты? Каждое устройство, подключенное к сети, общается друг с другом с помощью специальных протоколов связи — их на самом деле очень много, но самый основной и важный носит аббревиатуру HTTP — Hypertext Transfer Protocol. Дословный перевод данной фразы — «протокол передачи гипертекста». С помощью данного протокола большая часть устройств «общается» друг с другом внутри глобальной сети.
По факту, протокол HTTP можно сравнить с языком. Чтобы два человека поняли друг друга, им нужно знать и разговаривать, например, на русском языке. Вот этот протокол и есть «язык» общения между устройствами в интернете.
Гипертекст представляет собой особый вид информации, включающий встроенные ссылки на другие ресурсы, благодаря чему пользователи получают возможность быстро перемещаться между различными фрагментами содержимого.
Изначально разработанный исключительно для обмена веб-документами формата HTML, протокол HTTP впоследствии существенно эволюционировал и теперь поддерживает передачу широкого спектра данных — начиная от графических файлов и видеоматериалов, заканчивая сложными запросами к API-интерфейсам и прочими видами цифровых ресурсов, например, передачу потокового видео.
HTTP работает по модели «клиент-сервер»: браузер (является клиентом) отправляет запрос на сервер, который обрабатывает его и возвращает ответ. Это протокол уровня приложений, что означает, что он полагается на нижележащие транспортные протоколы (обычно TCP) для фактической передачи данных.
История HTTP
Протокол был создан ученым CERN в 1990 году, изначально задумавшийся как часть всемирной паутины. Да, были различные компьютерные сети, которые соединяли научные институты, промышленные предприятия и государственные структуры, но единой сети не было. Изначально протокол HTTP был очень простой — для обмена гипертекстовыми данными, ведь в то время компьютеры, по факту, были текстовыми или имели очень примитивную графику.
Первая версия протокола HTTP/0.9 была простой и примитивной. Поддерживались только GET-запросы, заголовки и прочая информация отсутствовала. По факту, от клиента поступал запрос вида site.com/document.html, а сервер просто отдавал целиком то, что он нашел по этому адресу.
HTTP/1.0
Так продолжалось до 1996 года, когда появился уже более «современный» HTTP/1.0, который уже можно считать прообразом современного протокола. Добавилось множество функций. Появились заголовки запросов и ответов, по которым клиент и сервер ориентируются, появились коды состояния (404, 301, 200 OK и прочие). Особо можно отметить появление возможности передачи различного контента через MIME-типы (возможность загружать и скачивать файлы), появились методы POST и GET, добавилась авторизация и возможность кэширования содержимого веб-страницы, чтобы не запрашивать повторно одни и те же данные.
Несмотря на прорыв, протокол имел существенный недостаток — каждый запрос к веб-странице и ее содержимому инициировал создание нового TCP-соединения, что приводило к большой нагрузке как к серверу, так и к компьютеру и сети. Представим себе, что веб-страница состоит из десятка изображений и на каждую картинку открывался новый сокет. Данную проблему решили только к 1997 году, выпустив обновленную версию протокола HTTP/1.1.
HTTP/1.1
Версия HTTP/1.1 стала еще лучше — наконец-то протокол получил возможность постоянного соединения (keep-alive) для нескольких запросов к одному ресурсу. Это не только позволило облегчить нагрузку на клиент-сервер, но и ускорило загрузку содержимого веб-страницы. В предыдущей версии протокола запросы отправлялись последовательно, а в обновленной уже в рамках одного соединения. Например, мы запрашиваем веб-страницу, а для ее загрузки нужны другие ресурсы (CSS, скрипты, изображения). Раньше ответы происходили последовательно, а в 1.1-й версии появилась возможность запрашивать сразу все, что нужно — это также ускорило весь процесс.
Ключевой особенностью протокола стала чанкированная передача данных (chunked transfer encoding). Раньше сервер должен был знать точный объем файла, например, изображения. После введения этой особенности браузер мог собирать объект по кускам и уже в клиенте соединял воедино. Так появилась возможность трансляции стримов и возможность дозагрузки файла через браузер — когда объем заранее неизвестен или постоянно пополняется.
Раньше, если на 1 сервере (IP-адресе) можно было разместить только один сайт. Сервер не знал, что такое сайт вообще. С появлением заголовка Host появилась возможность размещать на 1 IP-адресе сразу несколько сайтов (виртуальный хостинг), что сильно повлияло на развитие интернета. Раньше же это было проблемой — нужен был отдельный IP-адрес или явное указание порта, пример: 127.0.0.1:8080.
Улучшились функции кэширования — появилась метка времени, сколько должен браузер хранить документ в кэше, а также уникальная метка файла.
Можно сказать, что HTTP/1.1 уже был близок к тому, чем мы пользуемся сейчас.
HTTP/2
Вторая версия протокола была также революционной — в основном интернет благодаря HTTP/2 ускорился. Протокол основан на экспериментальном протоколе Google SPDY (speedy, сокращение “быстрый”), который был лишь надстройкой над протоколом HTTP, но потом слился вместе с HTTP/2. Появился HTTP/2 в 2015 году и имел ряд ключевых особенностей:
- Вместо текстовой передачи данных появилась бинарная, что ускорило обработку в целом;
- Появилось мультиплексирование — несколько запросов в одном соединении;
- Сжатие заголовков уменьшило их избыточность;
- Появилась технология Server Push — сервер мог заранее отправлять браузеру дополнительные ресурсы (CSS-стили или скрипты), не дожидаясь отдельных запросов, тем самым ускоряя загрузку страниц.
В протоколе уменьшились задержки на 30-50%, а также появилась лучшая поддержка современных приложений (не только браузера).
HTTP/3
Самый современный протокол, выпущенный в 2022 году. Главная фишка — использование протокола QUIC вместо TCP. Когда соединение шло через TCP, то перед передачей данных клиент-серверу нужно «поздороваться» (3 шага: SYN, SYN-ACK, ACK). Главный минус TCP был в том, что часто пакеты терялись, например, при плохом соединении или при переключении между Wi-Fi и мобильным интернетом.
Протокол QUIC на основе UDP, разработанный Google, не имеет трех шагов, и соединение устанавливается сразу. Вероятность потери пакетов при этом меньше, и если даже какой-то пакет потеряется, то отправка продолжится. QUIC быстро восстанавливает соединение, что для пользователя малозаметно при проблемах.
Переход с Wi-Fi на мобильную сеть возможен без проблем. Таким образом улучшился так называемый «бесшовный» Wi-Fi.
В HTTP/3 шифрование встроено по умолчанию, поэтому работа протокола без шифрования невозможна. А вот HTTP/2 мог работать и без шифрования.
Если провести аллегорию, то HTTP/2 — доставка посылок Почтой России по минимальному тарифу, а HTTP/3 — скорая курьерская служба.
Подытожим:
- HTTP/0.9 – только текст.
- HTTP/1.0 – заголовки и коды состояния.
- HTTP/1.1 – оптимизация соединений.
- HTTP/2 – бинарный формат и мультиплексирование.
- HTTP/3 – переход на QUIC для скорости и надёжности.
Для тех, кто дочитал, дам пример HTTP-запроса, который отправляет браузер серверу:
GET /article?id=123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: ru-RU,ru;q=0.9
Connection: keep-alive
Разберем подробно:
- GET /article?id=123 – метод и путь к ресурсу (+ параметр id=123)
- HTTP/1.1 – версия протокола
- Host: example.com – обязательный заголовок (виртуальный хостинг)
- User-Agent – информация о браузере и ОС
- Accept – какие типы данных понимает (ждет) клиент
- Connection: keep-alive – просьба не разрывать соединение
А вот такой ответ уже присылает сервер:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
Date: Mon, 05 Aug 2024 10:00:00 GMT
Server: nginx/1.18.0
<!DOCTYPE html>
<html>
<head>
<title>Статья 123</title>
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это содержимое статьи...</p>
</body>
</html>
Подробно:
- HTTP/1.1 200 OK – версия протокола и код успеха
- Content-Type: text/html – тип возвращаемых данных (HTML)
- Content-Length: 1256 – размер тела ответа в байтах
- Server: nginx – служебная информация о сервере
- Пустая строка – разделитель заголовков и тела
Далее идёт HTML-страница и множество подгрузок — скрипты JavaScript, CSS-стили и прочие объекты, которые нужны браузеру для «сборки» страницы. Стоит понимать, что это был самый простейший пример HTTP-запроса и ответа — на самом деле в современном интернете такие запросы очень сложные. Для тех, кто хочет посмотреть более подробно, можно открыть консоль браузера (F12) на любом сайте и посмотреть всю структуру страницы и все запросы.
Также будет интересно:
А что с шифрованием?
- HTTP/1.0 и HTTP/1.1 — по умолчанию не шифруются (данные передаются открытым текстом). Безопасность обеспечивает только HTTPS (HTTP + SSL/TLS).
- HTTP/2 — тоже требует HTTPS для большинства браузеров, хотя формально может работать и без шифрования (на практике почти не встречается).
- HTTP/3 (QUIC) — встроенное шифрование (аналог TLS) даже в базовой версии, без HTTPS не работает.
Какой итог?
Протокол HTTP — основа современного интернета. С ним работает не только браузер, но и приложения. Протокол развивался и будет развиваться дальше — в этом нет никаких сомнений. Именно по этой причине нужно держать браузер постоянно обновленным.
Например, на браузере от 2010 года могут некорректно работать сайты не только по причине устаревшего протокола, но по той причине, что развивается сами технологии создания сайта. Например, технологию Adobe Flash заменила комбинация HTML5 + JavaScript + CSS3. Также поменялись многие технологии. А еще свежий браузер — залог безопасности, ведь хакеры тоже не спят, а постоянно выискивают уязвимости в программном обеспечении.