Со страницы man
:
Если опция сокета SO_KEEPALIVE включена для установленного TCP-соединения и соединение не используется в течение двух часов, TCP отправляет пакет на удаленный сокет,ожидая, что удаленный TCP подтвердит, что соединение все еще активно.Если удаленный TCP не отвечает своевременно, TCP продолжает отправлять пакеты поддержки активности в соответствии со своим обычным алгоритмом повторной передачи.Если удаленный TCP не отвечает в течение определенного периода времени, TCP разрывает соединение.Следующий системный вызов сокета (например, recv ()) возвращает ошибку, и для errno установлено значение ETIMEDOUT.
Подробную информацию о включении SO_KEEPALIVE можно найти в getsockopt (2).
После периода простоя с одноранговым узлом, в котором не было связи, на удаленный одноранговый узел будет отправлен зонд (небольшой пакет), чтобы проверить, жив ли одноранговый узел или нет.
Если одноранговый узел все еще доступен, будет получено сообщение ACK
, поэтому можно сделать вывод, что ссылка все еще включена.Если нет, то партнер умер (на самом деле это немного сложнее, потому что TCP
сделает несколько попыток, прежде чем отказаться).
Вы можете настроить опцию как на клиенте, так и на сервере (это означает, чтои сервер, и клиент будут уведомлены о проблемах netowrk).В любом случае на сервере вы установите опцию для сокета, возвращаемого accept()
.