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?
źródło
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.
źródło
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.
źródło