где установить keep-alive в linux
#при простое этого времени, будет произведена проверка соединения /proc/sys/net/ipv4/tcp_keepalive_time #с каким интервалом делать проверку соединения /proc/sys/net/ipv4/tcp_keepalive_intvl #сколько делать попыток перед разрывом соединения /proc/sys/net/ipv4/tcp_keepalive_probes
Установить нужные значения можно следующими способами:
через procfs:
echo "3" > /proc/sys/net/ipv4/tcp_keepalive_probes
через sysctl:
sysctl -w net.ipv4.tcp_keepalive_probes=3
программно:
setsockopt( sock, SOL_SOCKET, SO_KEEPALIVE, 1, sizeof(int) ); setsockopt( sock, SOL_TCP, TCP_KEEPCNT, 20, sizeof(int) ); setsockopt( sock, SOL_TCP, TCP_KEEPIDLE, 180, sizeof(int) ); setsockopt( sock, SOL_TCP, TCP_KEEPINTVL, 60, sizeof(int) );
Как это работает:
Рассмотрим на примере icq. Ваш клиент подключается к серверу загружает ваши данные и переходит в состояние ожидания входящих сообщений. Не смотря на то, что никакие данные в этот момент не передаются, соединения остается установленным. По истечении времени, установленного в tcp_keepalive_time, от последнего переданного/принятого пакета, система начинает проверять соединение. Дело в том, что если вдруг произошла ошибка, и доступ в интернет по какой-то причине пропал, ваш компьютер об этом никто не уведомит. Единственным вариантом остается самому проверить наличие соединения. И так, по истечении tcp_keepalive_time система отправляет специальный пакет по установленному соединению, если получен ответ — все в порядке, в противном случае система повторит попытку через tcp_keepalive_intvl секунд, и так tcp_keepalive_probes раз. После того как все попытки будут исчерпаны — разорвет соединение. Именно в этот момент icq выдаст сообщение о том, что связь прервана.
Время через которое будет разорвано соединение не будет превышать tcp_keepalive_time + (tcp_keepalive_intvl*tcp_keepalive_probes), что на моей машине примерно составляет 2 часа 11 минут.
Здравствуйте!
Заметил неточность в коде:
setsockopt( sock, SOL_SOCKET, SO_KEEPALIVE, 1, sizeof(int) );
Четвертый параметр — указатель на значение а не само значение, то есть должно быть что-то вроде:
int val = 1;
setsockopt( sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int) );