Apakah mungkin untuk koneksi TCP tetap terbuka ketika klien telah terputus?

12

Kami memiliki aplikasi server yang menghadapi masalah kelelahan TCP di sekitar 4000 koneksi. Ini akan terjadi setiap 3 atau 4 minggu (kurang-lebih). Vendor, yang telah membuat aplikasi server ini memberi tahu kami setelah memeriksa output netstat -b bahwa beberapa koneksi tetap terbuka bahkan jika klien telah jatuh.

Saya telah diberi tugas untuk menyelidiki mengapa aplikasi klien tertentu tidak menutup koneksi TCP dengan benar. Saya berkeyakinan bahwa jika komputer klien dimatikan, bahwa ia tidak dapat MUNGKIN melaporkan dari server bahwa koneksi TCP masih dibuat dengan klien itu. Sayangnya, saya tidak dapat menemukan informasi apa pun untuk memvalidasi pandangan saya. Saya tidak ingin membuang waktu untuk menyelidiki masalah potensial yang saya pikir tidak akan menjadi masalah.

tldr;

Bisakah server melaporkan koneksi yang dibuat ke komputer yang dimatikan?

Josh Smeaton
sumber

Jawaban:

13

TCP tidak berusaha mendeteksi koneksi mati kecuali pada sisi yang mengirimkan data. Ini adalah tanggung jawab kode aplikasi yang memanggil TCP stack untuk melakukan ini. Protokol apa yang terlibat di sini? (Yang di atas TCP.)

Ini adalah "solusi" jelek yang mengerikan, tetapi Anda dapat mengaktifkan TCP keepalives . Ada lebih banyak di artikel ini .

David Schwartz
sumber
Anda mungkin berarti lapisan dan lapisan sesi di atas lapisan transport, yang merupakan tempat TCP berada.
Rilindo
1
@Rilindo: Dalam praktiknya, dan dalam kasus khusus ini, Anda memiliki aplikasi yang membuat panggilan ke TCP stack. Protokol di atas TCP (HTTP, POP, atau apa pun) biasanya menentukan cara melakukan ini, karena perancang protokol tersebut tahu bahwa TCP tidak dapat melakukan ini sendiri.
David Schwartz
Aduh, kesalahanku. Lapisannya 7, lalu.
Rilindo
Saya tidak akan mengaktifkan keepalives pada saat ini, tetapi berguna untuk mengetahui opsi yang ada. Artikel itu sepertinya menyarankan sudah ada waktu 2 jam. AFAIK, koneksi tetap terbuka selama berhari-hari / minggu.
Josh Smeaton
Kemungkinan besar, keepalives tidak diaktifkan. Beberapa kode harus diaktifkan. Sepertinya aplikasi ini benar-benar rusak jika bahkan tidak mengaktifkan keepalives dan tidak memiliki mekanisme timeout / menuai. Protokol apa yang kita bicarakan? (HTTP? SMTP? FTP?)
David Schwartz
8

Ya itu mungkin. Seperti yang dinyatakan David dan Paul dalam jawaban mereka, tidak ada mekanisme dalam TCP (selain TCP keep-alives, yang bersifat opsional) untuk mendeteksi koneksi yang setengah terbuka. Terserah vendor aplikasi untuk menentukan keadaan koneksi dan untuk mengambil tindakan yang sesuai.

Sejauh menyangkut TCP, tidak ada deteksi atau perbedaan antara koneksi setengah terbuka dan koneksi lama.

Anda harus mulai memecahkan masalah ini dari lapisan 1 (fisik) dari model OSI hingga lapisan 7 (aplikasi) untuk mencari tahu di mana masalahnya terjadi. Saran saya adalah menginstal dan menjalankan program penangkapan paket pada salah satu klien yang terpengaruh sampai masalah terjadi, dan kemudian menganalisis penangkapan untuk mencoba dan menentukan apa yang menyebabkan klien tidak menutup koneksi.

joeqwerty
sumber
3
Atau minta vendor untuk menerapkan batas waktu yang wajar :)
Shane Madden
5

Ketika workstation ingin menutup koneksi dengan server, ia mengirimkan TCP FIN. Jika klien tidak berperilaku baik dan tidak menutup koneksinya, mereka sebenarnya bisa tetap terhubung di server. Anda dapat mengatur batas waktu untuk koneksi terbuka di server untuk membersihkan ini - meskipun akan lebih baik untuk menemukan penyebabnya. Port apa yang merupakan koneksi terbuka yang masuk? Setelah Anda tahu layanan apa yang sedang diakses, Anda mungkin dapat mengidentifikasi aplikasi klien yang mengenai server.

Paul Ackerman
sumber
Kami tahu klien yang merupakan masalah nyata. Ini adalah aplikasi desktop yang digunakan ratusan pengguna kami setiap hari. Saya berasumsi masalahnya adalah aplikasi mogok, hard reset, atau tugas akhir. Saya pikir dalam semua situasi itu bahwa server akan menyadari koneksi yang terputus.
Josh Smeaton
4
Sejauh menyangkut server, koneksi terbuka kecuali ia menerima FIN atau RST dari klien. Tanpa itu, server mengasumsikan bahwa koneksi masih dibuat tetapi klien tidak memiliki data untuk dikirim. Tidak ada perbedaan antara koneksi setengah terbuka dan koneksi idle sejauh menyangkut server.
joeqwerty
@ joeqwerty: Benar, namun server dapat memutuskan bahwa ia tidak ingin tetap membuka koneksi tanpa batas waktu, dan dapat menerapkan mekanisme batas waktu / tutup. Itulah yang dimaksud David Schwartz dalam jawabannya dengan "itu adalah tanggung jawab kode aplikasi". Jadi server dapat membuat perbedaan antara koneksi setengah terbuka dan koneksi siaga jika diinginkan. Namun untuk TCP, memang tidak ada perbedaan antara koneksi setengah terbuka dan koneksi idle.
sleske
@sleske: Setuju bahwa kode aplikasi dapat melakukan ini, tetapi TCP tidak dapat kecuali jika keep-alive diaktifkan.
joeqwerty