Компьютерные сети

HTTP: язык веба

Когда вы открываете google.com, браузер отправляет текстовое сообщение «GET / HTTP/1.1» и получает HTML страницы. Этот простой текстовый протокол - основа всего веба, от поисковиков до банкинга.

  • **API разработка:** понимание методов и статусов - основа REST API
  • **Отладка:** curl и DevTools показывают сырые HTTP-запросы
  • **Производительность:** правильные заголовки = кеширование и скорость

Предварительные знания

  • TCP: reliable delivery
  • DNS: The Internet's Phone Book

Протокол HTTP

**HTTP** (HyperText Transfer Protocol) - текстовый протокол прикладного уровня. Работает поверх TCP (порт 80) или TLS (порт 443). Клиент отправляет запрос - сервер возвращает ответ. Каждый запрос независим - HTTP не хранит состояние между запросами.

**Stateless** означает: сервер не помнит предыдущие запросы. Каждый запрос содержит всё необходимое (куки, токены). Это упрощает масштабирование - любой сервер может обработать любой запрос.

**Версии HTTP:** HTTP/0.9 (1991) - только GET. HTTP/1.0 (1996) - заголовки, методы. HTTP/1.1 (1997) - keep-alive, chunked. HTTP/2 (2015) - бинарный, streams. HTTP/3 (2022) - QUIC вместо TCP.

Почему HTTP называют stateless протоколом?

Запрос и ответ

**HTTP-запрос** состоит из: стартовой строки (метод + путь + версия), заголовков и опционального тела. **HTTP-ответ**: стартовая строка (версия + статус-код + фраза), заголовки и тело. Заголовки и тело разделены пустой строкой.

**Content-Length** - размер тела в байтах. Альтернатива: `Transfer-Encoding: chunked` - тело приходит частями, размер заранее неизвестен. Используется для стриминга и динамического контента.

Что разделяет заголовки и тело в HTTP-сообщении?

HTTP-методы

**Метод** указывает действие над ресурсом. GET - получить, POST - создать, PUT - заменить, PATCH - частично изменить, DELETE - удалить. Методы делятся на безопасные (не меняют данные) и идемпотентные (повтор даёт тот же результат).

**Почему DELETE идемпотентен?** Удалить ресурс 1 раз или 10 раз - результат один: ресурса нет. А POST не идемпотентен: каждый вызов создаёт новый ресурс (например, 10 заказов вместо одного).

Какой метод НЕ является идемпотентным?

Статус-коды

**Статус-код** - трёхзначное число, указывающее результат запроса. Первая цифра определяет класс: 1xx - информационные, 2xx - успех, 3xx - перенаправление, 4xx - ошибка клиента, 5xx - ошибка сервера.

**401 vs 403:** 401 Unauthorized означает «кто ты?» - нужно залогиниться. 403 Forbidden означает «я тебя знаю, но нельзя» - даже с авторизацией доступ закрыт. Название 401 исторически неточное.

HTTP-запросы всегда требуют тела

GET, HEAD, DELETE обычно без тела; POST, PUT, PATCH - с телом

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

Клиент получил код 304. Что это значит?

Ключевые идеи

  • **HTTP = текстовый протокол** поверх TCP, stateless (без состояния)
  • **Запрос:** метод + путь + заголовки + тело; **Ответ:** статус + заголовки + тело
  • **Методы:** GET/POST/PUT/DELETE - действия; идемпотентность важна для retry
  • **Статус-коды:** 2xx успех, 3xx редирект, 4xx ошибка клиента, 5xx ошибка сервера

Связанные темы

HTTP - фундамент веб-разработки:

  • HTTP заголовки — Детальнее про Content-Type, Cache-Control, Cookies
  • HTTPS и TLS — Шифрование HTTP-трафика
  • TCP — Транспорт, поверх которого работает HTTP

Вопросы для размышления

  • Почему REST API используют разные методы, а не только POST?
  • Как stateless влияет на масштабирование веб-приложений?
  • Почему важно возвращать правильные статус-коды в API?

Связанные уроки

  • bt-05-http-fundamentals
HTTP: язык веба

0

1

Войти