An einem Kundenstandort fügte das Netzwerkteam eine Firewall zwischen dem Client und dem Server hinzu. Dies führt dazu, dass Leerlaufverbindungen nach etwa 40 Minuten Leerlaufzeit getrennt werden. Die Netzwerk-Leute sagen, dass die Firewall kein Zeitlimit für Leerlaufverbindungen hat, aber Tatsache ist, dass die Leerlaufverbindungen unterbrochen werden.
Um dies zu umgehen, haben wir zuerst den Server (einen Linux-Computer) mit aktivierten TCP-Keepalives konfiguriert, wobei tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 und tcp_keepalive_probes = 30000 aktiviert sind. Dies funktioniert und die Verbindungen bleiben tagelang oder länger funktionsfähig. Wir möchten jedoch auch, dass der Server tote Clients erkennt und die Verbindung beendet. Daher haben wir die Einstellungen auf time = 300, intvl = 180, probes = 10 geändert und gedacht, dass der Server alle 300 Sekunden prüfen würde, wenn der Client tatsächlich am Leben wäre (5 Minuten) und der Client würde mit einem ACK antworten und dies würde die Firewall davon abhalten, dies als eine inaktive Verbindung zu betrachten und sie zu beenden. Wenn der Client nach 10 Tests tot wäre, würde der Server die Verbindung abbrechen. Zu unserer Überraschung werden die müßigen, aber lebendigen Verbindungen nach etwa 40 Minuten wie zuvor unterbrochen.
Wireshark, das auf der Clientseite ausgeführt wird, zeigt überhaupt keine Keepalives zwischen Server und Client an, selbst wenn Keepalives auf dem Server aktiviert sind.
Was könnte hier passieren?
Wenn die Keepalive-Einstellungen auf dem Server time = 300, intvl = 180, probes = 10 sind, würde ich erwarten, dass der Server alle 300 Sekunden Keepalive-Probes sendet und die Verbindung in Ruhe lässt, wenn der Client aktiv, aber inaktiv ist Wenn der Client tot ist, sendet er nach 300 Sekunden eine, dann alle 180 Sekunden 9 weitere Tests, bevor die Verbindung unterbrochen wird. Habe ich recht?
Eine Möglichkeit besteht darin, dass die Firewall die Keepalive-Tests vom Server abfängt und sie nicht an den Client weiterleitet. Die Tatsache, dass sie einen Test hat, lässt vermuten, dass die Verbindung aktiv ist. Ist dies ein häufiges Verhalten für eine Firewall? Wir wissen nicht, um welche Art von Firewall es sich handelt.
Der Server ist ein Teradata-Knoten und die Verbindung erfolgt von einem Teradata-Client-Dienstprogramm zum Datenbankserver, Port 1025 auf der Serverseite. Wir haben jedoch das gleiche Problem mit einer SSH-Verbindung festgestellt, sodass wir glauben, dass dies alle TCP-Verbindungen betrifft.