偶爾 Windows / .net 應用程序會忽略 tcp fin 標誌
我遇到了無法解決的網路問題。在一些執行 Windows 8.1 並與 linux http 伺服器通信的電腦上,tcp 連接在 Windows 端懸空,而不是被正確關閉。
回應後
$$ fragmented into few, acknowledged by windows, tcp packets $$linux 伺服器 - 10.14.11.59 - 發送一個包含 FIN 和 ACK 標誌集的 tcp 數據包。 這是由 Windows 機器確認的 - 10.14.10.195 - 數據包只設置了 ACK 標誌。
linux在windows機器上多次重新發送帶有FIN和ACK標誌的數據包——由於某種原因仍然保持連接打開;windows機器永遠不會發送帶有RST標誌的數據包。
如果發生這種情況,Windows 應用程序會等待並最終超時。這在 10-50% 的嘗試中隨機發生。
兩台機器之間的流量未經過濾;基於主機的防火牆已關閉。為了避免潛在的問題,我在 linux 和 windows 上禁用了 tcp 解除安裝。另外在 Windows 上執行以下程序並重新啟動機器:
netsh int tcp set global chimney=disabled netsh int tcp set global autotuninglevel=disabled netsh int tcp set global rss=disabled
數據包擷取:這裡。
任何想法將不勝感激!
我們發現在客戶端機器上執行的 eset 端點安全是罪魁禍首。
禁用防火牆功能是不夠的;但解除安裝它完全解決了這個問題。
我的同事在這裡找到了類似問題的描述;顯然升級到最新版本的 eset 也解決了這個問題。
我假設您的 tcpdump 中的第一段前面是
FIN
來自客戶端的 a。我相信這是正確的客戶端行為,如原始 RFC 中的 ASCII 圖表所示
關閉的客戶端,在收到
FIN,ACK
來自伺服器的 a 後,套接字從FIN-WAIT1
to轉換TIME-WAIT
並在此狀態下保持 2 倍於網路中的 Maximum Segment Lifetime,此時它發送FIN
回一個以關閉連接。
TIME-WAIT
Windows使用系統資料庫值名稱TcpTimedWaitDelay覆蓋持續時間,最初使用預設值 240 秒(MSL 預設為 120 秒)實現。在 Windows XP/Server 2003 及更高版本中,預設值降低到 120 秒。我相信您可以通過在提供響應後關閉伺服器上的底層套接字來解決此問題,但請務必閱讀此答案,大致相同的問題,但從伺服器的角度來看