Ответ
Да, механизм Keep-Alive является ключевой особенностью протокола HTTP/1.1 и включен в нём по умолчанию. Он позволяет браузеру или другому клиенту использовать одно и то же TCP-соединение для отправки нескольких HTTP-запросов и получения ответов, вместо того чтобы открывать новое соединение для каждого запроса.
Как это работает:
- Клиент отправляет запрос с заголовком
Connection: Keep-Alive
(хотя в HTTP/1.1 это поведение по умолчанию и заголовок часто опускается). - Сервер, получив запрос и поддерживая Keep-Alive, оставляет TCP-соединение открытым после отправки ответа.
- Клиент может отправить следующий запрос через это же, уже установленное, соединение.
Преимущества:
- Снижение задержки (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" на уровне протокола.