Linuxが発信接続でキープアライブソケットオプションをサポートしているかどうかを誰かが知っていますか?
キープアライブオプションを使用して送信接続を作成しましたが、netstat --timersがオフを示しています(タイマーがオフであると想定しています)。
tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)
同じソケットオプションが適用された着信接続は、次のように表示されます。
tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)
ソケットオプションが表示されたらいいのに、ssもlsofも表示されません。
まず、システムでTCPキープアライブが有効になっていることを確認する必要があります。次のようなデフォルト設定を確認できます。
# sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
次に、コードで適切に設定していることを確認します。次のようになります。
int optval = 1;
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) {
perror("setsockopt()");
close(s);
exit(EXIT_FAILURE);
}
私のシステムでは、上記のコードを使用して両側にSO_KEEPALIVEを設定すると、次のようになります。
tcp 0 0 127.0.0.1:48591 127.0.0.1:5555 ESTABLISHED keepalive (6958.37/0/0)
tcp 0 0 127.0.0.1:5555 127.0.0.1:48591 ESTABLISHED keepalive (6958.37/0/0)
その後、wiresharkを使用して、キープアライブNOP
が送信されていることを確認しました。
詳細は TCP Keepalive HOWTO にあります。
client-sysctl-setting:
Sudo /sbin/sysctl -a|grep keep
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 1
net.ipv4.tcp_keepalive_intvl = 1
クライアントはtcpdumpを保持します:
Sudo /usr/sbin/tcpdump -nn -vv -i bond0 tcp and Host 10.201.126.72 and port 8001
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
ただし、パッケージキャプチャはありません。つまり、tcp_keepalive_timeは機能しません。