$ sudo teach IT
Модуль 7

HTTP — язык всемирной паутины

Протокол, на котором браузер разговаривает с сайтами, а приложения — со своими серверами. Самый «видимый» из всех протоколов.

Вы узнаете
  • из чего состоят запрос и ответ HTTP;
  • что означают методы, коды состояния и заголовки;
  • как работают cookie и кеш и чем отличаются версии HTTP/1.1, HTTP/2 и HTTP/3.

7.1Запрос, ответ и адрес ресурса

HTTP (HyperText Transfer Protocol) работает по схеме «вопрос — ответ». Клиент (браузер или приложение) отправляет запрос, сервер возвращает ответ. Сам сервер разговор не начинает.

Важное свойство HTTP — он не хранит состояние: каждый запрос самостоятелен, и сервер по умолчанию не помнит, что вы спрашивали минуту назад. Всё, что нужно для ответа, должно содержаться в самом запросе.

То, что запрашивает клиент, называется ресурсом, а его адрес —URL. Разберём адрес на части:

https://shop.example.com:443/catalog/phones?color=black#reviews

Часть В примере Что означает
Схема https Каким протоколом пользоваться
Хост shop.example.com Имя сервера — его адрес выясняется через DNS
Порт 443 Обычно не пишется: 80 для http и 443 для https подразумеваются
Путь /catalog/phones Какой именно ресурс нужен на сервере
Параметры запроса color=black Уточнения: фильтры, номер страницы, поисковая фраза
Фрагмент reviews Место на странице. На сервер не отправляется — им пользуется только браузер

7.2Как выглядят запрос и ответ

В классическом HTTP/1.1 сообщения — это обычный текст, который можно прочитать глазами. Запрос состоит из стартовой строки, заголовков и необязательного тела:

GET /catalog/phones?color=blackHTTP/1.1← метод, путь, версия Host: shop.example.com← к какому сайту обращаемся User-Agent: Mozilla/5.0 (…)← что за программа спрашивает Accept: text/html← какой формат ответа устроит Accept-Language: ru← предпочитаемый язык ← пустая строка: заголовки закончились

Ответ устроен зеркально: строка состояния, заголовки и тело — собственно содержимое.

  • HTTP/1.1 200 OK← версия, код и пояснение Content-Type: text/html; charset=utf-8← что лежит в теле ответа Content-Length: 5120← размер тела в байтах Cache-Control: max-age=3600← можно хранить в кеше один час
  • <!doctype html>← тело: сама страница <html> … </html>

Обычная страница — это не один запрос, а десятки и сотни: браузер получает HTML, находит в нём ссылки на стили, скрипты, шрифты и картинки и запрашивает каждый ресурс отдельно.

7.3Методы: что клиент хочет сделать

Первое слово запроса —метод. Он сообщает серверу, какое действие требуется:

Метод Назначение Меняет ли данные на сервере
GET Получить ресурс Нет
HEAD Получить только заголовки, без тела Нет
POST Отправить данные: форму, комментарий, заказ Да; повтор может создать дубликат
PUT Целиком заменить ресурс новым содержимым Да; повтор даёт тот же результат
PATCH Изменить часть ресурса Да
DELETE Удалить ресурс Да; повтор даёт тот же результат
OPTIONS Узнать, какие действия разрешены Нет
Пояснение

Знаменитое предупреждение браузера «Отправить форму повторно?» связано именно с этим. GET можно безопасно повторить сколько угодно раз, а повторный POST способен оформить второй заказ или списать деньги дважды — поэтому браузер переспрашивает.

7.4Коды состояния: что ответил сервер

Каждый ответ начинается с трёхзначного кода состояния. Первая цифра определяет группу:

Группа Смысл Частые коды
1xx Информация 101 — переключение протокола (например, на WebSocket)
2xx Успех 200 — всё в порядке · 201 — ресурс создан · 204 — выполнено, тела в ответе нет
3xx Перенаправление 301 и 308 — переехало навсегда · 302 и 307 — временно в другом месте · 304 — не изменилось, берите из кеша
4xx Ошибка клиента 400 — некорректный запрос · 401 — нужно войти · 403 — доступ запрещён · 404 — не найдено · 429 — слишком много запросов
5xx Ошибка сервера 500 — внутренняя ошибка · 502 — промежуточный сервер получил плохой ответ · 503 — сервис недоступен · 504 — промежуточный сервер не дождался ответа
Простое правило

Код на 4 — что-то не так с запросом: неверный адрес, нет прав, не выполнен вход. Код на 5 — проблема на стороне сайта, и от вас ничего не зависит: остаётся подождать.

7.5Заголовки: служебная информация

Заголовки — это пары «название: значение», которые сопровождают запрос и ответ. Их десятки; вот те, что встречаются чаще всего:

Заголовок Где О чём сообщает
Host Запрос Имя сайта. Нужно, потому что на одном IP-адресе могут жить сотни сайтов.
User-Agent Запрос Браузер, приложение и операционная система клиента.
Accept, Accept-Language, Accept-Encoding Запрос Какие форматы, языки и способы сжатия понимает клиент.
Authorization Запрос Данные для проверки прав: токен или логин с паролем.
Cookie Запрос Сохранённые ранее данные этого сайта.
Referer Запрос С какой страницы пришёл пользователь.
Content-Type Оба Формат тела: HTML, JSON, картинка, видео.
Content-Length Оба Размер тела в байтах.
Content-Encoding Ответ Каким способом сжато тело: gzip, br, zstd.
Set-Cookie Ответ Просьба к браузеру сохранить данные и присылать их в следующих запросах.
Location Ответ Куда перейти при перенаправлении.
Cache-Control, ETag Ответ Можно ли хранить ответ в кеше и как проверить, не устарел ли он.

7.6Cookie, сессии и кеш

Раз HTTP не помнит предыдущих запросов, как сайт узнаёт, что вы уже вошли в аккаунт? С помощью cookie — небольших фрагментов данных, которые сервер просит браузер сохранить.

1.Вы вводите логин и пароль. Сервер проверяет их и создаёт сессию — запись «этот посетитель —

такой-то пользователь».

2.В ответе приходит заголовок Set-Cookie с длинным случайным идентификатором сессии.

3.Браузер сохраняет его и автоматически прикладывает к каждому следующему запросу на этот

сайт в заголовке Cookie.

4.Сервер по идентификатору находит сессию и понимает, кто перед ним.

Почему COOKIE нужно беречь

Идентификатор сессии — это временный пропуск: у кого он есть, тот и считается вошедшим, пароль уже не нужен. Поэтому важно, чтобы cookie передавались только по защищённому соединению. Для этого у них есть специальные пометки: Secure (только по HTTPS), HttpOnly (недоступна скриптам на странице) и SameSite (не отправлять при переходах с чужих сайтов).

Кеширование

Логотип сайта не меняется годами — скачивать его при каждом визите незачем. Сервер сообщает заголовком Cache-Control, как долго ответ можно хранить. Когда срок истёк, браузер не скачивает ресурс заново, а спрашивает: «У меня есть версия с такой-то меткой ( ETag), она ещё актуальна?» Если да, сервер отвечает коротким кодом 304 без тела — и это экономит и время, и трафик.

7.7Версии HTTP: от 1.1 до 3

Смысл HTTP — методы, коды, заголовки — за тридцать лет почти не изменился. Менялся способ доставки, и каждая новая версия ускоряла загрузку страниц:

Версия Год Транспорт Главное
HTTP/1.0 1996 TCP На каждый запрос — новое соединение. Просто, но медленно.
HTTP/1.1 1997 TCP Соединение используется повторно. Но запросы в нём идут строго по очереди, поэтому браузеры открывают к сайту по шесть соединений сразу.
HTTP/2 2015 TCP + TLS Двоичный формат вместо текста. Мультиплексирование: десятки запросов одновременно в одном соединении. Сжатие заголовков.
HTTP/3 2022 QUIC (UDP) Отказ от TCP. Потеря пакета задерживает только один запрос, а не все. Быстрое установление соединения, устойчивость к смене сети.

Почему HTTP/2 оказалось недостаточно? В нём все запросы делят одно соединение TCP, а TCP, как мы помним, при потере одного сегмента задерживает всё, что идёт следом. В плохой сети один потерянный пакет тормозил сразу все загрузки. HTTP/3 решил это, перейдя на новый транспорт — QUIC; о нём речь в следующем модуле.

Что из этого нужно делать вам
  • Ничего. Браузер и сервер сами договариваются о самой новой версии, которую поддерживают оба. Все три версии сегодня используются одновременно.
На следующий урок