2014-04-02 41 views
13

我试图确保Windows服务程序(运行在.NET之上)正确地释放其网络连接。由pid零拥有的TCP连接

在本地运行服务时,我知道它会在端口57300上创建大量的HTTP连接到本地主机。我使用netstat来监视它们是否正确释放。

我很惊讶地发现许多到这个端口的连接都属于“系统空闲进程”(PID = 0)。

netstat output

在这里我们可以看到,只有三个这些连接是由服务程序(PID = 5012)所拥有。所有其他人都拥有PID 0.

我的主要问题是:这是为什么发生?我需要关心吗?

但我也想知道:

  • 这是否意味着该服务方案并正确地释放连接,或不?

  • 如果需要,可以重复使用这种连接吗?

  • 在.NET ServicePointManager中做这样的连接“预留插槽”吗?

+1

我的理解是,TCP连接关闭后,它会进入TIME_WAIT状态一段固定的时间。这是为了确保与可能仍在网络中排队的连接有关的任何数据包不会干扰新的连接。由于即使原始进程已经退出也必须发生这种情况,所以我猜测Windows会自动将所有权转移给系统进程。所以,我相信你最后四个问题的答案分别是否,是,不是。 –

+0

谢谢!你为什么不把它作为答案发布?另外,你知道这个固定时间段可能有多长时间吗? –

+0

[进程0正在使用我的端口]的可能重复(http://stackoverflow.com/questions/17543298/process-0-is-using-my-port) – CodeCaster

回答

17

TCP连接关闭后,它会进入TIME_WAIT状态一段固定的时间。这是为了确保与可能仍在网络中排队的连接有关的任何数据包不会干扰新的连接。

因为即使原来的进程已经退出也必须发生,所以我猜测Windows会自动将所有权转移给系统进程。

所以,我相信答案你的最后四个问题是:

  • 不,你也许并不需要担心这个。

  • 是的,服务程序正确地释放了连接。

  • TIME_WAIT连接将提前关闭if the system runs out of TCBs。在缺省配置中,这会在您耗尽端口之前发生,因此实际上,如果需要,连接将被重用。

  • 我不熟悉服务点管理器,但没有理由跟踪TIME_WAIT状态下的连接,所以可能不会。

在Windows XP上,default value for the TIME_WAIT delay was two minutes。我找不到更新的信息,但似乎从那时起它一直没有变化。