首页 > 解决方案 > 如何测试活动的 TCP 套接字是否还活着

问题描述

我们怀疑两台服务器之间的防火墙在没有通知服务器的情况下过早地断开了我们的 TCP 连接,我们想知道是否可以使用 PowerShell 这样做。我们知道,有时连接会断开,我们的应用程序会尝试使用它认为是活动的套接字,但在延迟一段时间后,它会关闭它并打开一个新的套接字,这会导致延迟。

为了大致了解,我们尝试将 to 的输出传递Get-NetTcpConnectionTest-Connection,但显然它不起作用。

是否可以使用 PowerShell 获取“已建立”连接列表并发送 PING 或任何测试请求以获取套接字的实际状态或查看它是否处于活动状态?

标签: powershellnetwork-programming

解决方案


首先,您计算机上的本地套接字不提供有关防火墙途中该连接状态的任何信息。此外,虽然您可以在本地枚举已建立的连接,然后对其进行探测,但这不会产生您正在寻找的结果。不仅Test-Connection不是正确的工具(它发送 ICMP 探针,而不是 TCP 探针,即在错误的层中运行),而且即使您使用Test-NetConnection(支持 TCP 探针)会建立连接,也不能重新使用您的应用程序正在使用。

本质上,检查防火墙上的连接状态的唯一方法是检查防火墙上的连接状态。

话虽如此,防火墙过早断开连接的最可能原因是防火墙和连接端点上的 TCP keepalive 设置不同,至少根据我的经验。Windows 的默认TCP keepalive 时间为 2 小时,而许多防火墙默认为较短的 keepalive 时间(如 30 分钟)。

可以在注册表中更改 Windows 系统的保活时间,例如通过导入具有以下内容的 .reg 文件(0x493e0 == 300000 ms == 6 分钟):

Windows 注册表编辑器版本 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"保持活动时间"=dword:000493e0



推荐阅读