Введение

Прикладной уровень и протокол HTTP

На этой лекции мы разберём прикладной уровень стека TCP/IP и подробно остановимся на протоколе HTTP - основе современного веба. Вы узнаете, как устроены сообщения HTTP, какие методы запросов и коды ответов используются, как читать заголовки и как это связано с транспортным уровнем. В конце - интерактивные задания, короткий тест и пошаговая практика за компьютером (curl, браузер, DevTools). Файл для сдачи не требуется.

Прикладной уровень

Протоколы прикладного уровня

На прикладном уровне работают сетевые приложения - браузеры, почтовые клиенты, мессенджеры. Они общаются друг с другом по правилам прикладных протоколов. В стеке TCP/IP к таким протоколам относятся HTTP (передача гипертекста, веб), DNS (система доменных имён), SMTP (отправка почты), FTP (передача файлов) и многие другие (например IMAP, POP3 — почта, SSH, Telnet — удалённый доступ, NTP — время, SNMP — управление сетью).

Каждый протокол решает свою задачу: HTTP - доставка веб-страниц и ресурсов, DNS - преобразование имён в IP-адреса, SMTP - доставка писем между серверами. Прикладной уровень изолирован от деталей сети: приложения передают данные «как будто» напрямую друг другу, а за доставку отвечает транспортный уровень (TCP или UDP).

Модель клиент-сервер

Запрос-ответ на примере веба

Типичная схема работы на прикладном уровне - клиент-сервер. Клиент (например веб-браузер) отправляет запрос, сервер (веб-сервер) обрабатывает его и отправляет ответ. Устройства, на которых работают такие приложения, в терминологии сетей называют хостами - в отличие от маршрутизаторов и коммутаторов, которые строят сеть, но не запускают приложения вроде браузера или веб-сервера.

Один запрос - один ответ (или цепочка запросов за разными ресурсами страницы). Эта модель «запрос-ответ» лежит в основе HTTP и многих других прикладных протоколов.

Мария
То есть порт 80 - это всегда HTTP?
Порты приложений

80 и 443 - не только HTTP

По соглашению веб-серверы слушают порт 80 для HTTP и порт 443 для HTTPS. Но протокол не «привязан» к порту жёстко: сервер может обслуживать HTTP на другом порту (например 8080), а клиент указывает этот порт в URL. Порт 80 и 443 - это стандарт по умолчанию, который знают браузеры и пользователи.

Какие ещё стандартные порты вы встречали на практике? Например 22 (SSH), 25 (SMTP), 3306 (MySQL), 5432 (PostgreSQL). Официальный перечень «порт — назначение» ведёт IANA (Internet Assigned Numbers Authority) в документе Service Name and Transport Protocol Port Number Registry; рекомендации по использованию портов для прикладных протоколов закреплены в RFC (в частности, для HTTP - в RFC 9110).

Протокол HTTP

Передача гипертекста и история версий

HTTP (HyperText Transfer Protocol - протокол передачи гипертекста) - основа Web. Концепцию Всемирной паутины предложил Тим Бернерс-Ли в CERN в 1989 году. Наряду с языком разметки HTML и идеей веб-сервера и браузера был определён протокол обмена - HTTP.

Версии протокола: HTTP/0.9 (эксперимент, 1991), HTTP/1.0 (1996), HTTP/1.1 (1997) - с кэшированием, постоянными соединениями, обязательным заголовком Host; именно 1.1 до сих пор широко используется. HTTP/2 (2015) - бинарный протокол, выше производительность и безопасность. HTTP/3 (2022) работает поверх протокола QUIC (Quick UDP Internet Connections): вместо TCP используется UDP с встроенной криптографией (TLS 1.3) и мультиплексированием потоков. За счёт этого уменьшается задержка при установке соединения (нет отдельного TCP handshake и долгого TLS handshake - они объединены), улучшается работа при потере пакетов. HTTP/3 постепенно вводится в браузерах и серверах.

Структура HTTP-сообщения

Три части: стартовая строка, заголовки, тело

Сообщение HTTP (и запрос, и ответ) состоит из трёх частей. Первая - стартовая строка: в запросе это метод, URI и версия протокола; в ответе - версия, код ответа и краткая фраза (например «200 OK»). Вторая - заголовки в формате «Имя: значение», по одному на строку. Третья - тело сообщения (необязательно); в запросе GET тела обычно нет, в ответе - например HTML-страница.

Заголовки и тело разделяются пустой строкой. В HTTP/1.1 используется текстовый режим - сообщения читаемы в Wireshark и в консоли (curl, telnet).

Как отправить такой запрос самому: в Windows (PowerShell или cmd) и на macOS/Linux (терминал) можно использовать программу curl. Пример: curl -v http://example.com/index.html — выведет заголовки и тело ответа. В Windows 10/11 curl обычно уже есть; если нет — установите или используйте браузер DevTools (вкладка Network) или расширения вроде Postman.

GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Методы HTTP

GET, POST, PUT, DELETE и другие

GET - запрос ресурса (страницы, файла). Сервер возвращает содержимое по указанному URI. Тела у запроса GET обычно нет. POST - отправка данных на сервер (форма, загрузка файла, данные для API). PUT - размещение ресурса по URI (создание или замена). DELETE - удаление ресурса. PATCH - частичное обновление ресурса. HEAD - как GET, но сервер возвращает только заголовки, без тела. OPTIONS - запрос списка поддерживаемых методов для указанного URI.

На практике чаще всего встречаются GET (получить страницу или ресурс) и POST (передать данные, например из формы). Методы характеризуют свойством «безопасность» (не меняют состояние сервера - GET, HEAD) и «идемпотентность» (повторный запрос даёт тот же эффект - GET, PUT, DELETE).

URI и URL

Схема, хост, путь, query

URL (Uniform Resource Locator - единообразный определитель местонахождения ресурса) задаёт, где находится страница или файл. В HTTP в запросе указывается именно путь (и при необходимости строка запроса). Полный URL состоит из схемы (http, https, ftp), хоста (доменное имя или IP), пути (например /docs/page.html) и опционально query (параметры после ?, например ?id=5).

Гиперссылки на страницах содержат URL; по ним браузер формирует новый HTTP-запрос. В URL можно указывать не только HTML, но и другие типы ресурсов - изображения, видео, JSON для API.

Дмитрий
В адресной строке браузера мы вводим URL - и браузер сам делает GET по этому адресу?
Мария
Да. При переходе по ссылке или вводе URL в адресную строку браузер по умолчанию отправляет именно GET-запрос за указанным ресурсом. POST и другие методы используются при отправке форм, API-запросах из скриптов и т.д.
Коды ответа HTTP

1xx - 5xx: что означает первая цифра

Код ответа - трёхзначное число. Первая цифра определяет группу. 1xx - информационные (запрос принят, обработка продолжается). 2xx - успех: 200 OK - запрос выполнен успешно, ресурс передан. 3xx - перенаправление: 301 - постоянное перемещение (новый URL в заголовке Location), 302 - временное перенаправление. 4xx - ошибка клиента: 400 - неверный запрос, 403 - доступ запрещён, 404 - страница не найдена. 5xx - ошибка сервера: 500 - внутренняя ошибка сервера, 501 - метод не реализован.

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234

<!DOCTYPE html>...
Справочники по кодам состояния

Где искать описание кодов HTTP

Все актуальные коды состояния HTTP и их описания закреплены в официальных технических спецификациях RFC (Request for Comments).

RFC 9110 «HTTP Semantics» (июнь 2022) — главный действующий стандарт. Он объединил и заменил предыдущие версии (RFC 7231, RFC 2616), став основным источником для современных веб-технологий.

Реестр IANA (HTTP Status Code Registry) — самый полный и оперативно обновляемый список. IANA ведёт официальный перечень всех зарегистрированных кодов, включая те, что описаны в дополнительных документах (например RFC 6585 для сетевых ошибок).

Где удобнее искать: если не нужно читать сухой текст стандартов — MDN Web Docs (Mozilla) с пояснениями на русском; HTTP Statuses — минималистичный справочник со ссылками на пункты RFC; Википедия (список кодов состояния HTTP) — сводная таблица.

Заголовки HTTP

Host, User-Agent, Content-Type, Content-Length

В запросе Host - обязательный в HTTP/1.1: доменное имя сервера, к которому обращаемся (один IP может обслуживать несколько сайтов). User-Agent - идентификатор клиента (браузер, версия). В ответе Content-Type - тип и кодировка тела (например text/html; charset=utf-8). Content-Length - длина тела в байтах.

Для кэширования используются заголовки Cache-Control (директивы кэшу: no-cache, max-age) и ETag (метка версии ресурса для проверки «изменился ли контент»). Подробнее кэширование разбирается на следующих занятиях.

HTTP в текстовом режиме

Читаемость в Wireshark и curl

HTTP/1.1 передаёт сообщения в виде текста: строки в кодировке (обычно UTF-8 или ASCII). Поэтому в Wireshark при разборе пакета с HTTP виден читаемый запрос или ответ - метод, URI, заголовки, фрагменты HTML. В консоли с помощью curl можно отправить запрос и увидеть сырой ответ; при необходимости - только заголовки (curl -I).

HTTP/2 и HTTP/3 используют бинарный формат - там фреймы и поля закодированы иначе; для разбора нужны инструменты, которые их расшифровывают.

HTTP и транспортный уровень

Один запрос-ответ - один или несколько TCP-сегментов

HTTP работает поверх TCP. Это значит: сначала устанавливается TCP-соединение — так называемый TCP handshake, или трёхстороннее рукопожатие. «Трёхстороннее» — потому что обмен идёт в три шага: (1) клиент → сервер, (2) сервер → клиент, (3) клиент → сервер. На первом шаге клиент отправляет пакет с флагом SYN (synchronize — «синхронизируемся», запрос на установку соединения). Сервер отвечает пакетом SYN+ACK (ACK — acknowledge, «подтверждаю получение» и «свою готовность»). Клиент посылает ACK — подтверждение; после этого канал готов к передаче данных. Затем по нему передаётся HTTP-запрос и ответ. Один запрос и один ответ могут уместиться в один TCP-сегмент или разбиваться на несколько - в зависимости от размера данных и настроек TCP. За надёжную доставку и порядок байтов отвечает TCP; прикладной уровень просто отправляет и получает поток байтов.

При анализе в Wireshark видна цепочка: кадр Ethernet (или Wi‑Fi), пакет IP, сегмент TCP, данные HTTP. Один «заход» на страницу порождает минимум TCP handshake, HTTP-запрос, HTTP-ответ, а при загрузке страницы с картинками и стилями - множество дополнительных запросов и ответов.

Александр
На практике для отладки API часто смотрю заголовки в DevTools - вкладка Network. Там видно и метод, и код ответа, и все заголовки.
Задание 1

Метод HTTP и его назначение

Сопоставьте метод HTTP с описанием.

GET
POST
DELETE
Задание 2

Код ответа и его значение

Сопоставьте код ответа HTTP с описанием.

200
404
500
Задание 3

Порядок частей HTTP-запроса

Расставьте части HTTP-запроса в правильном порядке (сверху вниз).

1 (сначала):
2:
3:
Задание 4

Прикладной уровень и HTTP

Выберите верные утверждения (можно несколько).

Финальный допуск

Краткий тест (8 вопросов)

Для доступа к практике нужно набрать не менее 80% (минимум 7 из 8 правильных ответов).

1. HTTP - это протокол:

2. Модель взаимодействия в HTTP:

3. Стандартный порт для HTTP:

4. Метод GET используется для:

5. Код 404 означает:

6. Заголовок Host в HTTP/1.1:

7. HTTP/1.1 передаёт сообщения:

8. Транспортный протокол под HTTP:

Практика

Практика: HTTP - curl, браузер, DevTools

Выполните пошаговые действия на своём компьютере: отправьте HTTP-запрос с помощью curl, откройте сайт в браузере и посмотрите запросы и ответы во вкладке Network (DevTools), при необходимости посмотрите заголовки и коды ответов. Файл для сдачи не требуется.

Практика - Шаг 1

Откройте терминал

1 Откройте терминал: в Windows - cmd или PowerShell; в macOS/Linux - Terminal.

Убедитесь, что у вас есть доступ в интернет (для следующих шагов понадобится отправка запросов к веб-серверам).

Практика - Шаг 2

Отправьте GET-запрос с помощью curl

2 Выполните команду (подставьте любой доступный по HTTP сайт, например http://example.com):
curl -v http://example.com

Опция -v (verbose) выводит и заголовки запроса/ответа. В выводе найдите строку статуса ответа (например < HTTP/1.1 200 OK) и заголовки Content-Type, Content-Length.

Практика - Шаг 3

Только заголовки ответа

3 Выполните запрос с опцией -I (только заголовки, без тела):
curl -I http://example.com

В ответе будут только стартовая строка и заголовки - удобно для проверки кода ответа и метаданных без вывода всей страницы.

Практика - Шаг 4

Откройте браузер и DevTools

4 Откройте браузер (Chrome, Edge, Firefox). Откройте инструменты разработчика: F12 или правый клик по странице - «Просмотреть код» / «Inspect». Перейдите на вкладку Network (Сеть).

Оставьте вкладку Network открытой и перейдите к следующему шагу - загрузка страницы пополнит список запросов.

Практика - Шаг 5

Загрузите страницу и посмотрите запросы

5 В адресной строке введите любой URL (например http://example.com) и нажмите Enter. В списке Network появятся строки: первый запрос - загрузка основного документа (метод GET, код 200 или другой).

Щёлкните по первой строке (документ страницы). Справа откроется панель с вкладками: Headers (заголовки), Preview, Response и т.д. Убедитесь, что видите метод запроса (Request Method: GET) и код ответа (Status Code: 200).

Практика - Шаг 6

Просмотр заголовков запроса и ответа

6 В панели выбранного запроса откройте вкладку Headers. Найдите блок «Request Headers» - там Host, User-Agent и другие заголовки, которые отправил браузер. Ниже - «Response Headers»: Content-Type, Content-Length и т.д., которые вернул сервер.

Сравните с тем, что вы видели в curl: те же поля, тот же смысл. Так на практике закрепляется структура HTTP-сообщения.

Практика - Шаг 7

Запрос к несуществующей странице

7 В адресной строке браузера введите URL заведомо несуществующей страницы (например http://example.com/nonexistent-page-12345). Нажмите Enter.

В списке Network найдите этот запрос и посмотрите код ответа - скорее всего 404 Not Found. В Headers будет видна строка статуса с кодом 404.

Практика - Шаг 8

Опционально: Wireshark и HTTP

8 Если Wireshark уже установлен: запустите захват на активном интерфейсе, в браузере откройте страницу по HTTP (не HTTPS), остановите захват. Примените фильтр http и откройте один из пакетов - в дереве разбора будет видна стартовая строка и заголовки HTTP в читаемом виде.

Для HTTPS содержимое по умолчанию зашифровано; для наблюдения «сырого» HTTP удобнее сайты по протоколу http.

Практика - Шаг 9

Контрольные вопросы для самопроверки

Ответьте себе (без отправки):

  • Какой код ответа вы получили при запросе к example.com (или другому сайту)?
  • Какой заголовок в ответе указывает тип контента (Content-Type)? Какое значение было?
  • При запросе несуществующей страницы - какой код вы увидели (404 или другой)?
  • В DevTools: какой метод запроса (GET) и в каком блоке видны заголовки ответа?

Практика завершена. На следующих занятиях вы продолжите работу с HTTP в текстовом режиме, кэшированием и разбором трафика в Wireshark.