Jak zabić połączenia Windows Zombie TCP?

11

Korzystam z linku beyondtv na XP, łącząc się z hostem vista pozayondtv. Program Link zawiesza się po około 20 minutach i nie mam na to poprawki. Gdy tak się dzieje, używając tcpview, widzę, że z połączenia Link pozostało około 200 połączeń tcp zombie. Nie mogę ich usunąć, pochodzą z tego samego nieistniejącego procesu. Połączenia zawieszają się, dopóki nie uruchomię ponownie hosta. Ponowne uruchomienie to jedyny sposób, w jaki udało mi się ponownie połączyć poza Link TV. Myślę, że przyczyną tego jest błąd wyondtv, ale nie mogę uzyskać odpowiedzi na ich forach. W każdym razie chciałbym wiedzieć, czy istnieje sposób na zabicie wszystkich tych połączeń.

Edycja: w rzeczywistości około 3000 połączeń WAIT_CLOSE kumuluje się po około 40 minutach i mniej więcej wtedy klient umiera. Jeśli zamknę aplikację serwera, wszystkie te gniazda będą teraz pokazywane jako posiadane przez proces -non-existent-process w tcpview. Zrozumiale. Ale czy nie ma sposobu na ich zamknięcie bez ponownego uruchamiania?

Paweł
źródło
Czy nie ma tutaj sposobu na rozpoczęcie nagrody za pytania? Nie widzę w tym przycisku.
P aul
możesz zaoferować nagrodę po tym, jak pytanie zostało zadane przez 2 dni: superuser.com/faq
quack quixote
3
Ogień. Ogień lub strzelba.
Phoshi,
1
@ phoshi: lub nuke to z orbity. to jedyny sposób, aby się upewnić.
quack quixote
1
Wolę zabijać w sposób
losowy

Odpowiedzi:

10

Możesz używać Currports Nirsoft do monitorowania i zabijania połączeń.

Możesz zautomatyzować zabijanie wzorca połączenia za pomocą AutoHotKey.

majkinetor
źródło
7

CLOSE_WAIT oznacza, że ​​połączenie zostało zamknięte na drugim końcu.

Oczywiście, beyondtv nie wykrywa tego stanu i nadal wysyła dane do aplikacji na drugim końcu. Drugi koniec nie może wysłać niczego z powrotem przez to połączenie, ponieważ zamknął swój koniec połączenia.

Rozwiązaniem jest ustawienie wpisu TcpTimedWaitDelay w

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters

Ten wpis określa czas, jaki musi upłynąć, zanim TCP może zwolnić zamknięte połączenie i ponownie wykorzystać swoje zasoby. Ten odstęp między zamknięciem a zwolnieniem jest znany jako stan TIME_WAIT lub 2MSL. W tym czasie połączenie może zostać ponownie otwarte kosztem klienta i serwera znacznie mniejszym kosztem niż ustanowienie nowego połączenia.

Domyślnie na moim komputerze zawiera ona wartość -1, co rozumiem przez to, że zamknięte połączenia nigdy nie są zwalniane, co dokładnie obserwujesz.

Sugeruję, aby ustawić wartość tego wpisu w dozwolonym zakresie 30–300 sekund. Podejrzewam, że 300 sekund = 5 minut jest całkowicie wystarczające dla twojego przypadku, gdzie zamrożenie twojego komputera zajmuje 40 minut.

harrymc
źródło
Wyszukiwanie TIME_WAITprzywiodło mnie tutaj. Dzięki za wyjaśnienie i link.
Technext,
cześć, dzięki za wyjaśnienie. Nadal nie zamyka połączeń TCP. CLOSE_WAIT rośnie.
Ustawiłem
1

Możesz być w stanie zmusić system Windows do wymuszenia zamknięcia wszystkich połączeń TCP przez 1) wyłączenie , a następnie 2) ponowne włączenie interfejsu sieciowego. Jeśli to zadziała, możesz w skrypcie wsadowym wykonać kroki, które należy wykonać w razie potrzeby.

Szukałem jakiegoś sposobu, aby to zrobić za pomocą wiersza polecenia, z netshnarzędzia (lub podobnego), ale jak dotąd nie miałem szczęścia.

Oczywiście najlepszym sposobem na to jest naprawienie uszkodzonej aplikacji. Upewnij się, że próbujesz najnowszej wersji aplikacji; wkurzaj programistów; jeśli masz już najnowszą wersję, spróbuj zlokalizować starszą wersję programu.

quack quixote
źródło
Zaktualizowałem aplikację do najnowszej wersji, nie pomogłem i mam przy sobie bilet pomocy technicznej. Próbowałem wyłączyć we właściwościach sieci, a także odinstalowałem w menedżerze urządzeń, ale lista połączeń WAIT_CLOSE pozostała niezmieniona. To jest lista gdzieś w systemie operacyjnym, której nie mogę jej dotknąć.
Paul
1

Prawdopodobnie otrzymujesz te sesje CLOSE_WAIT z powodu zawieszenia programu - nie wiem, czy podejrzewasz je jako przyczynę, więc chciałem to wyjaśnić.

Domyślam się, że nie będą się kręcić wiecznie; prawdopodobnie tylko przez 2 godziny i 5 sekund. Wiem, że to może trwać wieczność. Możesz spróbować dostroić KeepAliveTime (prawdopodobnie wymaga ostatniego ponownego uruchomienia) dla połączenia sieciowego w dół do czegoś małego, na przykład 5 minut. Może to pomóc im szybciej zniknąć po zawieszeniu się programu.

Lub jeśli wiesz, że możesz uruchomić program niezawodnie przez, powiedzmy, 10 minut na raz, możesz go okresowo ponownie uruchamiać. Nie wiem, czy którekolwiek z tych rozwiązań są przydatne w konkretnej sytuacji; Zgadzam się z ~ szarlatanem, że należy jak najszybciej porzucić problematyczną wersję aplikacji.

Zac Thompson
źródło
myślę, że program może przesłonić ustawienie systemowe parametru KeepAliveTime, więc może nie pomóc, ale zgadzam się, że warto spróbować. poprawianie może jednak prowadzić do problemów z innymi aplikacjami.
quack quixote
0

Sprawdź, czy beyondtv uruchamia inny proces, który utrzymuje połączenia otwarte. Process Explorer pokaże Ci, czy tak się dzieje.

Joe Internet
źródło
Nie mogę znaleźć żadnych dodatkowych procesów. Zamykanie poza telewizją i wszystkie powiązane z nią procesy nie mają wpływu. Połączenia te pojawiają się z <nieistniejącym> dla procesu. Proces zakończył się, ale połączenia się nie zamykają.
P aul
Bawiłem się przyciskami podwyższania / zmniejszania oceny odpowiedzi i nie ma możliwości powrotu do 0, jest to -1 lub 1, więc zostawiłem ją na 1. Lepiej byłoby mieć to pytanie z 0 odpowiedziami od tego momentu, ponieważ ta odpowiedź nie jest pomocna - przed opublikowaniem tego pytania korzystałem przez jakiś czas z eksploratora procesów i programu tcpview.
P aul
0

Czy to możliwe, że występuje problem z zaporą? Próbowanie i ponawianie połączenia może być niekompletne.

Wyłączyłbym wszystkie zapory ogniowe na obu komputerach, a jeśli jest router, również jego zapora wewnętrzna.

harrymc
źródło
Zrobiłem to również wcześniej. Przeprowadź scenariusz ponownie, bez efektu, problem pozostanie. Patrzę jednak na router Linksys, ale to zbadam.
P aul