La situazione è così:
http client ----> corporate firewall ----> http server
A causa di un keepalive, server e client manterrebbero aperte le connessioni TCP e il client userebbe un pool di connessioni per le richieste HTTP.
Il firewall ha una regola per "uccidere" connessioni TCP di vecchia data dopo 1 ora. Il problema è che il nostro client HTTP non ha rilevato che la connessione TCP è stata distrutta e ha tentato di riutilizzare le connessioni essenzialmente morte che dalla nostra parte sembravano "bloccate" dopo un certo periodo di tempo. Una richiesta verrebbe bloccata, quindi la successiva funzionerebbe, presumibilmente perché è stata stabilita una nuova connessione.
La domanda qui è qual è il meccanismo con cui il firewall sta uccidendo le connessioni TCP in modo tale che il nostro client HTTP non sia stato in grado di rilevarle. Ho provato a riprodurre questo comportamento localmente in alcuni modi:
- Uccidi le connessioni TCP sul nostro router vyos, Wireshark sul lato client ha catturato TCP FIN-ACK. ok
- Kill TCP connessione lato client in TCPView su Windows, Wireshark ha rilevato TCP RST sul lato client. ok
- La porta di blocco dopo aver stabilito la connessione al firewall lato client, ha comportato un'eccezione di reimpostazione socket. ok
Ho un dump di Wireshark sul lato server e ho provato a scoprire se il firewall invia un FIN o RST con ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
ma non viene visualizzato nulla.
Inoltre, l'acquisizione di Wireshark sul lato client mostra il problema quando la richiesta HTTP viene interrotta, seguita da una dozzina di ritrasmissioni TCP, che alla fine non vanno da nessuna parte.
Il client HTTP è un client Java nativo e / o Jetty HTTP (provato entrambi), entrambi non sono riusciti a rilevare una connessione TCP morta. Mi piacerebbe riprodurre il comportamento localmente ma non sono in grado di capire in che modo oscuro il firewall sta uccidendo le connessioni, quindi alla ricerca di possibili risposte.