Opsi tetap-hidup tidak bekerja di Linux untuk koneksi keluar

8

Adakah yang tahu kalau Linux mendukung opsi socket keep-live pada koneksi keluar?

Saya membuat koneksi keluar dengan opsi keep-hidup tetapi netstat --timers memamerkan (Saya menganggap timer dimatikan):

tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)

Koneksi masuk dengan opsi soket yang sama menunjukkan:

tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)

Saya berharap saya bisa melihat opsi soket tetapi tidak ada ss atau lsof akan menunjukkan kepada saya mereka.

James Hartig
sumber

Jawaban:

7

Pertama, Anda perlu memastikan bahwa keepalive TCP diaktifkan pada sistem Anda. Anda dapat memeriksa pengaturan default seperti ini:

# 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

Kemudian pastikan Anda mengaturnya dengan benar dalam kode Anda. Seharusnya terlihat seperti ini:

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

Pada sistem saya ketika saya menggunakan kode di atas untuk mengatur SO_KEEPALIVE di kedua sisi saya melihat:

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)

Dan kemudian saya memverifikasi dengan wireshark bahwa keepalive NOPsedang dikirim.

Rincian lebih lanjut dapat ditemukan di HOWTO TCP Keepalive .

aculich
sumber
Terima kasih atas informasinya, tapi saya sudah mengaturnya dan saya mengaturnya dengan cara yang sama persis seperti Anda, saya hanya tidak menyetel keepalive di netstat.
James Hartig
1
Dalam hal ini, posting lebih banyak info tentang sistem Anda dan kode sumber (atau test case yang disederhanakan) sehingga saya dapat mencoba mereproduksi masalah, jika tidak, tidak banyak yang harus dilakukan di sini untuk debug.
aculich
@aculich benar, jika Anda telah menetapkan keepalive di sistem, aplikasi Anda yang tidak menggunakannya dengan benar. Saya menyarankan untuk membaca TCP Keepalive HOWTO seperti yang disarankan oleh aculich atau memposting kode sumber aplikasi atau mencoba untuk mengeksekusi sebuah lsof untuk melihat apa yang terjadi
tmow
0

pengaturan klien-sysctl:

sudo /sbin/sysctl -a|grep keep
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 1
net.ipv4.tcp_keepalive_intvl = 1

klien tetap 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

tetapi tidak menangkap paket apa pun, yang berarti tcp_keepalive_time tidak berfungsi

pengguna393527
sumber