我正在努力确保Windows服务程序(在.NET之上运行)正确释放其网络连接。
在本地运行服务时,我知道它将在端口57300上创建大量到localhost的HTTP连接。我正在使用netstat
监视它们是否正确发布。
我很惊讶地看到这个端口的许多连接都归“系统空闲进程”所有(PID = 0)。
在这里我们可以看到服务程序只拥有其中三个连接(PID = 5012)。所有其他人都归PID 0所有。
我的主要问题是:为什么会这样?和我需要关心吗?
但我也想知道:
这是否意味着服务程序确实正确地释放了连接?
如果需要,是否可以重复使用此类连接?
在.NET ServicePointManager中执行此类连接“预留插槽”吗?
答案 0 :(得分:19)
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。我找不到更多最近的信息,但似乎从那以后它没有被改变。