Пример GET-запроса:
GET /index.html HTTP/1.1
Host: www.example.com
Connection: closeПример POST-запроса:
POST /submit-form HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Connection: close
name=John&age=30&city=NY- Стартовая строка
- Метод
- GET
- POST
- HEAD
- URI
- Url encoding:
- Пробел → %20
- = → %3D
- ; → %3B
- Url encoding:
- Версия
- Метод
- Заголовки (Headers)
- Host — обязательный заголовок
- Cookie
- Accept
- Accept-encoding
- Accept-language:
- Cache-control
- Referer
- User-agent
- Content-Type
- Тело (Body)
- Рассказать о различных Content-Type, включая application/x-www-form-urlencoded
HTTP/1.1 200 OK
Date: Mon, 07 Jan 2025 12:00:00 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
<!DOCTYPE html>
<html>
<head><title>Example Page</title></head>
<body><h1>Welcome to Example!</h1></body>
</html>- Стартовая строка
- Коды состояния
- 1xx — Info
- 2xx — Success
- 3xx — Redirection
- 4xx — Client Error
- 5xx — Server Error
- Коды состояния
- Заголовки
- Content-type
- Content-language
- Date / Expires / Last-modified
- Тело
- Зачем нужны и как использовать
- Cookie на сервере
- Set-Cookie на клиенте
- Формат отдельного параметры cookie:
name=value
centralauth_User=Despairr; ruwikiss0-UserName=Despairr; ruwikiUserName=Despairr; centralauth_ss0-Token=65bc2c8c0fcaed5b5f81baa8c72f746f; centralauth_Token=65bc2c8c0fcaed5b5f81baa8c724746d; GeoIP=RU:SAM:Samara:53.19:50.16:v4; ruwikimwuser-sessionId=9166d9b351c54d332bbe; ruwikiSession=0bs3ajkjcii8v0hm6fc5cd2njrgf9tqa; centralauth_Session=97cb6f92a6ca55e555d2805f2acabbb1; WMF-Last-Access=07-Jan-2025; WMF-Last-Access-Global=07-Jan-2025; NetworkProbeLimit=0.001; WMF-DP=d04,430- Ограничения на значения cookies:
- Стандарт допускает в значениях cookies буквы, цифры и следующие символы:
! # $ % & ' ( ) * + - . / : < = > ? @ [ \ ] ^ _ { | } ~
- Стандарт допускает в значениях cookies буквы, цифры и следующие символы:
- Кодирование значений cookie
- url encoding
- base64
Наиболее распространённая версия до появления HTTP/2. Особенности:
- Постоянные соединения (Keep-Alive) для многократных запросов через одно подключение.
- Connection: close
- Connection: keep-alive
- Keep-Alive: 300
- Пайплайнинг: возможность отправки нескольких запросов до получения ответа (но это редко использовалось из-за сложностей с реализацией).
- Поддержка кеширования и улучшение обработки ошибок.
- Новые методы: PUT, DELETE, OPTIONS, TRACE.
- Поддержка chunked transfer encoding (передача данных частями)
Основное нововведение для ускорения работы веб-приложений. Особенности:
- Бинарный формат вместо текстового: меньше ошибок, выше производительность.
- Мультиплексирование: возможность отправки нескольких запросов одновременно через одно соединение.
- Сжатие заголовков: уменьшение объёма данных благодаря HPACK.
- Server Push: сервер может отправлять ресурсы (например, CSS или JS), даже если клиент их не запрашивал.
- Улучшение производительности на медленных и высоколатентных соединениях.
Недостатки:
- Более сложная реализация.
- Требует более современных библиотек и инструментов.
Основные особенности бинарного формата в HTTP/2:
- Бинарные фреймы:
- HTTP/2 разбивает данные на фреймы (frames), которые передаются в бинарном формате.
- Примеры фреймов:
- HEADERS: для передачи заголовков.
- DATA: для передачи содержимого.
- SETTINGS: для настройки соединения.
- Мультиплексирование:
- Разные потоки данных передаются параллельно в рамках одного TCP-соединения.
- Бинарные фреймы позволяют легче разделять данные разных потоков.
- Сжатие заголовков (HPACK):
- Заголовки HTTP/2 передаются в сжатом бинарном формате для уменьшения накладных расходов.
Что даёт бинарный формат в реальной жизни: Размер:
- Заголовки в HTTP/2 в среднем на 30-50% меньше по размеру по сравнению с HTTP/1.x благодаря сжатию HPACK
- На реальном трафике компрессия заголовков дает экономию 20-88% в зависимости от типа запросов Скорость парсинга:
- Бинарный парсинг HTTP/2 на 20-40% быстрее текстового HTTP/1.x
- Основной выигрыш в скорости достигается за счет:
- Отсутствия необходимости текстового парсинга
- Фиксированных форматов полей
- Более эффективной обработки бинарных данных
Как HTTP-клиент узнаёт, что сервер поддерживает бинарный протокол HTTP/2?
- Через механизм ALPN (Application-Layer Protocol Negotiation)
- Клиент в процессе установки TLS-соединения через механизм ALPN отправляет список поддерживаемых протоколов, например:
h2, http/1.1
- Клиент в процессе установки TLS-соединения через механизм ALPN отправляет список поддерживаемых протоколов, например:
- Через Upgrade-заголовок (для HTTP на TCP)
- В случае незашифрованного соединения (HTTP/1.1) клиент может попробовать инициировать использование HTTP/2 через заголовок Upgrade:
GET / HTTP/1.1
Host: example.com
Upgrade: h2c
Connection: UpgradeЕсли сервер поддерживает HTTP/2, он отвечает:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2cПосле этого клиент и сервер переключаются на HTTP/2. Этот метод редко используется, так как большинство HTTP/2-соединений работают через TLS. Для максимальной безопасности ALPN предпочтителен.
Построен на базе протокола QUIC (разработан Google). Особенности:
- Использует UDP вместо TCP: меньше задержек на установку соединений.
- Интеграция TLS 1.3: безопасность встроена с самого начала.
- Устойчивость к потере пакетов: отдельные потоки не блокируют друг друга.
- Более быстрая загрузка веб-страниц, особенно на мобильных устройствах и в условиях нестабильного подключения. Недостатки: • Требует обновления серверов и клиентских приложений. • Ограниченная поддержка в старых системах.
HTTP/3 работает исключительно через протокол UDP с использованием транспортного протокола QUIC. Этот дизайн является фундаментальной особенностью HTTP/3 и не поддерживает работу через TCP.
| Версия | Протокол | Подключение | Основные улучшения |
|---|---|---|---|
| HTTP/1.0 | TCP | Одноразовое | Заголовки, статусы |
| HTTP/1.1 | TCP | Постоянное | Пайплайнинг, кеширование |
| HTTP/2 | TCP | Постоянное | Бинарный формат, мультиплексирование |
| HTTP/3 | UDP (QUIC) | Постоянное | Быстрее соединение, TLS 1.3 |
- Протокол HTTP (Wikipedia)
- Протокол HTTP
- Простым языком об HTTP
- Как открыть инструменты разработчика DevTools в браузере