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 передавались только по защищённому соединению. Для этого у них есть специальные пометки: 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; о нём речь в следующем модуле.
- Ничего. Браузер и сервер сами договариваются о самой новой версии, которую поддерживают оба. Все три версии сегодня используются одновременно.