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