HTTP для начинающих - Введение в работу протокола

В этом уроке — общее описание протокола HTTP, по которому браузер и сервер обмениваются данными.
Именно с помощью этого протокола мы получаем веб-страницы и можем взаимодействовать с сайтами.

Обмен текстом

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

Определения

  • HTTP (HyperText Transfer Protocol — «протокол передачи гипертекста») — протокол общения клиента и сервера в вебе.
  • Клиент — программа, которая отправляет запрос: браузер, мобильное приложение, утилита curl.
  • Сервер — программа на удалённой машине, которая принимает запросы и отправляет ответы (веб-сервер плюс наш код).

Модель «запрос — ответ»

Общение по HTTP устроено просто и всегда происходит по одной схеме:

  1. клиент отправляет запрос (request) — например: «отдай мне страницу по такому-то адресу»;
  2. сервер обрабатывает его и возвращает ответ (response) — чаще всего HTML-код страницы, который браузер рисует на экране.

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

 БРАУЗЕР                                СЕРВЕР
    |                                     |
    |   запрос:  GET /?q=node/7716        |
    |------------------------------------>|
    |                                     |
    |   ответ: 200 OK + HTML-код страницы |
    |<------------------------------------|
    |                                     |

При этом на практике открытие одной веб-страницы — это не один запрос, а десятки: отдельный — на сам HTML, и отдельные — на каждую картинку, файл стилей и скрипт.

Из чего состоит запрос

Запрос состоит из трёх частей:

  1. стартовая строка — метод, путь и версия протокола;
  2. заголовки (headers) — дополнительные сведения в формате Имя: значение;
  3. тело (body) — передаваемые данные, например содержимое отправленной формы (у GET-запросов тело обычно пустое).
GET /?q=node/7716 HTTP/1.1
Host: fkn.ktu10.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64) Firefox/141.0
Accept: text/html

Первая строка читается так: методом GET клиент хочет получить документ по пути /?q=node/7716, общаясь по версии HTTP/1.1. Дальше — заголовки: Host — имя сайта (на одном сервере может жить много сайтов), User-Agent — сведения о программе-клиенте, Accept — какие форматы ответа клиент готов принять.

Методы: GET и POST

Метод говорит серверу, что именно клиент хочет сделать. Для начала достаточно двух:

  • GET — получить данные (страницу, картинку). Именно GET браузер отправляет, когда вы открываете ссылку;
  • POST — отправить данные на сервер: так отправляются формы (регистрация, комментарий), причём данные лежат в теле запроса.

Есть и другие методы (PUT, DELETE и т.д.) — познакомимся с ними позже, когда они реально понадобятся.

Из чего состоит ответ

Ответ устроен очень похоже:

  1. стартовая строка — версия протокола, код состояния и его текстовое описание;
  2. заголовки;
  3. тело — например, HTML-код страницы.
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
Content-Length: 52134

<!DOCTYPE html>
<html>
... начало HTML-кода страницы, который браузер превратит в привычную картинку ...
</html>

Обратите внимание на заголовок Content-Type — он сообщает клиенту формат тела: text/html — страница, image/png — картинка, application/json — данные в формате JSON.

Коды ответов

Код состояния (статус-код) — короткий числовой «вердикт» сервера о том, чем закончился запрос. Первая цифра определяет группу:

  • 2xx — всё хорошо: 200 OK — запрос выполнен;
  • 3xx — перенаправление (редирект): 301 Moved Permanently — «документ теперь постоянно живёт по другому адресу»;
  • 4xx — ошибка на стороне клиента: 404 Not Found — «такой страницы нет», 403 Forbidden — «доступ запрещён»;
  • 5xx — ошибка на стороне сервера: 500 Internal Server Error — так бывает, например, когда в нашем PHP-скрипте произошла ошибка.

HTTP «не помнит» клиента

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

HTTPS

HTTPS — тот же HTTP, но данные между браузером и сервером шифруются. Логика запросов и ответов не меняется — меняется лишь «труба», по которой они идут. Такие сайты открываются по адресу, начинающемуся с https://, рядом с которым браузер обычно рисует замочек.

Как увидеть HTTP своими глазами

  • Инструменты разработчика браузера. Нажмите F12, откройте вкладку Network («Сеть») и обновите страницу — увидите все HTTP-запросы, которыми страница добывается. Кликните по первому: на вкладке Headers видны и запрос, и ответ со статусом.
  • Утилита curl в терминале. Раз вы уже осваиваете терминал Linux, выполните:
curl -i https://fkn.ktu10.com/?q=node/7716

Флаг -i просит curl показать ответ целиком — вместе со стартовой строкой и заголовками: в терминале появится ровно то, что мы разбирали выше.

Контрольные вопросы

  • Почему модель HTTP называют «запрос — ответ»? Кто всегда начинает общение?
  • Из каких трёх частей состоит запрос? А ответ?
  • Чем GET отличается от POST?
  • Что означают коды 200, 301, 404, 500 — и к какой группе относится каждый?
  • Что значит «протокол без состояния» и как сервер «узнаёт» пользователя между запросами?