2017-08-07 61 views
1

我工作的一個應用程序,我需要確保即使在網絡中斷時,消息仍將到達他們的目的地可靠,有序,和不變。我一直在使用TCP,而到現在爲止,我只是使用的策略:TCP:提高可靠性與斷開連接

  • 如果發送/接收失敗,做一遍,直到沒有錯誤。

  • 如果遠程連接斷開,請等到下一次連接,然後用這個新連接替換我發送/接收的套接字(通過一些線程和阻塞實現以確保它完全交換)。

最近我意識到,這是不行的,因爲send無法報告表明遠程尚未接收到的信息錯誤(如舉。here)。

我也瞭解到,TCP連接可以在短暫的網絡中斷後繼續存在,因爲內核會緩衝數據包,直到連接在超時時間後宣佈死亡(引用。 here)。

的問題是:它是一個可行的策略,以剛剛殺青的超時時間(使用setsockoptSO_KEEPALIVE選項)包括客戶端/服務器端waaaay更高,從而使連接「永不超時」?我不得不處理與內核緩衝區填充相關的錯誤,但這應該相對簡單。

是否還有其他失敗的案例?

回答

1

如果兩端沒有明確斷開連接,即使您拔下電纜,tcp連接也會永遠保持打開。 TCP中沒有超時。

然而,我會使用(或設計)的應用協議在TCP之上,使得可以重新接通後恢復數據傳輸。例如,您可以使用HTTP

這將是更穩定,因爲這取決於緩衝區會像你說的,在一段時間內排出的緩衝區,但緩衝區會也正在對我們說停電丟失。

+0

好吧,只是爲了確認 - 如果我'sent'一些字節和節點之間的網絡下樓在發送的任何點/接收週期,只要這兩個節點不明確斷開,字節將被接收正確的時候網絡恢復了嗎? – hnefatl

+0

只要'send()'不會給你一個錯誤代碼,是的。如果你得到一個錯誤代碼(不是100%確定這個atm),你需要迭代(有耐心,沒有無盡的循環錘擊)嘗試再次發送它,但是你*不需要*重新連接套接字 - 只要另一隻手不會明確關閉連接。 – hek2mgl