Лаб. работа “Протокол HTTP”
Цель работы
Изучить структуру протокола HTTP/1.1, методы запросов, заголовки и коды состояния. Получить практические навыки работы с HTTP-запросами с использованием различных инструментов.
Задачи
- Изучить структуру HTTP-запроса и ответа
- Освоить основные методы HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH)
- Научиться анализировать заголовки HTTP
- Получить практические навыки работы с различными HTTP-клиентами
- Изучить коды состояния HTTP и их интерпретацию
- Познакомиться с современными версиями HTTP/2 и HTTP/3
Необходимое программое обеспечение
Сервер для лабораторной работы
Для выполнения лабораторной работы используется сервер httpbin по адресу 192.168.11.119:8088.
httpbin — это сервис для тестирования HTTP-запросов, который возвращает эхо-ответы с информацией о полученных заголовках, параметрах и теле запроса.
Проверка работы:
Откройте браузер и перейдите по адресу: http://192.168.11.119:8088/get
Структура HTTP-запроса
После установления соединения между клиентом и сервером, клиент отправляет запрос на сервер. В запросе указывается метод запроса, URL, версия протокола HTTP и содержание запроса: информация клиента (параметры и сопровождающая информация) и, возможно, тело сообщения.
Общая структура HTTP-запроса выглядит следующим образом:
Каждая строка запроса должна заканчиваться символами конца строки (\x0D\x0A). Запрос заканчивается пустой строкой (\x0D\x0A\x0D\x0A).
Протокол HTTP поддерживает в запросах следующие методы:
GET
Метод GET используется для получения ресурса по заданному URL. Как правило, запрашиваемый ресурс представляет собой текстовый или графический файл. Если URL ассоциирован с исполняемым файлом или скриптом, то этот файл будет запущен, и клиент получит результаты стандартного потока вывода.
POST
Метод POST используется для передачи клиентом на сервер данных, которые должны быть обработаны ресурсом, указанным в URL. Данный метод чаще всего используется при работе с CGI-скриптами. Метод POST передаёт параметры ресурсу в теле сообщения, поэтому при его использовании не требуется соблюдать никаких ограничений на длину передаваемой строки параметров.
HEAD
Метод HEAD аналогичен методу GET, за исключением того, что клиенту возвращается только заголовок ответа (усечённый GET). Этот метод, в основном, используется для тестирования гиперссылок и проверки доступа к ресурсам.
DELETE
Метод DELETE используется для удаления определённого ресурса.
PUT
Метод PUT используется, когда клиент желает сохранить на сервере передаваемый ресурс.
OPTIONS
Метод OPTIONS используется для запроса информации о возможностях и параметрах доступных методов на конкретном ресурсе.
PATCH
Метод PATCH используется для частичного обновления ресурса на сервере. В отличие от PUT, который заменяет ресурс целиком, PATCH применяет только указанные изменения.
Структура HTTP-ответа
После получения запроса, HTTP-сервер обрабатывает его и отправляет результат обработки клиенту. В первой строке ответа сервера указывается код возврата, далее следует заголовок со служебной информацией и, через пустую строку, содержимое запрашиваемого файла.
Коды состояния HTTP
Каждый HTTP-ответ включает в себя код состояния, который указывает на результат выполнения запроса:
Успешные коды (2xx)
- 200 OK — запрос успешно выполнен
- 201 Created — ресурс создан
- 204 No Content — запрос успешен, но тело ответа пусто
Перенаправление (3xx)
- 301 Moved Permanently — ресурс перемещён навсегда
- 302 Found — ресурс временно перемещён
- 304 Not Modified — ресурс не изменялся
Ошибки клиента (4xx)
- 400 Bad Request — неверный запрос
- 401 Unauthorized — требуется аутентификация
- 403 Forbidden — доступ запрещён
- 404 Not Found — ресурс не найден
- 405 Method Not Allowed — метод не поддерживается
Ошибки сервера (5xx)
- 500 Internal Server Error — внутренняя ошибка сервера
- 502 Bad Gateway — ошибка шлюза
- 503 Service Unavailable — сервис недоступен
Вопросы для подготовки
- Что такое HTTP и на каком уровне OSI он работает?
- Назовите основные методы HTTP и их назначение.
- Чем отличаются методы GET и POST?
- Чем отличаются методы PUT и PATCH?
- Что такое идемпотентность? Какие методы являются идемпотентными?
- Опишите структуру HTTP-запроса.
- Опишите структуру HTTP-ответа.
- Какие группы кодов состояния HTTP вы знаете? Приведите примеры.
- Что такое заголовок
Hostи зачем он нужен? - Что такое
Content-TypeиAccept? - Для чего используется заголовок
Range? - Чем HTTP/1.1 отличается от HTTP/2?
Практическая часть
Блок А: Базовые навыки
Подключитесь при помощи PuTTY к серверу 192.168.11.119, номер порта 8088 и выполните указанные ниже действия.
Получите с помощью метода GET страницу
/getна сервере, используя спецификацию HTTP/0.9 (в этом случае в строке запроса необходимо указать только метод и URL).Повторите запрос, используя спецификации HTTP/1.0 и HTTP/1.1.
Определите по ответу, возвращенному сервером, версию спецификации HTTP, которую поддерживает сервер, а также версию и спецификацию программного обеспечения работающего на сервере. Определите также дату и время, в которое был сформирован ответ.
Запросите несуществующий документ
/status/404на сервере и обратите внимание на ответ, возвращенный сервером. Попробуйте также/status/500.Получите страницу
/headersи проанализируйте, какие заголовки отправляет ваш клиент.Получите страницу
/ipи определите, какой IP-адрес видит сервер.
Блок Б: Работа с заголовками
Используя метод HEAD, получите заголовки для страницы
/getбез тела ответа. Определите тип содержимого и размер ответа.Отправьте GET-запрос к
/response-headers?freeform=test. Проанализируйте, как сервер возвращает пользовательские заголовки.Отправьте OPTIONS-запрос к корневому URL
/. Определите, какие методы поддерживает сервер (изучите заголовокAllowв ответе).Отправьте запрос к
/user-agentс заголовкомUser-Agent. Проверьте, что сервер возвращает.
Блок В: POST-запросы
Отправьте POST-запрос на сервер с данными формы (
application/x-www-form-urlencoded). Используйте endpoint/post.Пример запроса:
POST /post HTTP/1.1 Host: 192.168.11.119:8088 Content-Type: application/x-www-form-urlencoded Content-Length: 27 name=Ivan&group=PO&number=1Отправьте POST-запрос с данными в формате JSON (
application/json) на тот же endpoint/post.Пример запроса:
POST /post HTTP/1.1 Host: 192.168.11.119:8088 Content-Type: application/json Content-Length: 45 {"name": "Ivan", "group": "PO", "number": 1}
Блок Г: Работа с curl
Утилита curl обычно предустановлена в Linux/macOS, для Windows скачайте с curl.se.
Повторите задания 2-5, используя curl:
bash curl -v http://192.168.11.119:8088/get curl -v http://192.168.11.119:8088/status/404Выполните запросы с использованием различных опций curl:
# Только заголовки (аналог HEAD) curl -I http://192.168.11.119:8088/get # Сохранение в файл curl -o response.json http://192.168.11.119:8088/get # POST-запрос с формой curl -X POST -d "name=Ivan&group=PO" http://192.168.11.119:8088/post # POST с JSON curl -X POST -H "Content-Type: application/json" \ -d '{"name":"Ivan"}' http://192.168.11.119:8088/post # Отправка пользовательских заголовков curl -H "X-Custom-Header: test" http://192.168.11.119:8088/headers
Блок Д: Анализ трафика браузера
- Откройте браузер и инструменты разработчика (F12 → Network). Перейдите по адресу
http://192.168.11.119:8088и проанализируйте:- Сколько запросов выполнено?
- Какие типы ресурсов загружены (HTML, CSS, JS, изображения)?
- Какие коды состояния получены?
- Найдите заголовки запроса и ответа для главного документа
- Перейдите по адресу
http://192.168.11.119:8088/getи изучите JSON-ответ. Найдите в Network-вкладке:- Заголовки запроса
- Заголовки ответа
- Тело ответа
- Попробуйте различные endpoints httpbin через браузер и наблюдайте за трафиком:
/headers/ip/user-agent/get?foo=bar&baz=qux(с параметрами запроса)
Блок Е: Модификация ресурсов
Отправьте PUT-запрос на endpoint
/putс данными JSON. Проанализируйте ответ.Отправьте DELETE-запрос на endpoint
/delete. Проанализируйте ответ.Отправьте PATCH-запрос на endpoint
/patchс частичными данными. Проанализируйте ответ.
Блок Ж: Аутентификация и авторизация
Попробуйте получить доступ к защищённому ресурсу
/basic-auth/user/passwd. Проанализируйте ответ с кодом 401.Выполните запрос с базовой аутентификацией:
Authorization: Basic dXNlcjpwYXNzd2Q= ``
(гдеdXNlcjpwYXNzd2Q=— это base64 отuser:passwd`)Выполните запрос с Bearer-токеном:
bash curl -H "Authorization: Bearer mytoken123" \ http://192.168.11.119:8088/bearer
Блок З: Перенаправления и статусы
Выполните запрос к
/redirect/3и проанализируйте цепочку перенаправлений с помощью curl:bash curl -v -L http://192.168.11.119:8088/redirect/3Опция-Lпозволяет curl следовать перенаправлениям.Проверьте различные коды состояния:
bash curl http://192.168.11.119:8088/status/200 curl http://192.168.11.119:8088/status/301 curl http://192.168.11.119:8088/status/400 curl http://192.168.11.119:8088/status/403 curl http://192.168.11.119:8088/status/503
Блок К: Современные версии HTTP
Используя curl, выполните запрос к поддерживающему HTTP/2 серверу и сравните с HTTP/1.1:
Сравните заголовки ответов.
В Developer Tools браузера найдите колонку “Protocol”. Загрузите сайт с HTTPS и определите, используется ли HTTP/2 или HTTP/3.
Вопросы для отчёта
- Какие методы HTTP поддерживает тестовый сервер? Как вы это определили?
- Какая версия HTTP используется на тестовом сервере?
- Какой код состояния возвращается при запросе несуществующего ресурса?
- Как определить IP-адрес клиента с точки зрения сервера?
- Как получить список заголовков, которые отправляет клиент?
- Что такое curl? Какие преимущества он даёт по сравнению с ручным вводом запросов?
- Какие заголовки вы встретили при анализе трафика браузера?
- Как работает базовая HTTP-аутентификация?
- Как сервер обрабатывает cookie?
- Какие отличия HTTP/2 от HTTP/1.1 вы обнаружили?
Дополнительные задания (повышенной сложности)
Задержка ответа: Выполните запрос с задержкой
/delay/5и измерьте время ответа. Сравните с обычным запросом/get.Байты: Получите 100 случайных байт
/bytes/100. Проанализируйте содержимое ответа.Потоковая передача: Выполните запрос
/stream/5и наблюдайте, как данные приходят по частям.Методы и тело: Отправьте POST-запрос с телом на endpoint
/anything. httpbin endpoint/anythingвозвращает все данные запроса — проанализируйте структуру ответа.Gzip-сжатие: Выполните запрос с заголовком
Accept-Encoding: gzipк/gzipи проанализируйте ответ.Декодирование base64: Отправьте base64-строку на
/base64/decodeи получите декодированный результат.