powershell - 如何测试活动的 TCP 套接字是否还活着
问题描述
我们怀疑两台服务器之间的防火墙在没有通知服务器的情况下过早地断开了我们的 TCP 连接,我们想知道是否可以使用 PowerShell 这样做。我们知道,有时连接会断开,我们的应用程序会尝试使用它认为是活动的套接字,但在延迟一段时间后,它会关闭它并打开一个新的套接字,这会导致延迟。
为了大致了解,我们尝试将 to 的输出传递Get-NetTcpConnection
给Test-Connection
,但显然它不起作用。
是否可以使用 PowerShell 获取“已建立”连接列表并发送 PING 或任何测试请求以获取套接字的实际状态或查看它是否处于活动状态?
解决方案
首先,您计算机上的本地套接字不提供有关防火墙途中该连接状态的任何信息。此外,虽然您可以在本地枚举已建立的连接,然后对其进行探测,但这不会产生您正在寻找的结果。不仅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
推荐阅读
- visual-studio - 在 Visual Studio 中构建解决方案后“/”应用程序中的服务器错误
- javascript - 如何在nodejs中将请求文件转换为base64字符串
- javascript - 为什么我不能将纹理加载到材质中?
- python - return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args) PermissionError: [WinError 5] Access is denied
- powershell - 静默安装软件的 Power shell 脚本
- angular - 未找到模块:错误:包路径 ./index 未从包 node_modules/rxjs 导出(请参阅 /node_modules/rxjs/package.json 中的导出字段)
- python - Python Regex:如何在两个模式之间选择行
- r - 如何在保持其余数据完整的同时将 unnest_tokens 应用于数据框(Tibble)?
- javascript - 在 2D 画布 js 上移动 3D 空间中的对象
- vue.js - Vue Antd 无法更改 ant-input-suffix 样式