2014-04-02 28 views
13

Próbuję zapewnić, że program usługi systemu Windows (działający na .NET) poprawnie zwalnia połączenia sieciowe.Połączenie TCP należące do pid zero

Podczas uruchamiania usługi lokalnie wiem, że utworzy on wiele połączeń HTTP z localhost na porcie 57300. Używam netstat do monitorowania, czy są one poprawnie zwalniane.

Zaskoczyło mnie, że wiele połączeń do tego portu jest własnością "Systemowego stanu bezczynności" (PID = 0).

netstat output

Tutaj widzimy, że tylko trzy z tych połączeń są własnością ich programu serwisowego (PID = 5012). Wszystkie inne są własnością PID 0.

Moje główne pytania to: Dlaczego tak się dzieje? i Czy muszę dbać?

Ale Chciałbym również wiedzieć:

  • Czy oznacza to, że program serwisowy nie zwolnić połączenie prawidłowo, czy też nie?

  • Czy takie połączenia zostaną ponownie wykorzystane w razie potrzeby?

  • Czy takie połączenie "zarezerwować gniazdo" w .NET ServicePointManager?

+1

Rozumiem, że po zamknięciu połączenia TCP przechodzi ono w stan TIME_WAIT na określony czas.Ma to na celu zapewnienie, że wszelkie pakiety związane z połączeniem, które wciąż mogą być umieszczane w kolejce w sieci, nie będą kolidować z nowymi połączeniami. Ponieważ musi to nastąpić, nawet jeśli pierwotny proces został zakończony, domyślam się, że system Windows automatycznie przenosi własność na proces systemowy. Uważam więc, że odpowiedzi na cztery ostatnie pytania to: nie, tak, nie i nie. –

+0

Dziękujemy! Dlaczego nie zamieścisz tego jako odpowiedzi? Czy wiesz, jak długo może być ten określony czas? –

+0

możliwy duplikat [procesu 0 używa mojego portu] (http://stackoverflow.com/questions/17543298/process-0-is-using-my-port) – CodeCaster

Odpowiedz

17

Po zamknięciu połączenia TCP przechodzi w stan TIME_WAIT na określony czas. Ma to na celu zapewnienie, że wszelkie pakiety związane z połączeniem, które wciąż mogą być umieszczane w kolejce w sieci, nie będą kolidować z nowymi połączeniami.

Ponieważ musi się to zdarzyć, nawet jeśli pierwotny proces został zakończony, domyślam się, że system Windows automatycznie przenosi własność na proces systemowy.

Tak, wierzę odpowiedzi na swoje ostatnie cztery pytania są:

  • Nie, chyba nie trzeba się o to martwić.

  • Tak, program serwisowy poprawnie wypuścił połączenie.

  • Połączenia TIME_WAIT zostaną zamknięte wcześniej if the system runs out of TCBs. W domyślnej konfiguracji stanie się to przed wyczerpaniem portów, więc w efekcie połączenia zostaną ponownie wykorzystane, jeśli będą potrzebne.

  • Nie znam menedżera punktu serwisowego, ale nie ma powodu, aby śledził połączenia w stanie TIME_WAIT, więc prawdopodobnie nie.

W systemie Windows XP: default value for the TIME_WAIT delay was two minutes. Nie mogę znaleźć bardziej aktualnych informacji, ale wydaje się prawdopodobne, że od tego czasu nie uległy one zmianie.