La situación es así:
http client ----> corporate firewall ----> http server
Debido a una actividad activa, el servidor y el cliente mantendrían abiertas las conexiones TCP y el cliente usaría un grupo de conexiones para las solicitudes HTTP.
El firewall tiene una regla para "matar" conexiones TCP de larga data después de 1 hora. El problema es que nuestro cliente HTTP no detectaría que la conexión TCP fue destruida y trató de reutilizar conexiones esencialmente inactivas que, por nuestro lado, parecían "colgadas" después de un período de tiempo. Se colgaría una solicitud, luego la siguiente funcionaría, presumiblemente porque se estableció una nueva conexión.
La pregunta aquí es cuál es el mecanismo con el que el firewall está matando las conexiones TCP de una manera que nuestro cliente HTTP no pudo detectarlas. Traté de reproducir este comportamiento localmente de varias maneras:
- Elimine las conexiones TCP en nuestro enrutador vyos, Wireshark en el lado del cliente capturó TCP FIN-ACK. Okay
- Eliminar la conexión TCP del lado del cliente en TCPView en Windows, Wireshark detectó TCP RST en el lado del cliente. Okay
- Bloquear el puerto después de la conexión establecida con el firewall del lado del cliente, resultó en una excepción de reinicio del socket. Okay
Tengo un volcado de Wireshark en el lado del servidor y traté de encontrar si el firewall envía un FIN o RST ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
pero no apareció nada.
Además, la captura de Wireshark en el lado del cliente muestra el problema cuando se cierra la solicitud HTTP, seguida de una docena de retransmisiones TCP, que finalmente no van a ninguna parte.
El cliente HTTP es un cliente Java nativo y / o Jetty HTTP (probó ambos), ambos no pudieron detectar una conexión TCP inactiva. Me gustaría reproducir el comportamiento localmente, pero no puedo entender de qué manera dudosa el cortafuegos está matando las conexiones, por lo tanto, buscando posibles respuestas.