Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. Компьютерные сети
  3. Практика
  4. Лаб. работа “Протокол HTTP”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Регистрация в JupyterHub
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Формы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
      • Практика
        • Программное обеспечение
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Цель работы
  • Задачи
  • Необходимое программое обеспечение
  • Сервер для лабораторной работы
    • Проверка работы:
  • Структура 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”
Лаб. работа “Программирование сетевых приложений с использованием сокетов”