2009-02-13 121 views
3

我知道TCP非常可靠,並且發送的內容都能保證到達目的地。但是如果發送一個數據包後會發生什麼情況,但之前會到達服務器,服務器出現故障?當數據包最初發送時,或者數據包成功到達服務器時,確認數據包發送成功時觸發服務器的存在?如果服務器終止,TCP數據包會發生什麼?

基本上我問的是 - 如果服務器在發送和接收數據包之間發生故障,客戶端會知道嗎?

回答

10

這其實並不重要,但這裏的一些更精細的細節:

您需要的服務器機下降和服務器進程下降區別開來。

如果服務器計算機崩潰了,那麼很明顯,沒有什麼可以接收數據包。發送客戶端將不會收到重試請求,也不會收到成功或失敗的確認信息。在沒有收到任何反饋意見之後,客戶端最終會收到超時,並且認爲連接已經中斷。這與實際上意外切割的電纜非常相似。

但是,如果Server-Machine保持正常運行,但由於編程錯誤導致服務器進程崩潰,則接收TCP堆棧是OS的一個函數,而不是進程的函數,數據包和任何其他到達的數據包。這將繼續,直到OS通知TCP堆棧該進程不再處於活動狀態。 TCP堆棧可能會向客戶端發送RST(重置)通知,或者可能會斷開連接(如上所述)

+0

+1。只是爲了澄清,但:tcp不提供保證的交付,它只提供可靠的交付。 ACK來自接收方的TCP堆棧,因此如果服務器機器停機,將不會有任何響應,正如abelenky所說。 – 2009-02-13 04:00:41

2

這基本上是發生了什麼情況。完整的現實很難描述,沒有被束縛在不必要的細節中。

TCP管理被定義爲4元組(source-ip,source-port,dest-ip,dest-port)的連接。

當服務器關閉連接時,連接將進入TIME_WAIT2狀態,在此狀態下,某個時間不能重新使用該連接。那個時間是數據包的最大生存時間值的兩倍。在此期間到達的任何數據包都會被TCP本身丟棄。

所以,當重新使用的連接變得可用時,所有的數據包都被破壞(在網絡上的任何地方)或者通過:

  • 在目的地被接收並扔掉由於TIME_WAIT2狀態;或
  • 由於終止使用期限而被網絡上的數據包轉發器破壞。
0

當你向網絡發送一個數據包時,永遠不會有被授予者,它會安全地到達另一側。 TCP的可靠性完全按照您建議使用確認數據包的方式實現。

相關問題