![为什么 Windows 上的 netstat 显示超过 24 小时的连接?](https://linux22.com/image/1285243/%E4%B8%BA%E4%BB%80%E4%B9%88%20Windows%20%E4%B8%8A%E7%9A%84%20netstat%20%E6%98%BE%E7%A4%BA%E8%B6%85%E8%BF%87%2024%20%E5%B0%8F%E6%97%B6%E7%9A%84%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我收到与服务器端口耗尽相关的错误(“通常只允许使用每个套接字地址(协议/网络地址/端口)一次”)。
因此,我用 netstat -n 检查,它列出了大约 84000 个连接。
根据本地端口以及外部 IP 地址是我自己的事实,我可以看到其中 3654 个与运行在同一台服务器上的程序有关,而我在 24 小时前(实际上是昨天早上)就关闭了该程序。它们都处于 TIME_WAIT 状态,位于 49165 和 65533 之间的外部端口上。至少有一些相同的外部端口号也显示为本地端口,例如:
TCP <my_ip>:14046 <my_ip>:49165 TIME_WAIT
...
TCP <my_ip>:49165 <other_ip>:80 TIME_WAIT
14046 是我服务器上的一个程序监听的端口,我昨天终止的程序曾经反复连接到该端口。host <other_ip>
在 时给了我一些信息compute-1.amazonaws.com
,但我不认识 IP。我无法从浏览器中获取任何信息。因此,我无法弄清楚该机器上的什么会连接到 上的端口 80,但最近在同一台机器上运行了各种使用 Web 服务的东西,所以我猜这可能是其中一个的重定向或类似的东西。
间隔超过 4 分钟的 netstat 单独运行表明两个连接都保留在列表中。
这是预料之中的吗?我以为套接字应该在 4 分钟左右后最终关闭,但 netstat 通常会列出它们更长时间吗?这些端口真的被占用了吗?如果是,我可以做些什么来释放它们?最好不要重启,但如果必须的话,那我就不得不这么做。
操作系统是 Windows Server Enterprise,在 Rackspace VM 上运行。
[编辑:嗯,我应该在 serverfault 上询问这个问题吗?]
[另一项修改:重启似乎可以解决问题。所有旧连接都消失了,并且相同类型的新连接也如预期的那样在几分钟内消失。因此我猜网络堆栈不知何故进入了故障状态。]
答案1
请看一下微软的以下文章:避免 TCP/IP 端口耗尽。
其中一条建议是检查注册表设置中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下的 TcpTimedWaitDelay 项。该条目控制“连接关闭时保持 TIME_WAIT 状态的时间长度”。也许你得到的值很长……默认值是 240 秒。
此外,您可能需要检查是否可以跟踪并查看哪些进程导致 TIME_WAIT 连接,并查看其中是否有配置设置可以更快地关闭端口。