TCP连接由pid为零拥有

22

我正在试图确保一个运行在.NET框架上的Windows服务程序正确释放其网络连接。

当本地运行服务时,我知道它将创建大量localost端口57300的HTTP连接。我使用netstat监视它们是否被正确释放。

令我惊讶的是,许多对此端口的连接由“系统空闲进程”(PID=0)拥有。

netstat output

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

我的主要问题是:为什么会发生这种情况?以及我需要关心吗?

但我也想知道:

  • 这是否意味着服务程序已经正确释放了连接?

  • 如果需要,这样的连接是否会被重用?

  • 这样的连接是否“保留了一個區段”在.NET的ServicePointManager中?


1
我的理解是,在TCP连接关闭后,它会进入TIME_WAIT状态一段固定的时间。这是为了确保网络中可能仍然排队等待的与该连接相关的任何数据包不会干扰新的连接。由于即使原始进程已退出,这个过程也必须发生,我猜想Windows会自动将所有权转移到系统进程上。所以,我相信你最后四个问题的答案分别是否、是、否和否。 - Harry Johnston
谢谢!为什么不把那个作为答案发布呢?另外,你知道那个固定时间段可能有多长吗? - Mårten Wikström
可能是重复的问题:进程0正在使用我的端口 - CodeCaster
1个回答

27

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

由于即使原始进程已退出也必须执行此操作,我猜想 Windows 会自动将所有权转移给系统进程。

因此,我认为对你最后四个问题的答案是:

  • 不需要过多担心。

  • 是,服务程序已正确释放连接。

  • 如果系统的 TCB(传输控制块)用完,则会尽早关闭 TIME_WAIT 连接在默认配置中,这将在端口用完之前发生,因此,实际上,如果需要,连接将被重用。

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

在 Windows XP 上,TIME_WAIT 延迟的默认值为两分钟。我找不到更近期的信息,但它似乎自那时以来没有改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接