Лаб. работа "Протокол HTTP"

Цель работы

Изучить структуру протокола HTTP, методы запросов, заголовки и коды состояния. Получить практические навыки работы с HTTP-запросами с использованием различных инструментов.

Задачи

  1. Изучить структуру HTTP-запроса и ответа
  2. Освоить основные методы HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH)
  3. Научиться анализировать заголовки HTTP
  4. Получить практические навыки работы с различными HTTP-клиентами
  5. Изучить коды состояния HTTP и их интерпретацию
  6. Познакомиться с современными версиями HTTP/2 и HTTP/3

Необходимое программое обеспечение

  • PuTTY — терминальный клиент для работы с HTTP
  • curl — командно-строковый инструмент для передачи данных
  • Веб-браузер с Developer Tools (Chrome, Firefox, Edge)

Сервер для лабораторной работы

Для выполнения лабораторной работы используется сервер httpbin по адресу 192.168.11.119:8088.

httpbin — это сервис для тестирования HTTP-запросов, который возвращает эхо-ответы с информацией о полученных заголовках, параметрах и теле запроса.

Проверка работы:

Откройте браузер и перейдите по адресу: http://192.168.11.119:8088/get

Структура HTTP-запроса

После установления соединения между клиентом и сервером, клиент отправляет запрос на сервер. В запросе указывается метод запроса, URL, версия протокола HTTP и содержание запроса: информация клиента (параметры и сопровождающая информация) и, возможно, тело сообщения.

Общая структура HTTP-запроса выглядит следующим образом:

1<метод> <URL> <версия HTTP>
2<общий заголовок>
3<заголовок запроса>
4<заголовок передаваемого сообщения>
5<пустая строка>
6<тело сообщения>

Каждая строка запроса должна заканчиваться символами конца строки (\x0D\x0A). Запрос заканчивается пустой строкой (\x0D\x0A\x0D\x0A).

Протокол HTTP поддерживает в запросах следующие методы:

GET

Метод GET используется для получения ресурса по заданному URL. Как правило, запрашиваемый ресурс представляет собой текстовый или графический файл. Если URL ассоциирован с исполняемым файлом или скриптом, то этот файл будет запущен, и клиент получит результаты стандартного потока вывода.

POST

Метод POST используется для передачи клиентом на сервер данных, которые должны быть обработаны ресурсом, указанным в URL. Данный метод чаще всего используется при работе с CGI-скриптами. Метод POST передаёт параметры ресурсу в теле сообщения, поэтому при его использовании не требуется соблюдать никаких ограничений на длину передаваемой строки параметров.

Метод HEAD аналогичен методу GET, за исключением того, что клиенту возвращается только заголовок ответа (усечённый GET). Этот метод, в основном, используется для тестирования гиперссылок и проверки доступа к ресурсам.

DELETE

Метод DELETE используется для удаления определённого ресурса.

PUT

Метод PUT используется, когда клиент желает сохранить на сервере передаваемый ресурс.

OPTIONS

Метод OPTIONS используется для запроса информации о возможностях и параметрах доступных методов на конкретном ресурсе.

PATCH

Метод PATCH используется для частичного обновления ресурса на сервере. В отличие от PUT, который заменяет ресурс целиком, PATCH применяет только указанные изменения.

Структура HTTP-ответа

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

1<Версия HTTP> <код возврата> <текстовое описание>
2<общий заголовок>
3<заголовок ответа>
4<заголовок тела сообщения>
5<пустая строка>
6<тело сообщения>

Коды состояния 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 — сервис недоступен

Вопросы для подготовки

  1. Что такое HTTP и на каком уровне OSI он работает?
  2. Назовите основные методы HTTP и их назначение.
  3. Чем отличаются методы GET и POST?
  4. Чем отличаются методы PUT и PATCH?
  5. Что такое идемпотентность? Какие методы являются идемпотентными?
  6. Опишите структуру HTTP-запроса.
  7. Опишите структуру HTTP-ответа.
  8. Какие группы кодов состояния HTTP вы знаете? Приведите примеры.
  9. Что такое заголовок Host и зачем он нужен?
  10. Что такое Content-Type и Accept?
  11. Для чего используется заголовок Range?
  12. Чем HTTP/1.1 отличается от HTTP/2?

Практическая часть

Блок А: Базовые навыки

  1. Подключитесь при помощи PuTTY к серверу 192.168.11.119, номер порта 8088 и выполните указанные ниже действия.

  2. Получите с помощью метода GET страницу /get на сервере, используя спецификацию HTTP/0.9 (в этом случае в строке запроса необходимо указать только метод и URL).

  3. Повторите запрос, используя спецификации HTTP/1.0 и HTTP/1.1.

  4. Определите по ответу, возвращенному сервером, версию спецификации HTTP, которую поддерживает сервер, а также версию и спецификацию программного обеспечения работающего на сервере. Определите также дату и время, в которое был сформирован ответ.

  5. Запросите несуществующий документ /status/404 на сервере и обратите внимание на ответ, возвращенный сервером. Попробуйте также /status/500.

  6. Получите страницу /headers и проанализируйте, какие заголовки отправляет ваш клиент.

  7. Получите страницу /image/png и определите, какой тип контента возвращает сервер.

Блок Б: Работа с заголовками

  1. Используя метод HEAD, получите заголовки для страницы /get без тела ответа. Определите тип содержимого и размер ответа.

  2. Отправьте GET-запрос к /response-headers?freeform=test. Проанализируйте, как сервер возвращает пользовательские заголовки.

  3. Отправьте OPTIONS-запрос к корневому URL /. Определите, какие методы поддерживает сервер (изучите заголовок Allow в ответе).

  4. Отправьте запрос к /user-agent с заголовком User-Agent. Проверьте, что сервер возвращает.

Блок В: POST-запросы

  1. Отправьте POST-запрос на сервер с данными формы (application/x-www-form-urlencoded). Используйте endpoint /post.

    Пример запроса:

    1POST /post HTTP/1.1
    2Host: 192.168.11.119:8088
    3Content-Type: application/x-www-form-urlencoded
    4Content-Length: 27
    5
    6name=Ivan&group=PO&number=1
    
  2. Отправьте POST-запрос с данными в формате JSON (application/json) на тот же endpoint /post.

    Пример запроса:

    1POST /post HTTP/1.1
    2Host: 192.168.11.119:8088
    3Content-Type: application/json
    4Content-Length: 45
    5
    6{"name": "Ivan", "group": "PO", "number": 1}
    

Блок Г: Работа с curl

  1. Утилита curl обычно предустановлена в Linux/macOS, для Windows скачайте с curl.se.

  2. Повторите задания 2-5, используя curl:

    1curl -v http://192.168.11.119:8088/get
    2curl -v http://192.168.11.119:8088/status/404
    
  3. Выполните запросы с использованием различных опций curl:

     1# Только заголовки (аналог HEAD)
     2curl -I http://192.168.11.119:8088/get
     3
     4# Сохранение в файл
     5curl -o response.json http://192.168.11.119:8088/get
     6
     7# POST-запрос с формой
     8curl -X POST -d "name=Ivan&group=PO" http://192.168.11.119:8088/post
     9
    10# POST с JSON
    11curl -X POST -H "Content-Type: application/json" \
    12     -d '{"name":"Ivan"}' http://192.168.11.119:8088/post
    13
    14# Отправка пользовательских заголовков
    15curl -H "X-Custom-Header: test" http://192.168.11.119:8088/headers
    

Работа с изображениями

  1. Получите изображение в формате PNG:

    1curl -v http://192.168.11.119:8088/image/png
    

    Проанализируйте заголовок Content-Type. Какой размер у изображения?

  2. Получите заголовки изображений в разных форматах:

    1curl -I http://192.168.11.119:8088/image/png
    2curl -I http://192.168.11.119:8088/image/jpeg
    3curl -I http://192.168.11.119:8088/image/webp
    4curl -I http://192.168.11.119:8088/image/svg
    

    Определите размер каждого формата и сравните их.

  3. Сохраните изображение в файл:

    1curl -o image.png http://192.168.11.119:8088/image/png
    2file image.png
    
  4. Используя HEAD, получите только заголовки без загрузки тела:

    1curl -I http://192.168.11.119:8088/image/png
    

    Определите размер файла без его скачивания.

  5. Попробуйте отправить заголовок Accept: image/webp и получите изображение в формате WebP:

    1curl -H "Accept: image/webp" -I http://192.168.11.119:8088/image
    

    Какой формат вернул сервер?

  6. Сравните размеры изображений разных форматов. Какой формат наиболее эффективен по размеру?

  7. Используя curl с опцией -w, измерьте время ответа для разных форматов изображений:

    1curl -w "%{time_total}" -o /dev/null -s http://192.168.11.119:8088/image/png
    
  8. Скачайте все доступные форматы изображений и сохраните их в файлы для дальнейшего сравнения.

  9. Определите, какой MIME-тип (Content-Type) сервер возвращает для каждого формата изображения.

  10. Используя curl, получите размер ответа в байтах для каждого формата (-w "%{size_download}").

Блок Д: Анализ трафика браузера

  1. Откройте браузер и инструменты разработчика (F12 → Network). Перейдите по адресу http://192.168.11.119:8088 и проанализируйте:

    • Сколько запросов выполнено?
    • Какие типы ресурсов загружены (HTML, CSS, JS, изображения)?
    • Какие коды состояния получены?
    • Найдите заголовки запроса и ответа для главного документа
  2. Перейдите по адресу http://192.168.11.119:8088/image/png и проанализируйте:

    • Какой Content-Type имеет ответ?
    • Сколько байт занимает изображение?
    • Какие заголовки ответа есть у изображения?
  3. Перейдите по адресу http://192.168.11.119:8088/get и изучите JSON-ответ. Найдите в Network-вкладке:

    • Заголовки запроса
    • Заголовки ответа
    • Тело ответа
  4. Попробуйте различные endpoints httpbin через браузер и наблюдайте за трафиком:

    • /headers
    • /ip
    • /user-agent
    • /get?foo=bar&baz=qux (с параметрами запроса)

Блок Е: Модификация ресурсов

  1. Отправьте PUT-запрос на endpoint /put с данными JSON. Проанализируйте ответ.

    1curl -X PUT -H "Content-Type: application/json" \
    2     -d '{"update":"data"}' http://192.168.11.119:8088/put
    
  2. Отправьте DELETE-запрос на endpoint /delete. Проанализируйте ответ.

    1curl -X DELETE http://192.168.11.119:8088/delete
    
  3. Отправьте PATCH-запрос на endpoint /patch с частичными данными. Проанализируйте ответ.

    1curl -X PATCH -H "Content-Type: application/json" \
    2     -d '{"field":"value"}' http://192.168.11.119:8088/patch
    

Блок Ж: Аутентификация и авторизация

  1. Попробуйте получить доступ к защищённому ресурсу /basic-auth/user/passwd. Проанализируйте ответ с кодом 401.

  2. Выполните запрос с базовой аутентификацией:

    1curl -u user:passwd http://192.168.11.119:8088/basic-auth/user/passwd
    

    Или через PuTTY с заголовком:

    1Authorization: Basic dXNlcjpwYXNzd2Q=
    

    (где dXNlcjpwYXNzd2Q= — это base64 от user:passwd)

  3. Выполните запрос с Bearer-токеном:

    1curl -H "Authorization: Bearer mytoken123" \
    2     http://192.168.11.119:8088/bearer
    

Блок З: Перенаправления и статусы

  1. Выполните запрос к /redirect/3 и проанализируйте цепочку перенаправлений с помощью curl:

    1curl -v -L http://192.168.11.119:8088/redirect/3
    

    Опция -L позволяет curl следовать перенаправлениям.

  2. Проверьте различные коды состояния:

    1curl http://192.168.11.119:8088/status/200
    2curl http://192.168.11.119:8088/status/301
    3curl http://192.168.11.119:8088/status/400
    4curl http://192.168.11.119:8088/status/403
    5curl http://192.168.11.119:8088/status/503
    

Блок И: Cookies

  1. Получите cookie от сервера:

    1curl -c cookies.txt http://192.168.11.119:8088/cookies/set?name=value
    

    Просмотрите содержимое файла cookies.txt.

  2. Отправьте запрос с cookie:

    1curl -b cookies.txt http://192.168.11.119:8088/cookies
    
  3. Попробуйте установить несколько cookie:

    1curl "http://192.168.11.119:8088/cookies/set?session=abc123&user=ivan"
    

Блок К: Современные версии HTTP

  1. Используя curl, выполните запрос к поддерживающему HTTP/2 серверу и сравните с HTTP/1.1:

    1# HTTP/2
    2curl -I --http2 https://www.google.com
    3
    4# HTTP/1.1
    5curl -I --http1.1 https://www.google.com
    

    Сравните заголовки ответов.

  2. В Developer Tools браузера найдите колонку “Protocol”. Загрузите сайт с HTTPS и определите, используется ли HTTP/2 или HTTP/3.

Вопросы для отчёта

  1. Какие методы HTTP поддерживает тестовый сервер? Как вы это определили?
  2. Какая версия HTTP используется на тестовом сервере?
  3. Какой код состояния возвращается при запросе несуществующего ресурса?
  4. Как определить IP-адрес клиента с точки зрения сервера?
  5. Как получить список заголовков, которые отправляет клиент?
  6. Что такое curl? Какие преимущества он даёт по сравнению с ручным вводом запросов?
  7. Какие заголовки вы встретили при анализе трафика браузера?
  8. Как работает базовая HTTP-аутентификация?
  9. Как сервер обрабатывает cookie?
  10. Какие отличия HTTP/2 от HTTP/1.1 вы обнаружили?

Дополнительные задания

  1. Задержка ответа: Выполните запрос с задержкой /delay/5 и измерьте время ответа. Сравните с обычным запросом /get.

  2. Байты: Получите 100 случайных байт /bytes/100. Проанализируйте содержимое ответа.

  3. Потоковая передача: Выполните запрос /stream/5 и наблюдайте, как данные приходят по частям.

  4. Методы и тело: Отправьте POST-запрос с телом на endpoint /anything. httpbin endpoint /anything возвращает все данные запроса — проанализируйте структуру ответа.

  5. Gzip-сжатие: Выполните запрос с заголовком Accept-Encoding: gzip к /gzip и проанализируйте ответ.

  6. Декодирование base64: Отправьте base64-строку на /base64/decode и получите декодированный результат.

← Лаб. работа "Протокол FTP" Лаб. работа "Программирование сетевых … →