Что такое Keep-Alive в HTTP/1.1 и как он работает?

Ответ

Да, механизм Keep-Alive является ключевой особенностью протокола HTTP/1.1 и включен в нём по умолчанию. Он позволяет браузеру или другому клиенту использовать одно и то же TCP-соединение для отправки нескольких HTTP-запросов и получения ответов, вместо того чтобы открывать новое соединение для каждого запроса.

Как это работает:

  1. Клиент отправляет запрос с заголовком Connection: Keep-Alive (хотя в HTTP/1.1 это поведение по умолчанию и заголовок часто опускается).
  2. Сервер, получив запрос и поддерживая Keep-Alive, оставляет TCP-соединение открытым после отправки ответа.
  3. Клиент может отправить следующий запрос через это же, уже установленное, соединение.

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

  • Снижение задержки (Latency): Не тратится время на повторное "тройное рукопожатие" (TCP handshake) для каждого запроса.
  • Уменьшение нагрузки на CPU и память: Как на клиенте, так и на сервере, так как поддерживать открытое соединение менее затратно, чем постоянно создавать новые.

Управление в Go:

В стандартной библиотеке Go управление Keep-Alive на стороне клиента осуществляется через структуру http.Transport:

// Создаем кастомный транспорт
transport := &http.Transport{
    // DisableKeepAlives: false, // false - значение по умолчанию, Keep-Alive включен
    MaxIdleConns:      100,             // Максимальное количество "простаивающих" соединений
    IdleConnTimeout:   90 * time.Second,  // Время жизни для простаивающего соединения
}

// Создаем клиент с этим транспортом
client := &http.Client{Transport: transport}

Важное замечание: В HTTP/2 концепция Keep-Alive была заменена более продвинутым механизмом мультиплексирования, который позволяет передавать несколько запросов и ответов одновременно через одно TCP-соединение, решая проблему "head-of-line blocking" на уровне протокола.