2011-01-14 120 views

回答

256

很久以前我讀了很大的比喻解釋了兩者之間的區別。我不記得自己在哪裏讀過它,所以很遺憾,我不能將這個想法歸功於作者,但我也爲核心類比添加了很多我自己的知識。所以在這裏:

流套接字就像一個電話 - 一方放置電話,另一方回答,你互相問好(TCP中的SYN/ACK),然後交換信息。一旦完成,你就說再見了(TCP中的FIN/ACK)。如果一方沒有聽到再見,他們通常會打電話給對方,因爲這是一個意外的事件;通常客戶端將重新連接到服務器。有保證數據不會以不同於您發送的順序到達,並且有合理保證數據不會被損壞。

數據報套接字就像是傳遞一個音符類。考慮一下你並不直接與你傳遞筆記的人相鄰的情況;該筆記將從人到人。它可能無法到達目的地,並且可能會在到達目的地時進行修改。如果你將兩張紙條傳給同一個人,他們可能會按照你不想要的順序到達,因爲這些紙幣通過教室的路線可能不一樣,一個人可能不會像另一個人那樣快速地傳遞一張紙條,等等。

所以爲了有信息,當您使用流套接字和完整是非常重要的。文件傳輸協議就是一個很好的例子。你不想下載一些內容隨機隨機混亂和損壞的文件!

當您不希望流的開銷較高時(比如說VoIP或遊戲協議),訂單並不重要時,您會使用數據報套接字(這是爲什麼DNS主要是數據報協議,這樣服務器就可以很快響應很多很多請求),或者當數據到達目的地時不需要太在意。

爲了擴大在網絡電話/遊戲的情況下,這樣的協議包括自己的數據排序機制。但是如果一個數據包被損壞或丟失,您不希望等待流協議(通常是TCP)發出重新發送請求 - 您需要快速恢復。 TCP可能需要幾分鐘的時間才能恢復,而對於像遊戲或VoIP這樣的實時協議,即使是三秒鐘也是不可接受的!使用像UDP這樣的數據報協議,軟件可以非常快速地從這種事件中恢復,只需簡單地忽略丟失的數據或比TCP更快地重新請求它。

的VoIP是簡單地忽略丟失的數據一個很好的候選人 - 一方只想聽到短促的差距,與人交談,在手機上的時候,當他們有接收信號不好會發生什麼。遊戲協議通常稍微複雜一點,但所採取的操作通常是忽略丟失的數據(如果後續接收的數據取代丟失的數據),重新請求丟失的數據或請求完成狀態更新以確保客戶端的狀態與服務器同步。

+1

簡單高超包括SYNACK的細節。 – LazerSharks 2014-07-29 07:54:16

19

流插座:

  • 專用&點至點服務器和客戶端之間的信道。
  • 使用TCP協議進行數據傳輸。
  • 可靠和無損。
  • 以類似的順序發送/接收的數據。
  • 長的時間恢復丟失的/錯誤的數據

數據報套接字:

  • 沒有專門&點至點服務器和客戶端之間的信道。
  • 使用UDP進行數據傳輸。
  • 不是100%可靠,可能會丟失數據。
  • 數據發送/接收的順序可能是不一樣的
  • 不關心或快速恢復丟失/錯誤的數據
相關問題