2010-01-09 53 views
1

我已經檢出TCP協議Wiki,但沒有找到,如果在長時間段內沒有數據傳輸,套接字連接將超時。我的意思是......沒有任何物理問題,但是兩臺計算機將只有一段時間沒有數據發送對方。連接將如何存在?會不會有一些低級數據傳輸來幫助它理解它沒有被破壞?如果沒有數據,TCP斷開連接

謝謝!對不起,如果問題是愚蠢的..

+0

你需要它來了解一些編程任務嗎?否則它更適合在serverfault.com – 2010-01-09 18:17:56

+0

米..它是有關的c + +,boost :: asio,特別是 – roma 2010-01-09 18:24:36

回答

4

沒有通過網絡發送數據來維護TCP連接。您可以簡單地通過發送()來自對等方的零字節數據包或啓用套接字選項來讓網絡層保持活動狀態,讓操作系統定期爲您發送它們。在我看來,應用層keep-alive(你的應用協議管理它)提供比傳輸層機器更好的設計/可靠性。

爲了獲得最大的可靠性,在設計層疊在TCP之上的應用協議時,通常需要在協議設計中引入某種非操作(NOOP),ping和心跳。

這非常重要,因爲例如如果您的服務器在連接完成後監聽來自客戶端和客戶端的請求時關閉,則TCP會話基本上是孤立的,並且您的服務器可能最終會永遠監聽。如果沒有數據發送或接收,則無法檢測到連接中斷!

如果服務器至少每隔一段時間發送noop/ping/heartbeats,那麼出站請求將觸發TCP層重傳/超時機器,服務器將能夠檢測到死連接。如果您的應用程序發送應用程序層「ping」或「嗨,你好嗎?」消息,你可以進一步使用它來查詢你的同伴的狀態,而不僅僅是底層連接。

例如,如果一個對等端陷入無限循環或其磁盤驅動器着火,TCP keepalive本身並不能幫助您理解並保留底層問題。

+0

謝謝你這麼多細節,它真的讓我開悟) – roma 2010-01-09 19:13:25

0

連接通常保持打開使用keepalives

+0

連接將始終保持開放。鑑於標準的TCP協議,保持活力不會阻止關閉連接。 – 2010-01-09 18:21:04

+0

易卜拉欣,感謝您的鏈接!所以,連接一段時間後會關閉,對吧? (因爲默認保活機制是關閉的) – roma 2010-01-09 18:26:19

+0

據我所知不是。只是TCP實現可以選擇實現保活機制。你不能依靠它在那裏。 – 2010-01-09 18:31:32

0

不,它不會。如果您需要任何一方斷開沒有數據傳輸的連接,則需要使用某種「保持活動」機制自行實施。

+0

對不起,我還沒有理解。保持聯絡會幫助我保持連接打開,反之亦然?謝謝你的答案。 – roma 2010-01-09 18:28:52

2

TCP連接將保持打開狀態,直到兩端關閉爲止。

雖然知道防火牆,特別是NAT網關通常會超時它們的TCP連接條目,這意味着如果您的連接經過了一個連接,那麼如果網關已經刪除了該TCP連接的映射,則發送數據可能會出錯。只有從TCP連接讀取網關超時纔會被檢測到,除非在應用程序協議中有某種心跳或啓用tcp keepalive。

+0

我想這清楚地回答我的問題:)謝謝。 據我所知,當防火牆將關閉連接,我會在嘗試發送數據時發生套接字錯誤? – roma 2010-01-09 18:32:42

+0

是的,你會得到某種錯誤。它可能需要一段時間。 對NAT和防火牆的行爲進行了一些研究,得出的結論是,每30秒一個數據包將保持您的映射對基本上所有首先工作的連接都開放。 – 2010-01-09 21:51:49

相關問題