Socketプログラミングメモ
提供: Astarisk Works Wiki
C言語でネットワークプログラムを実装する際のメモ。動作環境はLinux系OSを対象としている。
TCPのkeep-aliveオプション
ソケットを開く際に、TCPのkeep-aliveオプションを設定するとアイドル状態が続いた際に、プローブパケットを送出し、通信相手との接続を確認し維持しようとする。逆にプローブパケットにACKが帰ってこないと通信相手との切断を検出できることとなる。
デフォルトではアイドル状態が7200秒=2時間経た後、プローブパケットを75秒間隔で9回送信する。プローブパケットに対するACKの応答がないと、通信相手がいなくなったと判断し、アイドル状態の通信を終了する。 つまり、アイドル状態に入ってから、7200秒+75x9秒=7875秒 = 131.25秒 = 2時間11分経過すると通信を終了する。なお、SO_KEEPALIVE ソケットオプションが有効になっていないと keep-alive は送られない。
もちろんプローブパケットを投げるまでのアイドル時間や、プローブを投げる間隔、投げる回数は設定できる。 /procインターフェースを使う場合には次の値で変更する。具体的にはIPv4の場合、/proc/sys/net/ipv4/ 以下に次のそれぞれを設定するファイルが存在するのでその中身を書き換えることで設定できる。
- tcp_keepalive_intvl (integer; default
- 75; Linux 2.4 以降)
- TCP keep-alive のプローブを送る間隔 (秒単位)。
- tcp_keepalive_probes (integer; default
- 9; Linux 2.2 以降)
- TCP keep-alive プローブの最大回数。この回数だけ試しても接続先から反応が得られない場合は、あきらめて接続を切断する。
- tcp_keepalive_time (integer; default
- 7200; Linux 2.2 以降)
- 接続がアイドル状態になってから、keep-alive プローブを送信するまでの時間を秒単位で指定する。
/procインターフェースでの変更はすべての通信に影響する個々の通信について個別に設定するにはsetsockoptで次の値を設定する。
- TCP_KEEPCNT (Linux 2.4 以降)
- 接続を落とす前に TCP が試みる keepalive プローブの最大回数。移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_KEEPIDLE (Linux 2.4 以降)
- この時間 (秒単位) を越えて接続がアイドル状態に留まっていると、このソケットに SO_KEEPALIVE ソケットオプションが設定されている場合、 TCP は keepalive プローブを送りはじめる。移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_KEEPINTVL (Linux 2.4 以降)
- 各 keepalive プローブの間隔 (秒単位)。移植性の必要なプログラムではこのオプションを用いるべきではない。