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

Что такое HTTP/2?

1.6 Junior🔥 181 комментариев
#REST API и микросервисы

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

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

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

Что такое HTTP/2?

HTTP/2 — это вторая основная версия протокола HTTP, опубликованная в 2015 году (RFC 7540). Это значительное улучшение по сравнению с HTTP/1.1, обеспечивающее повышение производительности и эффективности работы сетевых приложений.

История и причины создания

HTTP/1.1 был создан в 1997 году и имел серьёзные ограничения:

  • Блокирование запросов (Head-of-Line blocking)
  • Текстовый формат (неэффективен)
  • Неэкономичное использование полосы пропускания
  • Множество подключений для параллельной загрузки

HTTP/2 был разработан на основе протокола SPDY (Google), переработан и стандартизирован.

Главные отличия HTTP/2

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

HTTP/1.1 (текстовый):
GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
User-Agent: Chrome\r\n
\r\n

HTTP/2 (бинарный):
00 00 15 04 00 00 00 00 00 83 84 86 41 ...
(компактнее и быстрее парсится)

Преимущества:

  • Меньше данных
  • Быстрее парсится
  • Меньше ошибок при трансмиссии

2. Мультиплексирование (Multiplexing)

Множественные запросы и ответы на одном соединении:

HTTP/1.1:
Client ---|Request 1|-----> Server
         <|Response 1|-------
          |Request 2|----->  (ждём ответа на 1)
         <|Response 2|-------

HTTP/2:
Client ---|Request 1|-----> Server
          |Request 2|-----> 
          |Request 3|-----> (все параллельно)
         <|Response 1|-------
         <|Response 3|-------
         <|Response 2|-------

Это устраняет Head-of-Line blocking и снижает задержку.

3. Приоритизация потоков (Stream Prioritization)

// Можно указать приоритет для запросов
// Критичные ресурсы загружаются первыми
Priority: 1 (CSS, JS) - высокий приоритет
Priority: 5 (изображения) - низкий приоритет
Priority: 10 (аналитика) - очень низкий

4. Server Push

Сервер может отправлять ресурсы без запроса клиента:

Клиент запрашивает: GET /index.html
Сервер отвечает с /index.html И ТАКЖЕ пушит:
  - /styles.css
  - /script.js

Клиент знает, что ему нужны эти файлы, поэтому это эффективно.

5. Сжатие заголовков (HPACK)

HTTP/1.1 (каждый запрос, полные заголовки):
Host: example.com
User-Agent: Mozilla/5.0...
Accept: text/html
Cookie: session=abc123; user=john

HTTP/2 (кодируются дельты, повторяющиеся заголовки опускаются):
Host: example.com
User-Agent: Mozilla/5.0...
Accept: text/html
Cookie: session=abc123; user=john

(При следующем запросе передаются только изменения)

Архитектура HTTP/2

Запрос разбивается на FRAME (фреймы):

HTTP/2 Connection (TCP)
├── Stream 1 (Request/Response для первого запроса)
│   ├── HEADERS Frame (метаданные)
│   ├── DATA Frame (тело запроса)
│   ├── HEADERS Frame (ответ)
│   └── DATA Frame (тело ответа)
├── Stream 3 (второй запрос)
│   ├── HEADERS Frame
│   ├── DATA Frame
│   └── ...
└── Stream 5 (третий запрос)
    ├── ...

Использование в Java

1. HTTP Client (Java 11+)

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HTTP2Example {
    public static void main(String[] args) throws Exception {
        // HTTP/2 автоматически используется, если сервер его поддерживает
        HttpClient client = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)  // Явно указываем HTTP/2
            .build();
        
        HttpRequest request = HttpRequest.newBuilder()
            .uri(new URI("https://httpbin.org/get"))
            .GET()
            .build();
        
        HttpResponse<String> response = client.send(
            request, 
            HttpResponse.BodyHandlers.ofString()
        );
        
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

2. Spring Boot и HTTP/2

# application.yml
server:
  http2:
    enabled: true  # Включить HTTP/2
  ssl:
    enabled: true  # HTTP/2 требует HTTPS (TLS)
    key-store: classpath:keystore.jks
    key-store-password: password

3. Netty (популярный async сервер)

import io.netty.handler.codec.http2.Http2ConnectionHandler;

public class HTTP2Server {
    public void start() {
        // Netty поддерживает HTTP/2 "из коробки"
        // Конфигурируется в ChannelInitializer
    }
}

Сравнение HTTP/1.1 vs HTTP/2

КритерийHTTP/1.1HTTP/2
ФорматТекстовыйБинарный
СоединенияМножествоОдно (мультиплекс)
ПараллелизмОграниченПолный
ПриоритизацияНетЕсть
Server PushНетЕсть
Сжатие заголовковНетHPACK
ПроизводительностьХорошоОтличная
Поддержка браузеров100%~95%

Практические выводы

  1. Бенефиты для пользователя:

    • Страницы грузятся быстрее
    • Меньше задержек
    • Меньше потребления трафика
  2. Разработчикам:

    • Не нужно искусственно разбивать запросы
    • Можно избежать domain sharding
    • HTTPS обязателен (для HTTPS требуется TLS, HTTP/2 обычно идёт с HTTPS)
  3. Требования:

    • HTTPS/TLS (протокол требует шифрования, хотя формально возможен и без)
    • Актуальные браузеры (все современные его поддерживают)
    • Сервер с поддержкой HTTP/2
  4. Когда это важно:

    • Веб-приложения (огромный прирост скорости)
    • API сервисы (снижение задержки)
    • Мобильные приложения (экономия батареи)

HTTP/3 - следующий шаг

HTTP/3 (2022) улучшает HTTP/2:

  • Вместо TCP использует QUIC (UDP-based)
  • Меньше задержка при изменении сети
  • Лучше для мобильных устройств

Но HTTP/2 остаётся основным протоколом до сих пор.

Что такое HTTP/2? | PrepBro