La situation est comme ceci:
http client ----> corporate firewall ----> http server
En raison d'une keepalive, le serveur et le client garderaient les connexions TCP ouvertes et le client utiliserait un pool de connexions pour les requêtes HTTP.
Le pare-feu a une règle pour "tuer" les connexions TCP de longue date après 1 heure. Le problème est que notre client HTTP ne détecterait pas que la connexion TCP a été détruite et il a essayé de réutiliser des connexions essentiellement mortes qui de notre côté ressemblaient au client "pendu" après un certain temps. Une demande se bloquerait, puis la suivante fonctionnerait, probablement parce qu'une nouvelle connexion a été établie.
La question ici est quel est le mécanisme avec lequel le pare-feu tue les connexions TCP d'une manière que notre client HTTP n'a pas pu les détecter. J'ai essayé de reproduire ce comportement localement de plusieurs manières:
- Tuez les connexions TCP sur notre routeur vyos, Wireshark du côté client a capturé TCP FIN-ACK. D'accord
- Tuez la connexion TCP côté client dans TCPView sous Windows, Wireshark a détecté TCP RST côté client. D'accord
- Bloquer le port après une connexion établie au pare-feu côté client, a entraîné une exception de réinitialisation de socket. D'accord
J'ai un vidage Wireshark côté serveur et j'ai essayé de trouver si le pare-feu envoie un FIN ou RST avec ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
mais rien ne s'est affiché.
De plus, la capture Wireshark côté client montre le problème lors de la sortie de la requête HTTP, suivie par une douzaine de retransmissions TCP, ne conduisant finalement nulle part.
Le client HTTP est un client HTTP natif Java et / ou Jetty (essayé les deux), les deux n'ont pas réussi à détecter une connexion TCP morte. Je voudrais reproduire le comportement localement, mais je ne peux pas comprendre de quelle manière douteuse le pare-feu tue les connexions, donc je cherche des réponses possibles.