欢迎大家
我正在寻找一些建议(完美的解决方案:)来解决我们长期面临的问题。
基本上:我们有一个位于 Windows Server 2012 上的客户端应用程序和一个位于 Windows 7 上的服务器应用程序。
场景如下:
- 客户端通过 TCP 连接服务器
- 服务器接受连接并发送欢迎消息
- 客户端发送带有一些数据的消息
- 服务器发送响应(确认已收到消息)
- 客户端关闭连接
注意:
- 客户端为每条新消息打开一个连接。我检查了 Wireshark 日志以及客户端/服务器日志,发现每个连接都已正确关闭。
- 即使我的应用程序没有以正确的方式处理连接,Windows 是否应该总是使用某种 ACK/RST 来应答连接请求?
问题:经过一段随机时间(可能是 30 分钟,甚至一两周),服务器应用程序停止发送响应。进一步调查(Wireshark 日志)显示,在某个时间点:
- 服务器应用程序没有响应“确认”消息(“场景”中的#4)。
- 服务器应用程序不响应来自客户端的FIN(可能是因为服务器应用程序没有主动关闭连接)
- 客户端在2分钟后发送RST(FIN超时)
- 服务器停止响应该端口上的任何 TCP 请求(没有 ACK/RST,任何东西......)
请参阅下面的截图: https://i.stack.imgur.com/kWC1x.png
答案1
目前还不清楚问题究竟出在哪里。是网络问题吗?是服务器应用程序问题吗?是服务器计算机/硬件/防火墙等问题吗?是客户端计算机问题吗?
需要进行一些故障排除才能知道在哪里查找。
以下是我要做的事情。当应用程序正常工作时,在服务器上打开管理命令提示符(右键单击,以管理员身份运行)。使用该命令netstat -abn | more
并查看内容。您将获得按协议和端口号排序的活动和监听网络连接列表。您应该能够识别正在监听相关端口的服务器应用程序,并且它应该显示可执行文件名称。如果建立了任何活动连接,您还将看到列出的那些“已建立”连接。现在您知道它在正常工作时是什么样子了。
现在,我还要添加 Telnet 客户端进行简单测试。Telnet 客户端是您可以添加的 Windows 功能。它非常适合测试简单的 TCP 连接。当一切正常时,在服务器上打开命令提示符并使用命令telnet localhost <port>
- 替换为您的应用程序侦听的端口号。您应该至少看到一个空白屏幕,表明连接成功。如果不成功,过一会儿您就会超时。显然,它不应该超时,否则肯定有什么东西阻塞了连接(即使客户端现在似乎正在工作)。
现在,当问题发生时,您可以同时使用 netstat 命令和 telnet 命令来帮助确定问题所在。首先,使用 netstat 确认应用程序仍在监听它应该监听的端口。如果不是,则问题出在您的应用程序中或它与操作系统的交互方式上。
如果应用程序仍在正常监听,则可以使用本地主机和远程 Windows 计算机的 telnet 来查看连接被阻止的位置。例如,如果您可以成功地通过 telnet 连接到服务器上的本地主机,则说明应用程序和网络堆栈运行良好,并且服务器或网络上的某些东西阻止了连接(防火墙、安全软件等)。您也可以尝试telnet <local ip> <port>
而不是使用localhost
。如果一个有效而另一个无效,则表明服务器上的某些东西阻止了连接,或者监听器配置可能不正确。
我会留意安装在服务器或客户端上的安全软件。尤其是像 McAfee 或 Norton 这样的“重型”软件。这些产品是许多希望和梦想破灭的原因。不要只是禁用它们并将它们从列表中删除。卸载它们 - 这是唯一可以确保安全的方法,即使这样,有时它们也会破坏系统并需要更多的清理工作。
如果不进一步深入了解您的网络基础设施和服务器/应用程序,就无法给出进一步的答案。一切都在于排除故障和消除问题所在。