在客户站点中,networking团队在客户端和服务器之间添加了防火墙。 大约40分钟的空闲时间后,这会导致空闲连接断开。 networking人士说,防火墙没有任何空闲的连接超时,但事实是空闲的连接被打破。
为了解决这个问题,我们首先configuration了tcp_keepalive_time = 300,tcp_keepalive_intvl = 300和tcp_keepalive_probes = 30000的TCP keepalive服务器(一台Linux机器)。 这是有效的,连接可以持续数天或更长时间。 但是,我们也希望服务器检测到死的客户端并终止连接,所以我们将设置更改为time = 300,intvl = 180,probes = 10,认为如果客户端确实存在,服务器会每隔300s (5分钟),并且客户端将以ACK进行响应,并且防止防火墙将其视为空闲连接并将其消除。 如果客户端死了,10次探测之后,服务器将中止连接。 令我们吃惊的是,这些空闲而又活跃的联系人在大约40分钟后就像以前一样死亡。
运行在客户端上的Wireshark在服务器和客户端之间根本不显示任何keepalive,即使在服务器上启用keepalive也是如此。
这里会发生什么?
如果服务器上的keepalive设置是time = 300,intvl = 180,probes = 10,我认为如果客户端处于活动状态但空闲,服务器将每隔300秒发送一次keepalive探针,客户端已经死了,它会在300秒后发送一个,然后每隔180秒再发送9个探测器,然后再杀死连接。 我对吗?
一种可能性是防火墙以某种方式拦截来自服务器的keepalive探测器,并且无法将它们传递给客户端,并且获得探测器的事实使得认为连接处于活动状态。 这是防火墙的常见行为吗? 我们不知道涉及哪种防火墙。
服务器是Teradata节点,连接是从Teradata客户端实用程序到服务器端的端口1025的数据库服务器,但我们已经看到与SSH连接相同的问题,所以我们认为它会影响所有TCP连接。