TCP bağlantısını açık tutmak için sinyal vermem gerekir mi?


96

TCP / IP üzerinden iletişim kuran iki bileşenim var. Bileşen A, bir sunucu / dinleyici görevi görür ve Bileşen B, istemcidir. İkili olabildiğince çabuk iletişim kurmalıdır. Herhangi bir zamanda yalnızca bir bağlantı olabilir (bu sorunun yanı sıra). Şirketimdeki kıdemli bir geliştirici, bağlantının açık kalmasını sağlamak için iki bileşen arasında uygulama düzeyinde sinyal kullanmam gerektiğini söyledi.

TCP / IP ile bağlantının açık kaldığını düşündüm, ancak bu uygulamalar arasında kalp atışı atmanın oldukça standart bir uygulama olduğunu söyleyen birkaç blog / site okudum.

Bileşen A'nın kalp atışı bileşen B'nin nedeninin bir kısmının, bileşen B ile iletişim sorunları varsa (bağlantı çalışmıyor veya bileşen B çalışmıyor) destek konusunda bilgi verebilmesi olduğunu biliyorum. Başka bir nedenle kalp atışlarına ihtiyaç var mı? Sık sık "boruda" onu açık tutmak için bir şey olmasını sağlamak gibi?

Bileşen A şu anda bileşen B bileşenini her 20 saniyede bir sinyal verir ve 120 saniye içinde bileşen B'den hiçbir şey geri alınmazsa bağlantıyı kapatır. Ardından, bağlantı koptuğunda bileşen B'nin periyodik olarak yeniden bağlanmayı deneyeceği varsayımı altında bağlantıları dinlemeye devam eder. Bu başarıyla çalışıyor.

Sorumu tekrarlamak gerekirse: TCP / IP bağlantısını canlı tutmak için sinyal gerekli midir?


1
Bu davranış aynı zamanda uygulamaya bağlı olabilir mi? Bu TCP standardında belirtilen bir şey mi yoksa uygulama ayrıntısı olarak mı bırakıldı? Umarım başka biri de buna cevap verebilir.
dss539

1
Bu, tüm TCP / IP tabanlı protokollerin tamamen size kalmış bir şekilde gerçekleştirmediğini söyleyebilirim.
Lloyd,

5
Evet - TCP / IP nedeniyle değil - ancak diğer donanım veya yazılımlar nedeniyle, bağlantınız, etkin olmayan TCP bağlantılarını bırakma eğiliminde olan güvenlik duvarları ve ev 'yönlendiricileri' gibi geçebilir, bunlarla ilgili: stackoverflow.com/questions/3907537/…
markmnl

Yanıtlar:


55

Bağlantı gerektiğini bakılmaksızın açık kalır ama evet o protokolleri ile ölü bağlantıları, IRC algılamak çok yardımcı olması için bir kalp atışı uygulamak görmek genelde yaygındır PING örneğin komuta.


34
Keepalives için diğer bir yaygın neden, bağlantıyı nat ağ geçitleri aracılığıyla açık tutmaktır. TCP'nin kendisinin çalışması için koruma programlarına ihtiyacı olmasa da, nat ağ geçitlerinin belirli bir zaman aşımından sonra bir tcp bağlantısını "bırakması" yaygındır.
no

4
Normal zaman aşımı nedir? saniye, dakika, saat?
MiniGod

@Lloyd "Sanırım" MiniGod, " Normal bir zaman aşımı ne kadar sürer ?" (saniye, dakika, saat,… cinsinden verilen cevap)
jeromej

Bilir @JeromeJ, birkaç yıl oldu;)
Lloyd

Ayrıca, bağlantınız bir proxy'den geçiyorsa, eski olduğu düşünülürse bağlantınızın kesilmesini bekleyebilirsiniz. Hayatta kalmanın bu durumda yardımcı olacağını sanmıyorum, çünkü tcp'nin bu yönü uygulamaya yayılmıyor.
Ghita

50

Diğerlerinin de belirttiği gibi, TCP bağlantısı kendi cihazlarına bırakılırsa yukarıda kalacaktır. Bununla birlikte, bağlantının ortasında durumunu izleyen bir aygıtınız varsa (bir güvenlik duvarı gibi), durum tablosu girişinin süresinin dolmasını önlemek için canlı yayınlara ihtiyacınız olabilir.


TCP bağlantısı sonsuza kadar canlı olduğunu söyleyecek mi?
user7817808

24

Bileşenleriniz:

  • geleneksel bir kablolu ağda
  • aralarında güvenlik duvarı veya NAT yönlendiricisi yok
  • hiçbiri çökmez

o zaman bir kalp atışına sahip olmanıza gerek yok.

Bu varsayımlardan herhangi biri yanlışsa (size bakıyorum, GPRS!), Çok hızlı bir şekilde kalp atışı gerekli hale gelir.


1
Yine de bu genel olarak ağdır. Peter Deutsch'un Dağıtık Hesaplama Yanılgılarını düşünün; Ağların doğası gereği güvenilmez olduğunu biliyoruz ve bu nedenle uygulamanızda neredeyse belirli bir başarısızlık noktası olarak değerlendirilmelidir. Bu bağlamda, geleneksel kablolu ağ olsun ya da olmasın, bir noktada hata yaşayacağınızı varsayın ve uygulamanızı bu senaryoyu işleyecek şekilde tasarlayın.
Steven Bakhtiari

11

Kalp atışı göndermenize gerek yok. TCP bağlantısı, kullanıma bakılmaksızın açık kalacaktır.

TCP'nin , daha sonraki bir tarihte veri göndermenizi ve ancak o zaman bağlantının kapalı olduğunu keşfetmenizi gerektirmek yerine, kapalı bir bağlantıyı zamanında tanımlamak için kullanılabilen isteğe bağlı bir canlı tutma mekanizması uyguladığını unutmayın .


1
Linux üzerinde nasıl çalışılır? işe yarıyor mu? Zaman aşımını 2 saatten az olacak şekilde planlayabilir miyim? örneğin 30 saniye?
Itay Levin

Bunun çalışması için uygulamanın canlı kalmayı desteklemesi gerekir. Sadece Linux'ta etkinleştirmek yeterli olmayacaktır.
Mike Vella

9

Windows kullanıyorsanız, TCP Canlı Tut konusunda dikkatli olun. Varsayılan olarak, Windows kayıt defteriyle veya setsockopt aracılığıyla global olarak açmadığınız sürece devre dışı bırakılır.

Varsayılan canlı tutma aralığı 2 saattir.

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

2 saatlik canlı tutma istenmiyorsa, kendi kalp atışınızı uygulamanız ve pencerelerde TCP canlı tutma özelliğini devre dışı bırakmanız gerekebilir.


3

TCP / IP bağlantısını canlı tutmak için sinyal gerekli midir?

Bir bağlantının ne zaman kesildiğini tespit etmek için kullanışlıdırlar.


3

TCP, bağlantıyı canlı tutacaktır. Uygulama sinyalleri, yük devretme, yük dengeleme veya yöneticileri olası sorunlara karşı uyarma gibi uygulama düzeyinde hususlar içindir.


3

Kalp atışı, sunucuya hayatta olduğunuzu söylemenin iyi bir yoludur; bu nedenle, sunucu DoS saldırı önleme sistemlerini kullanıyorsa, sunucu (sunucu), tespit edildikten sonra o bağlantı için tahsis edilen tüm kaynakları kaldırabilir. belirli bir süre boyunca faaliyette değil.
Herhangi bir kalp atışı mekanizmasını uygulama yetkileri yok.

Ancak, ana kriterin duyarlılık olduğu bir uygulama tasarlıyorsanız, bu iyidir. Bağlantı kurulumları, DNS aramaları ve yol keşifleriyle zaman kaybetmekten hoşlanmayacaksınız. Orada sadece bağlantıyı her zaman açık tutun, kalp atışları göndermeye devam edin ve uygulama bağlantının canlı olduğunu ve bağlantı kurulumunun gerekli olmadığını bilir. Sadece basit bir şekilde gönderin ve alın.


2

Bir protokol olarak TCP / IP, siz kapalı bir paket gönderene kadar kapatılmayacak olarak belirtilir. Sivilceli kablosuz veya internet bağlantım olsa bile soketlerim açık kaldı.

Ancak, bunların tümü uygulamalara çok bağlıdır. Büyük olasılıkla bir "zaman aşımı" olacaktır, bu da bağlantının "ölü" olduğunu düşünmeden önce bir yanıt için beklenecek maksimum süre anlamına gelir. Bazen bu, uygulamanın kendisine, bazen de NAT yönlendiricilerine bağlıdır.

Bu nedenle, kötü bağlantıları tespit etmek ve açık tutmak için bir "kalp atışı" tutmanızı şiddetle tavsiye ederim.


2

Temel olarak bir TCP bağlantısı, yol boyunca anahtarlarda depolanan bağlantı durumlarını oluşturur. Kesilen bağlantıları tespit etmek için (örneğin, bir karşı tarafın çökmesi (uygun bir bağlantı kesme göndermeden) gibi), bu durumların bir süre hareketsiz kaldıktan sonra tahliye edilmesi gerekir. Ve bu olduğunda, TCP bağlantınız kapatılmıştır. Bu zaman aşımlarının ne kadar uzun olduğunu tam olarak söyleyemesem de, cihaz üreticilerine ve / veya internet sağlayıcılarına bağlı görünüyorlar. Boşta kalan SSH terminal oturumlarımın, Kabel-BW tarafından sağlanan bir bağlantı kullanırken birkaç saat açık kalırken eski 1 & 1 internet sağlayıcım tarafından hızla (15 dakikadan az boşta kalma süresinden daha az) kapatıldığını hatırlıyorum ...

Son olarak, önceki konuşmacılarımla şu sonuca varıyorum: kalp atışı, bir bağlantının hala canlı olup olmadığını anlamanın iyi bir yoludur ...


1

Zaman aşımlarını ayarlamaya çalışırken kalp atışı dediğiniz şey yararlıdır. Soketiniz açık görünebilir, ancak diğer uçtaki kişi bir BSOD sorunu yaşıyor olabilir. Kullanılmayan istemcileri / sunucuları tespit etmenin en kolay yollarından biri, bir zaman aşımı ayarlamak ve sık sık bir mesajın alındığından emin olmaktır.

Bazı insanlar onlara HİÇBİR (Operasyon Yok) diyor.

Ama hayır, bağlantıyı canlı tutmak için gerekli değiller, sadece durumun ne olduğunu bilmeye yardımcı oluyorlar.


1

Kalp atışınız yoksa, TCP / IP bağlantınızın açık olup olmaması önemli değildir.


1

Kalp atışı, TCP protokolleri için bir gereklilik değildir. Uygulaması, diğer tarafın bağlantıyı standart olmayan bir şekilde sonlandırıp sonlandırmadığını (yani, koparma sürecinden geçip geçmediğini) tespit etmek için oradadır.


0

Bağlantı açık kalacaktır - bir kalp atışı uygulamaya gerek yoktur ve soket kullanan çoğu uygulama bunu yapmaz.


-2

Pek çok protokol, Lloyd'un dediği gibi bir kalp atışı veya sağlık durumu türü bir şey uygular. Sadece bağlantının hala açık olduğunu ve bir şeyi kaçırmış olabileceğinizi bilmeniz için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.