2014-02-11 104 views
0

所以我有一個遠程設備使用連接到VPS的Lantronics XPort模塊。他們建立了TCP連接,一切都很好。服務器確認一切。Linux在ESTABLISHED連接上不響應SYN

在某一點遠程設備停止傳輸數據。 30秒過去。

然後設備開始發送SYN數據包,就好像試圖建立新的連接一樣。該設備配置爲維護到服務器的連接,並且始終使用相同的源端口。 (我意識到這是不好的,但我很難改變)

服務器看到來自同一個(源IP,源端口)的SYN數據包,所以服務器認爲連接是ESTABLISHED。服務器不響應SYN數據包。

  1. 爲什麼服務器沒有按照RFC 793中的圖10所述的方式響應ACK? (https://www.ietf.org/rfc/rfc793.txt

  2. 如何讓服務器終止連接或用ACK作出響應?

可能出現的情況是,在30秒的靜默期間,設備正在等待來自服務器的ACK,並且該ACK已被丟棄。在這種情況下,我認爲它應該重發。

服務器運行Ubuntu的內核3.12.9-x86_64的-linode37

感謝您的幫助!

回答

0

我的第一個建議是將客戶端更改爲使用相同的連接或在重新打開之前正常關閉連接。

當你沒有對客戶端的控制和一切所能做的就是在服務器上,你可以試試這個:

配置保持活動只進行一次之後的沉默和探頭10秒發送。如果客戶端沒有響應,服務器關閉連接。通過這樣做,服務器應在靜默10秒內再次處於監聽模式,無需客戶端響應。你可以使用下面的sysctl來達到最佳值。

net.ipv4.tcp_keepalive_intvl = 10個

net.ipv4.tcp_keepalive_probes = 1

======

此外,關於失蹤-ACK,你在你的問題中提到, TCP負責這些事情。發件人第一次重新發送時間太長,30秒。如果客戶端/設備在30秒後沒有得到確認,它將會/不應該嘗試打開新的連接。如果你看到了這一點,那就是客戶端的一個瘋狂的TCP堆棧。什麼是該設備以及它使用的是哪個OS/TCP堆棧?

+0

謝謝。我在這裏錯過的部分是保持活動行爲不是默認行爲。在創建套接字時,您必須使用setsockopt來啓用它。 –

相關問題