【问题标题】:TcpListener stops accepting or accepts broken connectionsTcpListener 停止接受或接受断开的连接
【发布时间】:2011-05-12 12:57:04
【问题描述】:

我们目前在 Windows 上运行的自行编写的服务器应用程序遇到问题(出现在不同版本上)。服务器侦听 TCP 端口,接受连接,交换一些数据,然后再次关闭连接。大约有 100 个客户端不时连接。

有时服务器停止工作:日志文件显示连接仍然​​被接受,但在第一次读取尝试时发生套接字错误(10054 - 对等连接重置)。我认为这不是客户问题,因为它突然停止对所有客户工作。

现在我们发现,同样的问题出现在我们的旧服务器软件上,甚至是用另一种编程语言编写的。所以这似乎不是我们程序中的错误——我认为它一定是某种操作系统/防火墙问题?当然,防火墙已经停用,这还没有解决问题。

有什么想法可以研究吗? Wireshark 日志将很快跟进..

日志摘录(时间戳、线程 ID、消息)

11:37:56.137 T#3960 Connection from 10.21.13.3
11:37:56.138 T#3960 Client Exception: Socket Error # 10054
Connection reset by peer.
11:37:56.138 T#3960 ClientDisconnected
11:38:00.294 T#4144 Connection from 10.21.13.3

您可以看到异常几乎在连接被接受的同时发生,在这种情况下客户端会在几秒钟后重新连接。

【问题讨论】:

  • 我认为这是 Windows,对吗?您在此服务器上运行什么应用程序?是否使用 TCP keepalives?
  • 这个问题至少出现在windows 2000和windows 2008r2上,应用是自写的。谢谢,我将此信息添加到问题中。
  • 你看过这篇msdn文章吗? Windows Socket Error Codes 值得从客户端和服务器端进行调查。你熟悉wireshark吗?
  • MSDN 说它可能是客户端(它是第三方硬件),或者 TCP 保持连接超时(这不太可能在连接被接受的同一时刻发生?)。我知道wireshark,但我们目前不能在客户那里使用它——在我们的测试环境中,一切都按预期工作。
  • 我认为假设两种不同语言的实现可以消除服务器代码的错误可能是错误的,特别是如果第一个实现是对第二个实现的引用。此外,您的实验室测试是否会产生重叠的并行连接?实验室拓扑和生产设置有何不同?

标签: tcp serversocket


【解决方案1】:

“状态”防火墙或 NAT 会跟踪连接,并且应该为它不知道的连接发送 RST。如果防火墙由于某种原因失去了对连接的跟踪,那么您可能会看到随机连接被重置。

我们的路由器在工作时会这样做——当 PPP 连接中断时,它会忘记连接,这在下雨并且 DSL 重启需要太长时间时非常无用。但是,它不会重置连接,而是丢弃数据包(更无用!)。

【讨论】:

  • +1 表示记录的 RST 可能来自网络基础设施而不是硬件本身
【解决方案2】:

听起来像是防火墙或路由问题 - 过时的连接可能会在超时后断开。您是否在协议中使用 ping/keepalive。
否则你可能会问 Wireshark 看看发生了什么。

【讨论】:

  • 嘿,连接在接受后立即访问(读取),所以它可能与超时无关。我们询问了 Wireshark,但我们可能不得不再试一次......
【解决方案3】:

首先,感谢您提供的许多提示 - 恐怕问题是完全不同的问题,您可能无法通过阅读我的问题来解决。

服务器应用程序使用 log4net,配置了一个 ImmediateFlush = true 的日志文件。如果每个日志语句都直接写入文件并且发生多个套接字连接,这会减慢整个应用程序的速度。 服务器需要大约一分钟才能真正接受连接。这远远超过客户端的超时。所以在日志中只显示“已接受”,然后是“断开连接” - 甚至日志也被延迟了!

很抱歉给您带来不便...

【讨论】:

    【解决方案4】:

    您是否尝试过更改积压,然后查看在此问题发生之前服务了多少时间或多少客户

    【讨论】:

    • 积压只会阻止接受前连接的队列进一步增长。不过,我们在已接受的连接方面存在问题。
    【解决方案5】:

    您没有说明您为服务器使用的 Windows 版本,但您应该知道 Windows TCP/IP 堆栈在服务器和客户端操作系统中的行为不同。客户端操作系统允许同时传入的连接数是有限制的,而且比您预期的要少得多。

    【讨论】:

    • 事实上,我们在 Windows 2k 上遇到了问题,这些问题在迁移到 XP 后就消失了。但是我们也有工作的 Win2k 机器,现在问题出现在 Win2008R2..
    【解决方案6】:

    从客户端看日志是什么样的?

    由于错误表明客户端正在断开连接;如果您在客户端看到相同的错误,那么它是正在断开连接的防火墙或代理(双方都看到对方断开连接表示代理/防火墙)。

    如果客户端不存在错误;那么我会说您的客户端是您将看到实际错误的地方。

    【讨论】:

    • 不幸的是,客户端是串行到 TCP 包装器硬件 - 所以实际的客户端只能看到一个串行端口,尤其是为什么连接被关闭。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多