Что такое Keep-Alive (в HTTP/сетях) и зачем он нужен?

«Что такое Keep-Alive (в HTTP/сетях) и зачем он нужен?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Keep-Alive (или постоянное соединение, HTTP persistent connection) — это механизм на уровне HTTP/TCP, который позволяет повторно использовать одно установленное TCP-соединение для отправки и получения нескольких HTTP-запросов и ответов, вместо того чтобы открывать и закрывать новое соединение для каждого запроса.

Проблема, которую решает Keep-Alive: Без него загрузка веб-страницы с 50 ресурсами (HTML, CSS, JS, картинки) потребовала бы 50 отдельных TCP-соединений. Каждое соединение — это накладные расходы на:

  1. TCP three-way handshake (SYN, SYN-ACK, ACK).
  2. Медленный старт (slow start) алгоритма TCP.
  3. TLS handshake (если используется HTTPS).
  4. Разрыв соединения (FIN-пакеты).

Как это работает и настраивается:

  • На стороне веб-сервера (Nginx):

    http {
        # Время, в течение которого неактивное соединение остается открытым
        keepalive_timeout 65s;
        # Максимальное количество запросов по одному соединению
        keepalive_requests 100;
        # Резервирование keepalive-соединений для рабочих процессов
        keepalive_disable none; # Включить для всех браузеров
    }
  • На стороне балансировщика нагрузки/прокси (HAProxy):

    backend webservers
        mode http
        option http-keep-alive  # Включение keep-alive между HAProxy и бэкендом
        server web1 10.0.1.10:80 check
  • В HTTP-заголовках:

    Запрос:  Connection: keep-alive
    Ответ:   Connection: keep-alive
             Keep-Alive: timeout=65, max=100

Преимущества для производительности и инфраструктуры (DevOps-взгляд):

  1. Снижение задержки (Latency): Исключаются многократные handshake'ы, особенно критично для HTTPS.
  2. Снижение нагрузки на ОС и сервер: Меньше операций по открытию/закрытию сокетов, меньше используется CPU и память на управление соединениями.
  3. Улучшение пропускной способности: Более эффективное использование сетевых ресурсов.
  4. HTTP/2 и HTTP/3: Эти протоколы используют постоянные соединения и мультиплексирование запросов по умолчанию, что является эволюцией идеи Keep-Alive.

Мониторинг: В инструментах вроде netstat или ss большое количество соединений в состоянии ESTABLISHED может указывать на работу keep-alive.

    ss -t state established 'sport = :80'