在客户站点中,网络团队在客户端和服务器之间添加了防火墙.这导致空闲连接在大约40分钟的空闲时间后断开连接.网络人员说防火墙没有任何空闲连接超时,但事实是空闲连接被破坏了.

为了解决这个问题,我们首先使用tcp_keepalive_time = 300,tcp_keepalive_intvl = 300和tcp_keepalive_probes = 30000来配置启用TCP keepalive的服务器(Linux机器).这有效,并且连接可以存活数天或更长时间.但是,我们还希望服务器检测死客户端并终止连接,因此我们将设置更改为time = 300,intvl = 180,probes = 10,认为如果客户端确实存在,则服务器将每隔300秒进行一次探测(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连接.