Linuxで発信接続のキープアライブオプションが機能しない


8

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も表示されません。

回答:


7

まず、システムで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キープアライブHOWTOを参照してください。


情報をありがとう、しかし私はそれらをすでに設定していて、私はそれをあなたとまったく同じ方法で設定しています。私はnetstatでキープアライブを設定していません。
James Hartig、2011

1
その場合は、システムとソースコードに関する詳細情報(または簡略化したテストケース)を投稿して、問題を再現できるようにしてください。
aculich

@aculichは正しいです。システムでキープアライブを設定している場合、それを適切に使用していないのはアプリケーションです。aculichの提案に従ってTCPキープアライブHOWTOを読むか、アプリケーションのソースコードを投稿するか、lsofを実行して何が起こるかを確認することをお
勧め

0

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は機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.