← Назад к вопросам

Какие знаешь версии HTTP?

1.0 Junior🔥 211 комментариев
#API и сетевые протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь версии HTTP?

HTTP (HyperText Transfer Protocol) эволюционировал со временем. Я работаю со всеми версиями и знаю различия, плюсы и минусы каждой.

HTTP/0.9 (1991)

Первая версия — очень простая, уже не используется.

Особенности:
- Только метод GET
- Без заголовков
- Текстовый формат
- Простая обработка

Пример запроса:
GET /index.html

Пример ответа:
<html>...</html>

HTTP/1.0 (1996)

Добавили методы и заголовки.

GET /index.html HTTP/1.0
Host: example.com
User-Agent: Mozilla/5.0

200 OK
Content-Type: text/html
Content-Length: 1234

<html>...</html>

Особенности:

  • Методы: GET, POST, HEAD
  • Заголовки (headers)
  • Статус коды
  • Каждый запрос = новое соединение (неэффективно)

Проблема: если надо 100 ресурсов, создаётся 100 соединений!

HTTP/1.1 (1997) — ДОМИНИРУЕТ ДО СИХ ПОР

Внёсла огромные улучшения. Большинство проектов всё ещё используют HTTP/1.1.

GET /api/users HTTP/1.1
Host: api.example.com
Connection: keep-alive
User-Agent: curl/7.68.0
Accept: application/json
Authorization: Bearer token123

200 OK
Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600
Set-Cookie: session=abc123

{"id": 1, "name": "John"}

Методы: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, TRACE, CONNECT

Ключевые улучшения:

1. Keep-Alive соединения

HTTP/1.0:
Соединение 1: GET /image1.jpg → закрытие
Соединение 2: GET /image2.jpg → закрытие
Соединение 3: GET /image3.jpg → закрытие

HTTP/1.1 с keep-alive:
Соединение 1: 
  GET /image1.jpg
  GET /image2.jpg
  GET /image3.jpg
  (всё в одном TCP соединении)

2. Pipelining (хотя сложно реализовать)

Можно отправить несколько запросов без ожидания ответа
Проблема: "Head of Line" блокирование

3. Кэширование

# Клиент кэширует ответ на 1 час
Cache-Control: max-age=3600

# Или зависит от изменений (ETag)
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
→ 304 Not Modified

4. Compression

Request:
Accept-Encoding: gzip, deflate, br

Response:
Content-Encoding: gzip
Content-Length: 123 (вместо 1234 - 10x сжатие!)

5. Chunked Transfer Encoding

Transfer-Encoding: chunked

1e\r\n
{data chunk}
19\r\n
{data chunk}
0\r\n

Проблемы HTTP/1.1:

  • Head of Line блокирование (один медленный ответ блокирует остальные)
  • Много соединений для параллелизма
  • Текстовые заголовки (неэффективно)
  • Нет push механизма (сервер не может инициировать)

HTTP/2 (2015)

Ревизия HTTP/1.1 с большими улучшениями производительности.

Ключевые особенности:

1. Бинарный формат (вместо текста)

HTTP/1.1:
GET /api/users HTTP/1.1\r\n
HTTP/2:
Данные в бинарном формате (более эффективно)

2. Multiplexing (true параллелизм)

HTTP/1.1:
Соединение 1: GET /image1 → 500ms
Соединение 2: GET /image2 → 500ms (параллельно)
Соединение 3: GET /image3 → 500ms (параллельно)

HTTP/2:
Одно соединение:
Получить /image1 (Stream 1)
Получить /image2 (Stream 3)  ← одновременно!
Получить /image3 (Stream 5)

3. Server Push

Клиент запрашивает index.html
Сервер видит, что ему нужны style.css и script.js
Сервер PUSHит их без запроса клиента
→ Ускорение загрузки

4. Header Compression (HPACK)

HTTP/1.1:
Host: example.com (14 байт каждый раз)
User-Agent: Mozilla... (40+ байт каждый раз)

HTTP/2:
Сжимает заголовки, отправляет только разницу
→ Экономия трафика

5. Stream Prioritization

Основной контент = приоритет 1
Картинки = приоритет 2
Аналитика = приоритет 3

В Node.js с Express:

const spdy = require('spdy');
const fs = require('fs');

const options = {
  key: fs.readFileSync('./cert/key.pem'),
  cert: fs.readFileSync('./cert/cert.pem')
};

const app = express();

// HTTP/2 (требует HTTPS)
spdy.createServer(options, app).listen(3000);

// Или просто Express (автоматически использует HTTP/1.1)
app.listen(3000);

Проблемы HTTP/2:

  • Требует HTTPS (TLS)
  • Сложнее отладить
  • Многие браузеры требуют ALPN (Application-Layer Protocol Negotiation)
  • Multiplexing может привести к congestion

HTTP/3 (2022) — БУДУЩЕЕ

Самая новая версия, использует QUIC вместо TCP.

Ключевые особенности:

1. QUIC вместо TCP

HTTP/1.1 и HTTP/2 над TCP:
- TCP 3-way handshake = 1 RTT
- TLS handshake = 1-2 RTT
- Данные = ещё RTT
= Минимум 3 RTT перед отправкой данных

HTTP/3 над QUIC:
- 0-RTT соединение (0-RTT resumption)
- Данные отправляются сразу
= 1 RTT вместо 3

2. Connection Migration

Перешёл с WiFi на мобильный интернет?
HTTP/1.1 и HTTP/2: нужно переустанавливать соединение
HTTP/3: соединение остаётся (миграция)

3. Улучшенный Multiplexing

Исправлены проблемы Head of Line блокирования
Потеря одного пакета не блокирует другие потоки

4. Лучше для мобильных

LTE → WiFi переключение
С TCP нужен новый handshake
С QUIC продолжаем говорить

В Node.js:

// Пока поддержка ограничена, но растёт
// HTTP/3 ещё не стабильна в Node.js
// Можно использовать nginx или cloudflare перед приложением

const http3 = require('http3'); // экспериментально

http3.createServer({
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
}, app).listen(443);

Статус HTTP/3:

  • Стандартизирована в 2022
  • Поддержка растёт (Chrome, Firefox, Safari)
  • Cloudflare, Google, Facebook уже используют
  • В production всё ещё редка из-за сложности

Сравнительная таблица

Фича                  HTTP/1.0  HTTP/1.1  HTTP/2  HTTP/3
─────────────────────┼──────────┼──────────┼────────┼────────
Мультиплексинг        Нет       Нет       Да      Да
Keeep-Alive           Нет       Да        Да      Да
Com-pression          Нет       Опция     Да      Да
Server Push           Нет       Нет       Да      Да
Бинарный формат       Нет       Нет       Да      Да
0-RTT                 Нет       Нет       Нет     Да
Connection Migration  Нет       Нет       Нет     Да
Основное соединение   TCP       TCP       TCP     QUIC

Как проверить версию HTTP

# curl показывает версию
curl -v https://example.com 2>&1 | grep "HTTP/"

# Chrome DevTools → Network tab → Protocol column
# Покажет h2 (HTTP/2) или http/3.0 (HTTP/3)
// В Node.js
const http = require('http');
const server = http.createServer((req, res) => {
  console.log(req.httpVersion); // "1.1" для HTTP/1.1
  res.end('OK');
});

Рекомендации для production

Сейчас (2024-2025):

  • Используй HTTP/2 везде (через HTTPS)
  • Поддержка HTTP/1.1 как fallback
  • HTTP/3 добавляй, если платформа готова
  • Cloudflare/nginx спереди для HTTP/3

Node.js приложение:

// Используй reverse proxy (nginx, Cloudflare)
// Она убедится, что:
// - HTTP/2 отправляется клиентам
// - HTTP/1.1 поддерживается для старых браузеров
// - HTTP/3 добавляется постепенно

app.listen(3000);
// Nginx спереди обрабатывает HTTP versions

Вывод: HTTP/2 — стандарт современного интернета (2025). HTTP/1.1 всё ещё широко используется. HTTP/3 растёт, но не является обязательным. Как backend разработчик, я редко беспокоюсь о версии HTTP — это обрабатывается на уровне reverse proxy или фреймворка.

Какие знаешь версии HTTP? | PrepBro