Ответ
Основная цель 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)
}