Keepalive ( KA ) — это сообщение, отправляемое одним устройством другому для проверки работоспособности соединения между ними или для предотвращения его разрыва.
После того, как установлено TCP-соединение, это соединение определяется как действительное, пока одна из сторон не закроет его. После того, как соединение перешло в состояние соединения, оно останется подключенным неопределенно долго. Но в действительности соединение не будет длиться бесконечно. Многие системы брандмауэров или NAT закроют соединение, если в течение некоторого периода времени не было никакой активности. Сигнал Keep Alive может использоваться для обмана промежуточных хостов, чтобы они не закрывали соединение из-за бездействия. Также возможно, что один хост больше не прослушивает (например, сбой приложения или системы). В этом случае соединение закрывается, но FIN
никогда не отправлялось. В этом случае пакет Keep Alive может использоваться для опроса соединения, чтобы проверить, все ли оно еще цело.
Сигнал keepalive часто отправляется с предопределенными интервалами и играет важную роль в Интернете . После отправки сигнала, если ответ не получен, предполагается, что соединение отключено, и будущие данные будут маршрутизироваться по другому пути, пока соединение не будет снова включено. Сигнал keepalive также может использоваться для указания инфраструктуре Интернета, что соединение должно быть сохранено. Без сигнала keepalive промежуточные маршрутизаторы с поддержкой NAT могут разорвать соединение после истечения времени ожидания.
Поскольку единственной целью является поиск неработающих ссылок или указание соединений, которые следует сохранить, сообщения keepalive, как правило, короткие и не занимают много полосы пропускания . Однако их точный формат и условия использования зависят от протокола связи.
Сообщения Keepalive протокола управления передачей (TCP) являются дополнительной функцией, и если они включены, то должны быть по умолчанию отключены. [1] Пакет Keepalive не содержит данных. В сети Ethernet это приводит к кадрам минимального размера (64 байта [2] ). Существует три параметра [3], связанных с Keepalive:
Когда два хоста соединены по сети через TCP/IP, пакеты TCP Keepalive можно использовать для определения того, является ли соединение все еще действительным, и для его разрыва при необходимости.
Большинство хостов, поддерживающих TCP, также поддерживают TCP Keepalive. Каждый хост (или одноранговый узел) периодически отправляет своему одноранговому узлу пакет TCP, который запрашивает ответ. Если отправлено определенное количество пакетов keepalive и не получен ответ (ACK), отправляющий хост завершит соединение со своего конца. Если соединение было завершено из-за тайм-аута TCP Keepalive, а другой хост в конечном итоге отправляет пакет для старого соединения, хост, завершивший соединение, отправит пакет с установленным флагом RST, чтобы сообщить другому хосту, что старое соединение больше не активно. Это заставит другой хост завершить свой конец соединения, чтобы можно было установить новое соединение.
Обычно TCP Keepalive отправляются каждые 45 или 60 секунд при неактивном TCP-соединении, и соединение разрывается после пропуска 3 последовательных ACK. Это зависит от хоста, например, по умолчанию ПК с Windows отправляют первый пакет TCP Keepalive через 7200000 мс (2 часа), затем отправляют 5 пакетов Keepalive с интервалом 1000 мс, разрывая соединение, если нет ответа ни на один из пакетов Keepalive. Хосты Linux отправляют первый пакет TCP Keepalive через 2 часа (по умолчанию с Linux 2.2), затем отправляют 9 проб Keepalive (по умолчанию с Linux 2.2) с интервалом 75 секунд (по умолчанию с Linux 2.4), разрывая соединение, если нет ответа ни на один из пакетов Keepalive. [4]
Поскольку TCP keepalive является необязательным, различные протоколы (например, SMB [5] и TLS [6] ) реализуют собственную функцию keep-alive поверх TCP. Также распространено, что протоколы, поддерживающие сеанс по протоколу без соединения, например, OpenVPN через UDP, [7] реализуют собственную функцию keep-alive.
Протокол передачи гипертекста использует ключевое слово «Keep-Alive» в заголовке «Connection», чтобы сигнализировать о том, что соединение должно оставаться открытым для дальнейших сообщений (это значение по умолчанию в HTTP 1.1, но в HTTP 1.0 по умолчанию использовалось новое соединение для каждой пары запрос/ответ). [8] Несмотря на похожее название, эта функция совершенно не связана.