2013-11-21 52 views
0

我有一臺服務器上運行Linux(內核3.0.35),並在Windows 7上運行的客戶端每次客戶端連接到TCP重發發生在該服務器: 這裏是Wireshark的交通: http://oi39.tinypic.com/ngsnyb.jpgLinux應用程序不響應FIN數據包重傳時

我覺得情況是這樣的:

客戶端(192.168.1.100)連接到服務器(192.168.1.103),連接成功。在某些時候客戶端決定關閉連接(FIN,ACK),服務器不會確認FIN。 然後客戶端啓動一個新的連接,該連接是ACK,並且是成功的。與此同時,Windows內核繼續重新發送FIN,ACK數據包,並最終決定進行重置。

在第二連接被建立我沒有收到客戶端所發送的數據在服務器側(16個字節長度的數據包)的那一刻,我只RST分組後收到這些字節。

在我使用的民意調查()函數來檢查POLLIN事件的服務器端,並直到RST包到達我沒有通知的任何數據。

因此,有誰知道爲什麼會發生這種情況?

+0

所以...的結果是,服務器堆棧不處理來自客戶端的關閉請求以合規的TCP時尚? –

+0

問題是,在我的服務器應用程序中,我收不到客戶端發送的16個字節,直到我收到RST數據包,這是一個很長的時間。 – Diurpaneus

回答

0

你的數據字節不發送對52687連接,而是以下52690連接。我猜測服務器應用程序一次只接受一個連接(內核將提前接受它們並僅保存數據),因此在第一個連接失效前不會看到來自第二個連接的數據,並且它將繼續下一個。

這並不能解釋爲什麼你的FIN沒有被ACK'd。這應該。也許內核中有些東西不喜歡開放,然後關閉無數據連接?也許某種攻擊緩解?防火牆規則?

+0

感謝您在正確的路徑上引導我,它實際上是導致FIN不被確認的防火牆。我禁用了防火牆,連接沒有問題。 – Diurpaneus

相關問題