где установить keep-alive в linux

http://ag-up.com

#при простое этого времени, будет произведена проверка соединения
/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 минут.

    • Артем Глумов
    • 26.06.2014

    Здравствуйте!

    Заметил неточность в коде:

    setsockopt( sock, SOL_SOCKET, SO_KEEPALIVE, 1, sizeof(int) );

    Четвертый параметр — указатель на значение а не само значение, то есть должно быть что-то вроде:

    int val = 1;
    setsockopt( sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int) );

  1. No trackbacks yet.

Оставьте комментарий