2012-10-26 152 views
28

我打開一個TCP套接字並將它連接到網絡上其他地方的另一個套接字。然後,我可以成功發送和接收數據。我有一個計時器,每秒鐘都會向套接字發送一些內容。TCP套接字無連接超時

然後粗暴地斷開連接,強行斷開連接(在這種情況下拉出以太網電纜)。我的套接字仍在報告說它正在成功地每秒鐘寫出數據。這將持續大約1小時30分鐘,最終會出現寫入錯誤。

什麼指定了套接字最終接受另一端的超時時間已經消失?它是操作系統(Ubuntu 11.04),它是來自TCP/IP規範還是套接字配置選項?

+2

也許[this](http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux)爲您提供了答案。 – SKi

回答

49

拉動網線不會中斷TCP連接(1),儘管它會中斷通信。您可以重新插入電纜,一旦IP連接建立,所有的後臺數據都會移動。這使得TCP可靠,甚至在蜂窩網絡上也是如此。

當TCP發送數據時,它期待一個ACK的回覆。如果沒有人在一定的時間內到達,它會重新傳輸數據並再次等待。在傳輸之間等待的時間通常呈指數增長。

經過一定次數的重傳或一定數量的無ACK的總時間後,TCP會認爲連接「斷開」。多少次或多長時間取決於您的操作系統及其配置,但通常會在幾分鐘內超時。

從Linux的tcp.7 man page

tcp_retries2 (integer; default: 15; since Linux 2.2) 
      The maximum number of times a TCP packet is retransmitted in 
      established state before giving up. The default value is 15, which 
      corresponds to a duration of approximately between 13 to 30 minutes, 
      depending on the retransmission timeout. The RFC 1122 specified 
      minimum limit of 100 seconds is typically deemed too short. 

這可能是你要適應變化需要多長時間來檢測,如果你的連接已經消失的值。

(1)也有例外。操作系統在注意到電纜被移除後可以通知上層所有連接應被視爲「斷開」。

+1

這是非常有用的謝謝你的答案! – corvid

+0

我每天都會做成千上萬個Http請求,現在我在Websockets(nodejs)工作,所以自然我想知道更多關於好老套接字的知識,現在我明白了SocketsWork是多麼的美妙。 可靠,面向連接和主機的特定協議,因爲這就是爲什麼沒有。的重試取決於操作系統! –