Situasinya seperti ini:
http client ----> corporate firewall ----> http server
Karena keepalive, server dan klien akan menjaga koneksi TCP tetap terbuka dan klien akan menggunakan kumpulan koneksi untuk permintaan HTTP.
Firewall memiliki aturan untuk "membunuh" koneksi TCP lama setelah 1 jam. Masalahnya adalah bahwa klien HTTP kami tidak akan mendeteksi bahwa koneksi TCP hancur dan ia mencoba untuk menggunakan kembali koneksi yang pada dasarnya mati yang di pihak kami tampak seperti klien "digantung" setelah jangka waktu tertentu. Permintaan akan hang, maka yang berikutnya akan berfungsi, mungkin karena koneksi baru dibuat.
Pertanyaannya di sini adalah mekanisme apa yang digunakan firewall untuk mematikan koneksi TCP dengan cara yang tidak dapat dideteksi oleh klien HTTP kami. Saya mencoba mereproduksi perilaku ini secara lokal dalam beberapa cara:
- Bunuh koneksi TCP pada router vyos kami, Wireshark di sisi klien menangkap TCP FIN-ACK. baik
- Membunuh sisi klien koneksi TCP di TCPView pada Windows, Wireshark mendeteksi TCP RST di sisi klien. baik
- Memblokir port setelah koneksi terjalin ke firewall sisi klien, menghasilkan pengecualian reset soket. baik
Saya memiliki dump Wireshark di sisi server dan saya mencoba mencari tahu apakah firewall mengirim FIN atau RST dengan ip.dst==serverip && (tcp.flags.reset==1 || tcp.flags.fin==1)
tetapi tidak ada yang muncul.
Selain itu, penangkapan Wireshark di sisi klien menunjukkan masalah ketika permintaan HTTP keluar, diikuti oleh selusin transmisi ulang TCP, akhirnya tidak ke mana-mana.
Klien HTTP adalah klien Java asli dan / atau HTTP HTTP (mencoba keduanya), keduanya gagal mendeteksi koneksi TCP yang mati. Saya ingin mereproduksi perilaku secara lokal tetapi saya tidak dapat mencari tahu dengan cara apa firewall mematikan koneksi, oleh karena itu mencari kemungkinan jawaban.