В чём ключевые различия между HTTP/1.1 и HTTP/2?

Ответ

Основная цель HTTP/2 — решить проблемы производительности HTTP/1.1, в частности, проблему блокировки начала очереди (Head-of-Line blocking).

HTTP/1.1

  • Текстовый протокол: Заголовки и тело передаются в виде текста.
  • Последовательные запросы: В рамках одного TCP-соединения запросы обрабатываются строго по очереди. Если первый запрос медленный, он задерживает все последующие.
  • Большой размер заголовков: Заголовки (особенно cookies) могут быть объёмными и повторяются в каждом запросе.

HTTP/2

  • Мультиплексирование: Главное нововведение. Позволяет отправлять несколько запросов и ответов одновременно в рамках одного TCP-соединения, устраняя проблему HOL blocking на уровне приложения.
  • Бинарный протокол: Данные передаются в виде бинарных фреймов. Это эффективнее и менее подвержено ошибкам парсинга.
  • Сжатие заголовков (HPACK): Эффективно сжимает заголовки, удаляя избыточную информацию, что снижает накладные расходы.
  • Приоритезация потоков: Клиент может указать, какие ресурсы ему нужны в первую очередь (например, CSS важнее картинок в футере).
  • Server Push: Сервер может отправлять ресурсы, которые, по его мнению, понадобятся клиенту, ещё до того, как клиент их запросит (например, отправить style.css вместе с index.html).

В Go поддержка HTTP/2 включается автоматически при использовании net/http клиента для HTTPS-адресов, если сервер его поддерживает.

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    // Если example.com поддерживает HTTP/2, клиент автоматически его использует.
    resp, err := http.Get("https://example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    // Выведет "HTTP/2.0"
    fmt.Printf("Протокол: HTTP/%d.%dn", resp.ProtoMajor, resp.ProtoMinor)
}