İstemci bağlantısı kesildiğinde TCP bağlantısının açık kalması mümkün müdür?


12

Yaklaşık 4000 bağlantıda TCP tükenme sorunlarıyla karşı karşıya olan bir sunucu uygulamamız var. Bu, her 3 veya 4 haftada bir gerçekleşir (yaklaşık olarak). Bu sunucu uygulamasını oluşturan satıcı netstat -b çıktısını inceledikten sonra, istemciler düşmüş olsa bile bazı bağlantıların açık kaldığını bildirir.

Bana belirli bir istemci uygulamasının neden TCP bağlantısını düzgün kapatmıyor olduğunu araştırma görevi verildi. Ben bir istemci bilgisayar kapatılırsa, o istemci ile hala bir TCP bağlantısı kurulduğunu sunucudan OLASI rapor edemez inanıyorum. Ne yazık ki, görüşümü doğrulamak için herhangi bir bilgi bulamıyorum. Sorun bile olabileceğini düşünmediğim potansiyel bir sorunu araştırmak için daha fazla zaman harcamak istemiyorum.

TLDR;

Bir sunucu, kapalı bir bilgisayara kurulan bağlantıyı bildirebilir mi?

Yanıtlar:


13

TCP, veri ileten bir taraf dışında, ölü bir bağlantıyı tespit etmek için hiçbir çaba göstermez. Bunu yapmak için TCP yığınını çağıran uygulama kodunun sorumluluğundadır. Burada hangi protokol var? (TCP'nin üstündeki.)

Bu korkunç derecede çirkin bir "çözüm", ancak TCP saklayıcılarını etkinleştirebilirsiniz . Bu makalede daha fazlası var .


Muhtemelen katman ve onun katmanı, TCP'nin bulunduğu aktarım katmanının üstünde.
Rilindo

1
@Rilindo: Uygulamada ve bu özel durumda, TCP yığınını çağıran bir uygulamanız var. TCP'nin üstündeki protokol (HTTP, POP veya herhangi bir şey) genellikle bunun nasıl yapılacağını belirler, çünkü bu protokollerin tasarımcıları TCP'nin bunu yapamayacağını biliyordu.
David Schwartz

Hata! Benim hatam. Tabaka 7.
Rilindo

Bu noktada saklayıcıları etkinleştirmeyeceğim, ancak seçeneğin var olduğunu bilmek kullanışlı. Bu makale, 2 saatlik bir zaman aşımı olduğunu gösteriyor gibi görünüyor. AFAIK, bağlantılar gün / hafta açık tutuluyor.
Josh Smeaton

Büyük olasılıkla, saklama işlemleri etkin değildir. Bir kod parçası bunları etkinleştirmelidir. Kalıcıları bile etkinleştirmiyorsa ve zaman aşımı / hasat mekanizması yoksa uygulama sadece düz kırık gibi görünüyor. Hangi protokolden bahsediyoruz? (HTTP? SMTP? FTP?)
David Schwartz

8

Evet mümkün. David ve Paul'un yanıtlarında belirttiği gibi, TCP'de (isteğe bağlı olan TCP canlı tutma dışında) yarı açık bir bağlantı algılayacak bir mekanizma yoktur. Bağlantının durumunu belirlemek ve buna göre uygun işlemi yapmak uygulama satıcısına bağlıdır.

TCP söz konusu olduğunda, yarı açık bir bağlantı ile uzun bir boşta bağlantı arasında herhangi bir algılama veya ayrım yoktur.

Sorunun nerede ortaya çıktığını anlamak için OSI modelinin katman 1'den (fiziksel) katman 7'ye (uygulama) kadar sorun gidermeye başlamanız gerekir. Benim tavsiyem, sorun oluşana kadar etkilenen istemcilerden birine bir paket yakalama programı yüklemek ve çalıştırmak ve daha sonra istemcinin bağlantıyı kapatmamasına neyin neden olduğunu belirlemek için yakalamayı analiz etmek olacaktır.


3
Veya satıcıya makul zaman aşımlarını uygulamalarını sağlayın :)
Shane Madden

5

Bir iş istasyonu bir sunucu ile bağlantıyı kapatmak istediğinde TCP FIN gönderir. İstemci düzgün davranmıyorsa ve bağlantılarını kapatmıyorsa, aslında sunucuda yerleşik kalabilir. Bunları temizlemek için sunucudaki açık bağlantılar için zaman aşımı ayarlayabilirsiniz - bunun sebebini bulmak daha iyi olacaktır. Açık bağlantılar hangi limana geliyor? Hangi hizmete erişildiğini öğrendikten sonra, sunucuya isabet eden istemci uygulamasını tanımlayabilirsiniz.


Görünen problem olan müşteriyi biliyoruz. Yüzlerce kullanıcımızın her gün kullandığı bir masaüstü uygulamasıdır. Sorunun uygulama çökmesi, donanımdan sıfırlama veya bir son görev olduğunu varsayıyorum. Tüm bu durumlarda sunucunun bağlantı kesildi olsa farkında olacağını düşündüm.
Josh Smeaton

4
Sunucu söz konusu olduğunda, istemciden bir FIN veya RST almadığı sürece bağlantı açıktır. Bu olmadan, sunucu bağlantının hala kurulduğunu ancak istemcinin gönderecek hiçbir veri olmadığını varsayar. Yarı açık bir bağlantı ile boşta bir bağlantı arasında, sunucu açısından fark yoktur.
joeqwerty

@joeqwerty: Doğru, ancak sunucu olabilir süresiz bir bağlantı açık tutmak istemiyor karar ve bazı zaman aşımı / yakın mekanizmasını uygulamaya başladı. David Schwartz'ın "uygulama kodunun sorumluluğu budur" cevabında kastettiği budur. Yani sunucu olabilir bir yarı açık bağlantı ve isterse boş bağlantısı arasında bir fark yaratır. Ancak TCP için, yarı açık bağlantı ile boşta bağlantı arasında gerçekten bir fark yoktur.
sleske

@sleske: Uygulama kodunun bunu yapabileceğini kabul etti, ancak canlı tutma etkinleştirilmedikçe TCP yapamıyor.
joeqwerty
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.