A situação é assim:
http client ----> corporate firewall ----> http server
Devido a uma manutenção de atividade, o servidor e o cliente manteriam as conexões TCP abertas e o cliente usaria um conjunto de conexões para solicitações HTTP.
O firewall tem uma regra para "matar" conexões TCP de longa data após 1 hora. O problema é que nosso cliente HTTP não detectou que a conexão TCP foi destruída e tentou reutilizar conexões essencialmente mortas que, do nosso lado, pareciam o cliente "travado" após um período de tempo. Uma solicitação seria interrompida e a próxima funcionaria, provavelmente porque uma nova conexão foi estabelecida.
A questão aqui é qual é o mecanismo com o qual o firewall está matando as conexões TCP de uma maneira que nosso cliente HTTP não conseguiu detectá-las. Tentei reproduzir esse comportamento localmente de algumas maneiras:
- Mate as conexões TCP em nosso roteador vyos, o Wireshark no lado do cliente capturou o TCP FIN-ACK. Está bem
- Mate o lado do cliente da conexão TCP no TCPView no Windows, o Wireshark detectou o TCP RST no lado do cliente. Está bem
- A porta de bloqueio após a conexão estabelecida com o firewall do lado do cliente resultou na exceção de redefinição de soquete. Está bem
Eu tenho um dump do Wireshark no lado do servidor e tentei descobrir se o firewall envia um FIN ou RST com ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
mas nada apareceu.
Além disso, a captura do Wireshark no lado do cliente mostra o problema quando a solicitação HTTP é encerrada, seguida por uma dúzia de retransmissões de TCP, não sendo levada a lugar algum.
O cliente HTTP é um cliente Java nativo e / ou Jetty HTTP (tentou ambos), ambos falharam ao detectar uma conexão TCP morta. Gostaria de reproduzir o comportamento localmente, mas não consigo descobrir de que maneira astuciosa o firewall está matando as conexões, procurando, portanto, possíveis respostas.