Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ЭЭБ
  2. СТ
  3. Практика
  4. Лаб. работа “Протокол HTTP”
  • ЭЭБ
    • СУВК
      • Слайды
      • Теория
      • Практика
        • Лаб. работа “Анализ и выбор CMS”
        • Лаб. работа “Развертывание среды и установка CMS с помощью сервиса Segfault”
        • Лаб. работа “Развертывание среды и установка CMS с помощью Docker”
        • Лаб. работа “Развертывание среды и установка CMS на хостинге InfinityFree”
        • Лаб. работа “Базовая настройка сайта на WordPress”
        • Лаб. работа “Создание статических страниц и структуры сайта”
    • ВТиП
      • Теория
        • Введение в веб технологии
        • Протокол HTTP
        • HTML
        • CSS
        • CSS фреймворки
        • JavaScript
        • jQuery
        • JSON
        • Архитектура и технологии создания веб-приложений
        • React
        • Маршрутизация в React
        • Создание серверных приложений с использованием Express.js
        • REST интерфейс и аутентификация Веб-приложений
        • Современные практики DevOps: от разработки до развертывания
        • Веб-безопасность: защита современных веб-приложений
      • Практика
        • Лаб. работа “Основы HTML и CSS”
        • Лаб. работа “Основы JavaScript”
        • Лаб. работа “Создание веб-приложений с использованием фреймворка Express.js”
        • Лаб. работа “Работа с базами данных в Express.js”
    • СТ
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Протокол HTTP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”

Содержание

  • Цель работы
  • Задачи
  • Необходимое программое обеспечение
  • Сервер для лабораторной работы
    • Проверка работы:
  • Структура HTTP-запроса
    • GET
    • POST
    • HEAD
    • DELETE
    • PUT
    • OPTIONS
    • PATCH
  • Структура HTTP-ответа
  • Коды состояния HTTP
    • Успешные коды (2xx)
    • Перенаправление (3xx)
    • Ошибки клиента (4xx)
    • Ошибки сервера (5xx)
  • Вопросы для подготовки
  • Практическая часть
    • Блок А: Базовые навыки
    • Блок Б: Работа с заголовками
    • Блок В: POST-запросы
    • Блок Г: Работа с curl
    • Блок Д: Анализ трафика браузера
    • Блок Е: Модификация ресурсов
    • Блок Ж: Аутентификация и авторизация
    • Блок З: Перенаправления и статусы
    • Блок И: Cookies
    • Блок К: Современные версии HTTP
  • Вопросы для отчёта
  • Дополнительные задания (повышенной сложности)
  1. ЭЭБ
  2. СТ
  3. Практика
  4. Лаб. работа “Протокол HTTP”

Лаб. работа “Протокол HTTP”

Сетевые технологии
Практика
Автор

Бизюк Андрей

Дата публикации

29 февраля 2024 г.

Цель работы

Изучить структуру протокола HTTP/1.1, методы запросов, заголовки и коды состояния. Получить практические навыки работы с 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-запроса выглядит следующим образом:

<метод> <URL> <версия 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

Каждый 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. Получите страницу /ip и определите, какой IP-адрес видит сервер.

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

  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.

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

    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
  2. Отправьте 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

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

  2. Повторите задания 2-5, используя curl: bash curl -v http://192.168.11.119:8088/get curl -v http://192.168.11.119:8088/status/404

  3. Выполните запросы с использованием различных опций 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

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

  1. Откройте браузер и инструменты разработчика (F12 → Network). Перейдите по адресу http://192.168.11.119:8088 и проанализируйте:
    • Сколько запросов выполнено?
    • Какие типы ресурсов загружены (HTML, CSS, JS, изображения)?
    • Какие коды состояния получены?
    • Найдите заголовки запроса и ответа для главного документа
  2. Перейдите по адресу http://192.168.11.119:8088/get и изучите JSON-ответ. Найдите в Network-вкладке:
    • Заголовки запроса
    • Заголовки ответа
    • Тело ответа
  3. Попробуйте различные endpoints httpbin через браузер и наблюдайте за трафиком:
    • /headers
    • /ip
    • /user-agent
    • /get?foo=bar&baz=qux (с параметрами запроса)

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

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

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

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

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

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

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

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

        curl -u user:passwd http://192.168.11.119:8088/basic-auth/user/passwd
        ```
    
    Или через PuTTY с заголовком:

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

  3. Выполните запрос с Bearer-токеном: bash curl -H "Authorization: Bearer mytoken123" \ http://192.168.11.119:8088/bearer

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

  1. Выполните запрос к /redirect/3 и проанализируйте цепочку перенаправлений с помощью curl: bash curl -v -L http://192.168.11.119:8088/redirect/3 Опция -L позволяет curl следовать перенаправлениям.

  2. Проверьте различные коды состояния: 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

Блок И: Cookies

  1. Получите cookie от сервера: bash curl -c cookies.txt http://192.168.11.119:8088/cookies/set?name=value Просмотрите содержимое файла cookies.txt.

  2. Отправьте запрос с cookie: bash curl -b cookies.txt http://192.168.11.119:8088/cookies

  3. Попробуйте установить несколько cookie: bash curl "http://192.168.11.119:8088/cookies/set?session=abc123&user=ivan"

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

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

    # HTTP/2
    curl -I --http2 https://www.google.com
    
    # HTTP/1.1
    curl -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”
Лаб. работа “Программирование сетевых приложений с использованием сокетов”