我有一个Tomcat 7 servlet接受来自远程客户端的连接,并且如果可能的话,保持这些连接打开数小时或数天。所以,我们正在使用NIO连接器。 物理连接上的带宽可能很昂贵,因此流量应保持在绝对最小值,因此我们已经编程了远程客户端以非常罕见的ping来测试连接。
偶尔会告诉servlet连接已关闭,但似乎没有告知远程客户端。客户端在执行ping操作之前不会发现,此时他们可以建立新连接。我们需要减少客户端未连接的时间长度,而不使用更多ping。
一种有效的方法是关闭Tomcat服务器。客户知道他们立即断开连接。显然我们不想关闭Tomcat - 我的观点是必须有某种信号使它跨越正常安静的连接。
如何强制Tomcat发送此信号?请不要回答说我不能,除非你能告诉我为什么,具体细节,部分是因为我无法相信,而且主要是因为我不想相信它。这似乎很奇怪 - 就像不能把电话挂在某人身上一样。
备选问题#1 - servlet可以恢复已被告知已关闭的连接吗?
替代问题#2 - 任何人都可以想到其他可能有帮助的问题吗?
答案 0 :(得分:0)
有几点想法:
答案 1 :(得分:0)
我正在回答这个老问题,因为我们已经看到HTTP连接(或任何TCP连接)持续打开数十分钟而且防火墙没有流量的相同问题。如果确实没有防火墙,那么我的答案不适用。
你可以在客户端和服务器上同时使用tcpdump / wireshark来确认这个理论,并且有一些耐心。
如果有防火墙,那么您需要确保“ping”数据包比防火墙的空闲TCP连接超时更频繁地发生,以保持连接活动。在增加防火墙超时之前要三思而后行,防火墙可能无法达到它,正如我将解释的那样。
客户端和服务器之间的防火墙可能正在执行NAT或某些数据包检查。这些功能需要防火墙上的资源,并且防火墙将跟踪的连接数量有限。因此,默认情况下,它会在空闲时间后“静默关闭”这些连接,以节省资源。
我默默地说,因为在客户端或服务器发送流量之前,防火墙不会向任何一方发送任何数据包。此时,防火墙通常会使用RST数据包进行响应。我们使用来自客户端和服务器的tcpdump来跟踪它。它显示防火墙发送此RST数据包就像从连接侧一样。但是另一方的tcpdump确认此数据包未被发送。它必须是防火墙。
增加防火墙上空闲超时的大小可能会导致更多问题,因为防火墙可能无法处理连接数。这可能会导致整个防火墙重置,您可以在防火墙上看到所有tcp套接字。
由于必须使用TCP,因此请避免使用任何需要在防火墙上进行连接跟踪的防火墙功能(NAT,计费,数据包检查)。或者确保您的防火墙具有足够的资源来跟踪所有连接。