На этой лекции мы разберём прикладной уровень стека 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 и порт 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 (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 (и запрос, и ответ) состоит из трёх частей. Первая - стартовая строка: в запросе это метод, 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 - запрос ресурса (страницы, файла). Сервер возвращает содержимое по указанному URI. Тела у запроса GET обычно нет. POST - отправка данных на сервер (форма, загрузка файла, данные для API). PUT - размещение ресурса по URI (создание или замена). DELETE - удаление ресурса. PATCH - частичное обновление ресурса. HEAD - как GET, но сервер возвращает только заголовки, без тела. OPTIONS - запрос списка поддерживаемых методов для указанного URI.
На практике чаще всего встречаются GET (получить страницу или ресурс) и POST (передать данные, например из формы). Методы характеризуют свойством «безопасность» (не меняют состояние сервера - GET, HEAD) и «идемпотентность» (повторный запрос даёт тот же эффект - GET, PUT, DELETE).
URL (Uniform Resource Locator - единообразный определитель местонахождения ресурса) задаёт,
где находится страница или файл. В HTTP в запросе указывается именно путь (и при необходимости строка
запроса). Полный URL состоит из схемы (http, https, ftp), хоста (доменное
имя или IP), пути (например /docs/page.html) и опционально
query (параметры после ?, например ?id=5).
Гиперссылки на страницах содержат URL; по ним браузер формирует новый HTTP-запрос. В URL можно указывать не только HTML, но и другие типы ресурсов - изображения, видео, JSON для API.
Код ответа - трёхзначное число. Первая цифра определяет группу. 1xx - информационные (запрос принят, обработка продолжается). 2xx - успех: 200 OK - запрос выполнен успешно, ресурс передан. 3xx - перенаправление: 301 - постоянное перемещение (новый URL в заголовке Location), 302 - временное перенаправление. 4xx - ошибка клиента: 400 - неверный запрос, 403 - доступ запрещён, 404 - страница не найдена. 5xx - ошибка сервера: 500 - внутренняя ошибка сервера, 501 - метод не реализован.
Все актуальные коды состояния 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) — сводная таблица.
В запросе Host - обязательный в HTTP/1.1: доменное имя сервера, к которому обращаемся (один
IP может обслуживать несколько сайтов). User-Agent - идентификатор клиента (браузер, версия).
В ответе Content-Type - тип и кодировка тела (например
text/html; charset=utf-8). Content-Length - длина тела в байтах.
Для кэширования используются заголовки Cache-Control (директивы кэшу: no-cache, max-age) и ETag (метка версии ресурса для проверки «изменился ли контент»). Подробнее кэширование разбирается на следующих занятиях.
HTTP/1.1 передаёт сообщения в виде текста: строки в кодировке (обычно UTF-8 или ASCII). Поэтому в
Wireshark при разборе пакета с HTTP виден читаемый запрос или ответ - метод, URI, заголовки,
фрагменты HTML. В консоли с помощью curl можно отправить запрос и увидеть сырой ответ; при
необходимости - только заголовки (curl -I).
HTTP/2 и HTTP/3 используют бинарный формат - там фреймы и поля закодированы иначе; для разбора нужны инструменты, которые их расшифровывают.
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-ответ, а при загрузке страницы с картинками и стилями - множество дополнительных запросов и ответов.
Сопоставьте метод HTTP с описанием.
Сопоставьте код ответа HTTP с описанием.
Расставьте части HTTP-запроса в правильном порядке (сверху вниз).
Выберите верные утверждения (можно несколько).
Для доступа к практике нужно набрать не менее 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, откройте сайт в браузере и посмотрите запросы и ответы во вкладке Network (DevTools), при необходимости посмотрите заголовки и коды ответов. Файл для сдачи не требуется.
Убедитесь, что у вас есть доступ в интернет (для следующих шагов понадобится отправка запросов к веб-серверам).
http://example.com):
Опция -v (verbose) выводит и заголовки запроса/ответа. В выводе найдите строку статуса ответа
(например < HTTP/1.1 200 OK) и заголовки Content-Type,
Content-Length.
-I (только заголовки, без тела):
В ответе будут только стартовая строка и заголовки - удобно для проверки кода ответа и метаданных без вывода всей страницы.
Оставьте вкладку Network открытой и перейдите к следующему шагу - загрузка страницы пополнит список запросов.
http://example.com) и нажмите Enter. В списке
Network появятся строки: первый запрос - загрузка основного документа (метод GET, код 200 или другой).
Щёлкните по первой строке (документ страницы). Справа откроется панель с вкладками: Headers (заголовки), Preview, Response и т.д. Убедитесь, что видите метод запроса (Request Method: GET) и код ответа (Status Code: 200).
Сравните с тем, что вы видели в curl: те же поля, тот же смысл. Так на практике закрепляется структура HTTP-сообщения.
http://example.com/nonexistent-page-12345). Нажмите Enter.
В списке Network найдите этот запрос и посмотрите код ответа - скорее всего 404 Not Found. В Headers будет видна строка статуса с кодом 404.
http и откройте один из пакетов - в дереве
разбора будет видна стартовая строка и заголовки HTTP в читаемом виде.
Для HTTPS содержимое по умолчанию зашифровано; для наблюдения «сырого» HTTP удобнее сайты по протоколу http.
Ответьте себе (без отправки):
Практика завершена. На следующих занятиях вы продолжите работу с HTTP в текстовом режиме, кэшированием и разбором трафика в Wireshark.