保持活动选项在 Linux 上不适用于传出连接

Jam*_*tig 8 linux keepalive socket

有谁知道 Linux 是否支持传出连接上的保持活动套接字选项?

我使用 keep-alive 选项建立了传出连接,但 netstat --timers 显示(我假设计时器已关闭):

tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)
Run Code Online (Sandbox Code Playgroud)

应用了相同套接字选项的传入连接显示:

tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)
Run Code Online (Sandbox Code Playgroud)

我希望我能看到套接字选项,但 ss 或 lsof 都不会显示它们。

acu*_*ich 7

首先,您需要确保在您的系统上启用了 TCP keepalive。您可以像这样检查默认设置:

# 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
Run Code Online (Sandbox Code Playgroud)

然后确保您在代码中正确设置了它。它应该是这样的:

int optval = 1;
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) {
    perror("setsockopt()");
    close(s);
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

在我的系统上,当我使用上面的代码在两侧设置 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)
Run Code Online (Sandbox Code Playgroud)

然后我用wireshark验证了keepaliveNOP正在发送。

更多细节可以在TCP Keepalive HOWTO 中找到