Czy połączenie TCP może pozostać otwarte po rozłączeniu klienta?

12

Mamy aplikację serwera, która napotyka problemy z wyczerpaniem protokołu TCP przy około 4000 połączeń. Będzie się to odbywać co 3 lub 4 tygodnie (około). Sprzedawca, który utworzył tę aplikację serwerową, po zbadaniu danych wyjściowych programu netstat -b informuje nas, że niektóre połączenia pozostają otwarte, nawet jeśli klienci odpadli.

Zadanie polegało na zbadaniu, dlaczego konkretna aplikacja kliencka nie zamyka poprawnie połączenia TCP. Jestem przekonany, że jeśli komputer kliencki zostanie zamknięty, nie będzie MOŻLIWE zgłaszać z serwera, że ​​połączenie TCP nadal jest ustanawiane z tym klientem. Niestety nie mogę znaleźć żadnych informacji, które mogłyby potwierdzić mój pogląd. Nie chcę tracić więcej czasu na badanie potencjalnego problemu, który moim zdaniem nie może nawet stanowić problemu.

tldr;

Czy serwer może zgłosić nawiązane połączenie z wyłączonym komputerem?

Josh Smeaton
źródło

Odpowiedzi:

13

TCP nie próbuje wykryć niedziałającego połączenia, z wyjątkiem strony, która przesyła dane. W tym celu do kodu aplikacji należy wywołanie stosu TCP. Jaki protokół tu jest zaangażowany? (Ten na górze TCP.)

To przerażająco brzydkie „rozwiązanie”, ale możesz włączyć utrzymanie TCP . W tym artykule jest więcej .

David Schwartz
źródło
Prawdopodobnie chodziło Ci o warstwę i warstwę sesji na wierzchu warstwy transportowej, w której rezyduje TCP.
Rilindo,
1
@Rilindo: W praktyce, w tym konkretnym przypadku, masz aplikację wywołującą stos TCP. Protokół na TCP (HTTP, POP lub cokolwiek innego) zazwyczaj określa, jak to zrobić, ponieważ projektanci tych protokołów wiedzieli, że TCP nie mógłby tego zrobić sam.
David Schwartz,
Ups, mój błąd. Zatem jego warstwa 7.
Rilindo,
W tej chwili nie zamierzam włączać podtrzymań, ale warto wiedzieć, że istnieje taka opcja. Ten artykuł wydaje się sugerować, że istnieje już 2-godzinna przerwa. AFAIK, połączenia są otwarte przez kilka dni / tygodni.
Josh Smeaton,
Najprawdopodobniej Keepalives nie są włączone. Niektóre fragmenty kodu muszą je włączyć. Wygląda na to, że aplikacja jest po prostu zepsuta, jeśli nawet nie umożliwia podtrzymywania aktywności i nie ma mechanizmu limitu czasu / zbierania. O jakim protokole mówimy? (HTTP? SMTP? FTP?)
David Schwartz
8

Tak to mozliwe. Jak stwierdzili David i Paul w swoich odpowiedziach, w TCP nie ma żadnego mechanizmu (oprócz utrzymywania aktywności TCP, które są opcjonalne), aby wykryć połączenie częściowo otwarte. Dostawca aplikacji musi określić stan połączenia i odpowiednio podjąć odpowiednie działania.

Jeśli chodzi o TCP, nie ma wykrycia ani rozróżnienia między połączeniem półotwartym a długim połączeniem bezczynnym.

Będziesz musiał rozpocząć rozwiązywanie problemu od warstwy 1 (fizycznej) modelu OSI do warstwy 7 (aplikacji), aby dowiedzieć się, gdzie występuje problem. Radzę zainstalować i uruchomić program do przechwytywania pakietów na jednym z klientów, których dotyczy problem, a następnie przeanalizować przechwytywanie, aby ustalić, co powoduje, że klient nie zamyka połączenia.

joeqwerty
źródło
3
Lub poproś sprzedawcę o wprowadzenie rozsądnych limitów czasu :)
Shane Madden
5

Gdy stacja robocza chce zamknąć połączenie z serwerem, wysyła protokół TCP FIN. Jeśli klient nie zachowuje się prawidłowo i nie zamyka swoich połączeń, może faktycznie pozostać ustanowiony na serwerze. Możesz ustawić limity czasu dla otwartych połączeń na serwerze, aby je wyczyścić - chociaż lepiej byłoby znaleźć przyczynę. Do jakiego portu przychodzą otwarte połączenia? Gdy dowiesz się, do jakiej usługi jest uzyskiwany dostęp, możesz być w stanie zidentyfikować aplikację kliencką, która trafia na serwer.

Paul Ackerman
źródło
Wiemy, że klient jest pozornym problemem. Jest to aplikacja komputerowa, z której codziennie korzystają setki naszych użytkowników. Zakładam, że problemem jest awaria aplikacji, twardy reset lub zadanie końcowe. Pomyślałem jednak, że we wszystkich tych sytuacjach serwer będzie wiedział o przerwanym połączeniu.
Josh Smeaton,
4
Jeśli chodzi o serwer, połączenie jest otwarte, chyba że otrzyma FIN lub RST od klienta. Bez tego serwer zakłada, że ​​połączenie jest nadal ustanawiane, ale klient nie ma danych do wysłania. Jeśli chodzi o serwer, nie ma różnicy między połączeniem półotwartym a połączeniem bezczynnym.
joeqwerty
@joeqwerty: Prawda, jednak serwer może zdecydować, że nie chce otwierać połączenia na czas nieokreślony, i może wdrożyć jakiś mechanizm przekroczenia limitu czasu / zamknięcia. Właśnie to miał na myśli David Schwartz w swojej odpowiedzi „odpowiedzialność za kod aplikacji”. Tak więc serwer może zrobić różnicę między połączeniem półotwartym a połączeniem bezczynnym, jeśli chce. Jednak w przypadku TCP nie ma żadnej różnicy między połączeniem półotwartym a połączeniem bezczynnym.
sleske,
@sleske: Zgodził się, że kod aplikacji może to zrobić, ale TCP nie może, dopóki nie zostanie włączone utrzymywanie aktywności.
joeqwerty