揮発性のメモ2

http://d.hatena.ne.jp/iww/

TCP/IPの通信の切断検知

プログラムが終了するときはOSがFINとか送ってくれるけど、途中でLANケーブル抜けたときとかはどうにもならないので
自分で切断を検知する必要がある。キープアライブを使って切断を検知する。

    int option = 1;
    setsockopt( sd, SOL_SOCKET, SO_KEEPALIVE, (void*)&option, sizeof(option) );

デフォルトでは切断検知まで 2時間11分15秒。
2時間とか待ってると日が暮れるので、これをせめて3分とかにする

    int option = 1;
    setsockopt( sd, SOL_SOCKET, SO_KEEPALIVE, (void*)&option, sizeof(option) );

    option = 60;
    setsockopt( sd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&option, sizeof(option) );
    option = 30;
    setsockopt( sd, IPPROTO_TCP, TCP_KEEPINTVL, (void*)&option, sizeof(option) );
    option =  4;
    setsockopt( sd, IPPROTO_TCP, TCP_KEEPCNT, (void*)&option, sizeof(option) );


3つのソケットオプションについて

TCP_KEEPIDLE

キープアライブを最初に投げ始めるまでの時間(秒)。デフォルトは7200秒。
この秒数だけ無通信時間が続いたら、キープアライブパケットを投げはじめる。
/proc/sys/net/ipv4/tcp_keepalive_time

TCP_KEEPINTVL

キープアライブパケットを投げる間隔(秒)。デフォルトは75秒。
パケット投げて応答がなかったら、この間隔でリトライする。
/proc/sys/net/ipv4/tcp_keepalive_intvl

TCP_KEEPCNT

キープアライブパケットを投げリトライする回数。デフォルトは9回。
この回数だけ投げて駄目なら切断する。あと、ソケットにはエラーETIMEOUTが積まれる。
/proc/sys/net/ipv4/tcp_keepalive_probes


なので、デフォルトだと切断検知までに最長で 7200+75*9 = 7875秒 = 2時間11分15秒かかる。
これを3分にするなら 60+30*4とかにすると出来る。負荷とか考えて調整する。


「移植性」などという言葉は捨てる。


ネットワークにかかわるならこの本を全部読む必要がある