Apakah saya perlu melakukan detak jantung agar koneksi TCP tetap terbuka?

95

Saya memiliki dua komponen yang berkomunikasi melalui TCP / IP. Komponen A bertindak sebagai server / pendengar dan Komponen B adalah klien. Keduanya harus berkomunikasi secepat mungkin. Hanya ada satu koneksi setiap saat (meskipun itu dikesampingkan untuk pertanyaan ini). Pengembang senior di perusahaan saya mengatakan bahwa saya perlu menggunakan detak jantung tingkat aplikasi antara dua komponen untuk memastikan koneksi tetap terbuka.

Saya pikir koneksi tetap terbuka dengan TCP / IP tetapi saya telah membaca sejumlah blog / situs yang mengatakan itu praktik standar yang cukup untuk detak jantung antara aplikasi ini.

Saya tahu sebagian alasan komponen A detak jantung komponen B adalah agar dapat menginformasikan dukungan jika ada masalah komunikasi dengan komponen B (baik tautan mati atau komponen B tidak berjalan). Apakah detak jantung diperlukan untuk alasan lain? Seperti untuk memastikan sering ada sesuatu "di dalam pipa" untuk membuatnya tetap terbuka?

Komponen A saat ini detak jantung komponen B setiap 20 detik dan menutup koneksi jika tidak ada yang diterima kembali dari komponen B dalam 120 detik. Kemudian melanjutkan mendengarkan koneksi dengan asumsi bahwa komponen B akan secara berkala mencoba menyambung kembali jika tautan rusak. Ini bekerja dengan sukses.

Untuk mengulangi pertanyaan saya: Apakah detak jantung diperlukan untuk menjaga koneksi TCP / IP tetap hidup?

Rob Gray
sumber
1
Mungkinkah perilaku ini juga bergantung pada implementasi? Apakah ini sesuatu yang ditentukan dalam standar TCP, atau dibiarkan sebagai detail implementasi? Semoga orang lain juga bisa menjawabnya.
dss539
1
Ini adalah detail implementasi yang akan saya katakan karena tidak semua protokol berbasis TCP / IP menerapkan seperti itu sepenuhnya terserah Anda.
Lloyd
5
Ya - bukan karena TCP / IP - tetapi karena perangkat keras atau perangkat lunak lain yang Anda sambungkan mungkin melalui seperti firewall dan 'router' rumah yang cenderung menjatuhkan koneksi TCP yang tidak aktif, terkait: stackoverflow.com/questions/3907537/…
markmnl

Jawaban:

55

Sambungan harus tetap terbuka, tetapi ya, sering kali umum untuk melihat protokol menerapkan detak jantung untuk membantu mendeteksi koneksi yang mati, IRC dengan perintah PING misalnya.

Lloyd
sumber
34
Alasan umum lainnya untuk keepalives adalah untuk menjaga koneksi tetap terbuka melalui gateway nat. Meskipun TCP sendiri tidak membutuhkan keepalives untuk beroperasi, itu umum untuk gateway nat untuk "melepaskan" koneksi tcp setelah batas waktu tertentu.
no
4
Apa itu batas waktu normal? detik, menit, jam?
MiniGod
@Lloyd Saya "berpikir" MiniGod berarti, "Berapa lama waktu tunggu normal ?" (jawaban yang diberikan dalam hitungan detik, menit, jam,…)
jeromej
@JeromeJ Siapa tahu, sudah beberapa tahun;)
Lloyd
Selain itu, jika koneksi Anda melalui proxy, Anda dapat mengharapkan koneksi Anda terputus jika dianggap basi. Saya tidak berpikir bahwa tetap hidup akan membantu dalam kasus ini, karena aspek tcp ini tidak menyebar ke aplikasi.
Ghita
50

Seperti yang telah dicatat oleh banyak orang lain, koneksi TCP akan tetap aktif jika dibiarkan ke perangkatnya sendiri. Namun, jika Anda memiliki perangkat di tengah koneksi yang melacak statusnya (seperti firewall), Anda mungkin memerlukan keepalives agar entri tabel status tidak kedaluwarsa.

Gerald Combs
sumber
Koneksi TCP akan mengatakan hidup selamanya?
pengguna7817808
23

Jika komponen Anda:

  • berada dalam jaringan kabel konvensional
  • tidak ada firewall atau router NAT di antara keduanya
  • tidak satupun dari mereka jatuh

maka Anda tidak perlu memiliki detak jantung.

Jika salah satu dari asumsi ini salah (saya melihat Anda, GPRS!), Detak jantung menjadi perlu agak cepat.

Eero Aaltonen
sumber
1
Ini adalah jaringan secara umum. Pertimbangkan Kekeliruan Komputasi Terdistribusi Peter Deutsch; kami tahu bahwa jaringan secara inheren tidak dapat diandalkan, sehingga harus diperlakukan sebagai titik kegagalan yang hampir pasti dalam aplikasi Anda. Dalam konteks ini, jaringan kabel konvensional atau tidak, asumsikan Anda akan mengalami kegagalan di beberapa titik dan desain aplikasi Anda untuk menangani skenario itu.
Steven Bakhtiari
11

Anda tidak perlu mengirimkan detak jantung sendiri. Koneksi TCP akan tetap terbuka terlepas dari penggunaan.

Perhatikan bahwa TCP mengimplementasikan mekanisme keepalive opsional , yang dapat digunakan untuk mengidentifikasi koneksi tertutup secara tepat waktu, daripada meminta Anda untuk mengirim data di kemudian hari dan hanya kemudian menemukan koneksi ditutup.

Brian Agnew
sumber
1
Bagaimana cara kerjanya di linux? apakah itu benar-benar berfungsi? dapatkah saya menjadwalkan waktu tunggu kurang dari 2 jam? misalnya 30 detik?
Itay Levin
Agar ini berfungsi, aplikasi perlu mendukung keepalive. Hanya mengaktifkannya di Linux tidak akan cukup.
Mike Vella
9

Jika Anda menggunakan windows, berhati-hatilah dengan TCP Keep-hidup. Secara default, ini dinonaktifkan kecuali jika Anda menyalakannya secara global dengan registri windows atau melalui setsockopt.

Interval tetap hidup default adalah 2 jam.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Anda mungkin perlu menerapkan detak jantung Anda sendiri dan menonaktifkan tetap-hidup TCP di windows jika keep-hidup 2 jam tidak diinginkan.

Andrew Keith
sumber
3

Apakah detak jantung diperlukan untuk menjaga koneksi TCP / IP tetap hidup?

Mereka berguna untuk mendeteksi ketika koneksi telah mati.

ChrisW
sumber
3

TCP akan menjaga koneksi tetap hidup. Detak jantung aplikasi adalah untuk pertimbangan tingkat aplikasi seperti failover, load balancing, atau memberi tahu administrator tentang potensi masalah.

bebek
sumber
3

Detak jantung adalah cara yang baik untuk memberi tahu server bahwa Anda masih hidup, maksud saya, jika server menggunakan sistem pencegahan serangan DoS, itu (server) dapat menghapus semua sumber daya yang dialokasikan untuk koneksi tertentu, setelah itu terdeteksi dalam aktivitas untuk jangka waktu tertentu.
Tidak ada mandat mereka untuk menerapkan mekanisme detak jantung apa pun.

Tapi bagus jika Anda mendesain aplikasi, di mana kriteria utamanya adalah responsif. Anda tidak akan suka membuang waktu untuk pengaturan koneksi, pencarian DNS, dan penemuan jalur. Di sana cukup pertahankan koneksi setiap saat, terus kirim detak jantung, dan aplikasi tahu koneksi itu hidup, dan pengaturan koneksi tidak diperlukan. Cukup kirim dan terima sederhana.

Vivek Sharma
sumber
2

TCP / IP sebagai protokol ditentukan sebagai tidak ditutup sampai Anda mengirim paket tutup. Saya memiliki soket yang tetap terbuka bahkan setelah koneksi nirkabel atau internet tidak stabil.

Namun, ini semua sangat bergantung pada implementasi. Kemungkinan besar akan ada "batas waktu" yang berarti jumlah waktu maksimum untuk menunggu tanggapan sebelum menganggap sambungan menjadi "mati". Terkadang ini didasarkan pada aplikasi itu sendiri, terkadang pada router NAT.

Oleh karena itu, saya sangat menyarankan Anda untuk tetap "detak jantung" untuk mendeteksi koneksi yang buruk dan membuatnya tetap terbuka.

Tidak diketahui
sumber
2

Pada dasarnya koneksi TCP membuat status tautan yang disimpan di sakelar bersama dengan rute. Untuk mendeteksi koneksi yang rusak (seperti ketika salah satu mitra crash (tanpa mengirimkan pemutusan yang tepat)), status ini harus dikeluarkan setelah periode tidak aktif. Dan ketika ini terjadi, koneksi TCP Anda telah ditutup. Meskipun saya tidak tahu persis berapa lama waktu tunggu ini, sepertinya mereka bergantung pada produsen perangkat dan / atau penyedia internet. Saya ingat sesi terminal SSH menganggur saya dengan cepat (kurang dari 15 menit waktu idle) ditutup oleh penyedia internet 1 & 1 saya sebelumnya sementara mereka tetap terbuka selama beberapa jam ketika menggunakan koneksi yang disediakan Kabel-BW ...

Akhirnya, saya menyimpulkan dengan pembicara saya sebelumnya: detak jantung adalah cara yang baik untuk mengetahui apakah koneksi masih hidup dan menendang ...

Mayday
sumber
1

Yang Anda sebut detak jantung berguna saat mencoba menyetel waktu tunggu. Soket Anda mungkin tampak terbuka, tetapi orang di sisi lain mungkin menderita BSOD. Salah satu cara termudah untuk mendeteksi klien / server yang tidak berfungsi adalah dengan mengatur waktu tunggu dan memastikan pesan sering diterima.

Beberapa orang menyebutnya NOOPs (No Ops).

Tapi tidak, mereka tidak perlu menjaga koneksi tetap hidup, hanya membantu untuk mengetahui apa statusnya.

Kekoa
sumber
1

Saya akan mengatakan bahwa jika Anda tidak memiliki detak jantung, tidak masalah apakah koneksi TCP / IP Anda terbuka atau tidak.

D. Patrick
sumber
1

Heartbeat bukanlah keharusan untuk protokol TCP. Implementasinya ada untuk mendeteksi apakah pihak lain telah menghentikan koneksi dengan cara yang tidak standar (yaitu tidak melalui proses penghancuran).

Bintang Gelap 1
sumber
0

Sambungan akan tetap terbuka - tidak perlu menerapkan detak jantung, dan sebagian besar aplikasi yang menggunakan soket tidak melakukannya.


sumber
-2

Banyak protokol yang menerapkan detak jantung atau jenis status kesehatan seperti yang dikatakan Lloyd. Sekadar info, koneksi masih terbuka dan jika Anda mungkin melewatkan sesuatu

ist_lion
sumber