1

我有一个运行良好几年的 C# 应用程序。它通过 TCP/IP 套接字连接到向我发送股票交易执行的机器。

最近,我尝试将它部署到位于硬件防火墙后面的新数据中心的一些机器上,我开始看到一些奇怪的断开连接。

当发生断开连接时,在我的应用程序(客户端)中,除了我停止通过套接字接收数据外,我没有看到任何异常。当我在调试器中停止它时,Wireshark 确认没有数据到达套接字,并且我的应用程序的接收线程在 Receive() 调用上阻塞。套接字在 netstat 中显示为 ESTABLISHED。

但从服务器端来看,我的客户端似乎正在断开连接。查看他们的日志,看起来他们末端的套接字通常以 (nRecvd=-1,errno=104) 或 (nRecvd=0,errno=11) 结尾。(104 是对等方重置连接)。

断开连接似乎仅在一段时间不活动后发生。我现在已经通过在我的客户端和他们的服务器之间实现心跳来解决这个问题,该心跳每 20 秒发送一条短消息并得到回复。这导致过去几天的断开连接数降至 0。

起初,我认为硬件防火墙是问题所在。它导致套接字在不活动后超时。但是防火墙负责人声称,这个端口(8887)的连接超时时间是2160分钟。

我正在运行 Windows Server 2003 和 .NET 3.5。交易服务器是一台 linux 机器(虽然我不确定,但我相信 sles9)。

关于可能发生的事情有什么想法吗?鉴于我无法访问防火墙日志并且无法更改交易服务器上的代码,我能做些什么来调试更多?

谢谢,迈克

4

2 回答 2

1

您所描述的内容很常见,并且通过像您所做的那样的防火墙/网关来实现心跳以保持 TCP 套接字处于活动状态是很常见的。

该硬件可能有 2160 分钟的硬超时(根据我的经验,20-30 分钟更常见),但如果有任何类型的负载,连接通常会更积极地丢弃。这样的防火墙资源有限,当他们需要更多的连接跟踪时,他们倾向于丢弃最旧的连接而没有任何活动,而不管硬超时设置如何。

如果您想进一步调试,请在防火墙的服务器端进行嗅探,看看当服务器断开连接时会发生什么(如果有的话)

于 2009-09-10T07:50:28.500 回答
0

我会在防火墙的两侧设置wiresharp,看看TCP(和更低级别)会发生什么。当管理员说“连接超时”时。这是空闲的已建立连接的超时吗?我猜其他任何事情都没有任何意义。

另外,您是否使用 TCP 的 KeepAlive 选项?是否由防火墙转发?

正如我所说,可能想在防火墙的两侧运行wireshark ......

于 2009-09-10T03:19:41.560 回答