需要帮助解决网络问题(客户端 TCP 连接卡在 FIN_WAIT_2 中)

需要帮助解决网络问题(客户端 TCP 连接卡在 FIN_WAIT_2 中)

(注意:我最初在“网络工程”方面提出了这个问题,但那里的主持人认为它“偏离主题”并告诉我在这里提问。)

我在 Fedora 18 Linux 机器上运行名为 ZoneMinder(版本 1.26.5)的视频监控服务器。ZoneMinder 具有基于 Web 的用户界面,并使用名为“zms”的 CGI 可执行文件通过 TCP 将 MJPEG 视频流传输到 Web 浏览器。问题是有时视频流连接无法正确终止;如果我正在查看视频流并关闭浏览器窗口,则底层 TCP 连接仍保持打开状态,服务器上的 zms 进程将继续通过网络发送视频帧。即使我终止 Windows 计算机上的所有浏览器实例(使用任务管理器验证),也会发生这种情况。我的预期是,一旦浏览器进程终止,Windows 应该立即关闭 TCP 连接,但由于某些未知原因,这种情况并不总是发生,Windows 会继续无限期地接受连接上的数据包。当出现此问题时,服务器上的 zms 进程仍将连接视为打开状态,并将继续传输视频,直到 Windows 计算机断电或 zms 进程被终止(手动,从命令 shell)。在审查监控事件时,积累十几个甚至更多的“僵尸”zms 进程并不罕见;如果我不通过 SSH 登录到 ZoneMinder 服务器机器并手动终止这些进程,它们将继续无限期运行,消耗磁盘和网络 I/O 带宽并拖慢系统的其余部分。

一旦处于失败状态,在 Windows 机器上运行 netstat 会显示 TCP 连接处于 FIN_WAIT_2 状态。Wireshark 捕获显示,即使不再有正在运行的进程接收该数据,Windows 机器仍在确认连接上的段。

我有 3 台 Windows 机器:一台台式机运行 Windows 7 Pro SP1,一台台式机运行 Win 7 Home Premium SP1,一台笔记本电脑运行 Win 7 Home Premium SP1。在这三台机器中,两台台式机间歇性地出现问题,而笔记本电脑从未出现问题。

我通常使用 Firefox 浏览器,但我也尝试过 Chrome。两者在笔记本电脑上都能 100% 运行,但在台式机上会间歇性地失败。在我尝试过的其他平台(例如 Linux 和 Android)上使用 Firefox 和 Chrome 时,从未出现过问题。

其中一台发生故障的 Windows 计算机与 ZoneMinder 服务器盒连接到同一个千兆交换机;始终正常工作的 Windows 笔记本电脑连接到 WiFi AP,并通过第二个千兆以太网交换机连接到 ZoneMinder 服务器。Android 设备从防火墙内部和外部连接均没有问题。

为了排除网络驱动程序问题的可能性,在其中一台台式机上,我尝试用英特尔网卡换掉 Realtek 网卡,但故障仍然出现。

我现在已经想不出什么办法了;我该如何进一步排除故障?如果有帮助的话,我可以提供 Wireshark 捕获(它们很大 - 大约 100MB - 所以我暂时不提供它们)。

感谢您的帮助!

答案1

TCP 状态FIN_WAIT_2表示应用程序已关闭,客户端已向服务器发送 FIN。服务器发送 ACK 并应通知应用程序服务器开始关闭。然后它应向客户端发送 FIN。您的客户端正在等待服务器发送其 FIN。

您的 Windows 计算机可能表现出以下行为TCP 烟囱卸载这会将一些 TCP 日常工作(例如确认数据和关闭连接)转移给 NIC。一旦应用程序关闭,NIC 将接管连接的最终关闭。这可能是您的机器即使浏览器已关闭仍继续确认数据的原因。

您可以尝试通过禁用 Windows 上的 TCP Chimney 来缓解此问题。说明如下这里

但是,这并没有解决服务器不发送 FIN 的根本原因。通过在客户端和服务器上捕获流量,您可以:

  1. 验证客户端确实发送了 FIN
  2. 验证服务器是否收到FIN
  3. 验证服务器是否发送 FIN
  4. 验证客户端是否收到FIN

很可能是其中一个步骤存在差距。如果所有步骤都完成,则问题出在客户端,可能是 TCP Chimney 卸载。

相关内容