套接字(流)與套接字(數據報)之間有什麼區別?爲什麼使用一個在另一個上?網絡編程中的流和數據報有什麼區別?
回答
很久以前我讀了很大的比喻解釋了兩者之間的區別。我不記得自己在哪裏讀過它,所以很遺憾,我不能將這個想法歸功於作者,但我也爲核心類比添加了很多我自己的知識。所以在這裏:
流套接字就像一個電話 - 一方放置電話,另一方回答,你互相問好(TCP中的SYN/ACK),然後交換信息。一旦完成,你就說再見了(TCP中的FIN/ACK)。如果一方沒有聽到再見,他們通常會打電話給對方,因爲這是一個意外的事件;通常客戶端將重新連接到服務器。有保證數據不會以不同於您發送的順序到達,並且有合理保證數據不會被損壞。
數據報套接字就像是傳遞一個音符類。考慮一下你並不直接與你傳遞筆記的人相鄰的情況;該筆記將從人到人。它可能無法到達目的地,並且可能會在到達目的地時進行修改。如果你將兩張紙條傳給同一個人,他們可能會按照你不想要的順序到達,因爲這些紙幣通過教室的路線可能不一樣,一個人可能不會像另一個人那樣快速地傳遞一張紙條,等等。
所以爲了有信息,當您使用流套接字和完整是非常重要的。文件傳輸協議就是一個很好的例子。你不想下載一些內容隨機隨機混亂和損壞的文件!
當您不希望流的開銷較高時(比如說VoIP或遊戲協議),訂單並不重要時,您會使用數據報套接字(這是爲什麼DNS主要是數據報協議,這樣服務器就可以很快響應很多很多請求),或者當數據到達目的地時不需要太在意。
爲了擴大在網絡電話/遊戲的情況下,這樣的協議包括自己的數據排序機制。但是如果一個數據包被損壞或丟失,您不希望等待流協議(通常是TCP)發出重新發送請求 - 您需要快速恢復。 TCP可能需要幾分鐘的時間才能恢復,而對於像遊戲或VoIP這樣的實時協議,即使是三秒鐘也是不可接受的!使用像UDP這樣的數據報協議,軟件可以非常快速地從這種事件中恢復,只需簡單地忽略丟失的數據或比TCP更快地重新請求它。
的VoIP是簡單地忽略丟失的數據一個很好的候選人 - 一方只想聽到短促的差距,與人交談,在手機上的時候,當他們有接收信號不好會發生什麼。遊戲協議通常稍微複雜一點,但所採取的操作通常是忽略丟失的數據(如果後續接收的數據取代丟失的數據),重新請求丟失的數據或請求完成狀態更新以確保客戶端的狀態與服務器同步。
流插座:
- 專用&點至點服務器和客戶端之間的信道。
- 使用TCP協議進行數據傳輸。
- 可靠和無損。
- 以類似的順序發送/接收的數據。
- 長的時間恢復丟失的/錯誤的數據
數據報套接字:
- 沒有專門&點至點服務器和客戶端之間的信道。
- 使用UDP進行數據傳輸。
- 不是100%可靠,可能會丟失數據。
- 數據發送/接收的順序可能是不一樣的
- 不關心或快速恢復丟失/錯誤的數據
- 1. 圖形數據庫和網絡數據庫有什麼區別?
- 2. '前饋網絡'和'全連接網絡'有什麼區別?
- 3. 網絡服務和遠程處理有什麼區別?
- 4. 工作流和數據流有什麼區別?
- 5. 「流類型」套接字和「數據報」套接字類型有什麼區別?
- 6. 榕樹網絡與摺疊榕樹網絡有什麼區別?
- 7. 「網絡服務」和「基於網絡的服務」有什麼區別?
- 8. 決策樹和貝葉斯網絡有什麼區別?
- 9. 安卓服務和網絡服務有什麼區別
- 10. 清除和重置網絡表單有什麼區別?
- 11. WCF和ASMX網絡服務有什麼區別?
- 12. 網絡服務器和應用服務器有什麼區別
- 13. 在Python子流程中,使用Popen()和check_output()有什麼區別?
- 14. 聲明式編程和命令式編程有什麼區別?
- 15. 有什麼區別`和$(Bash中有什麼區別?
- 16. c編程中的*和&運算符有什麼區別?
- 17. Racket(lisp編程語言)中的[]和()括號有什麼區別?
- 18. 調試和編譯有什麼區別?
- 19. a = b = c和編程分別賦值有什麼區別?
- 20. 網頁應用程序和網站有什麼區別?
- 21. 請求中的數據和參數有什麼區別?
- 22. UseCase和工作流程有什麼區別?
- 23. ssrs中的點擊和鑽取報告有什麼區別?
- 24. CANOE中的CAPL測試節點和網絡節點有什麼區別?
- 25. sqlalchemy的數據類型中的Varchar和String有什麼區別?
- 26. 叉子和線程有什麼區別?
- 27. Erlang/Yaws中的塊和非塊流有什麼區別
- 28. Java中的流和讀者之間有什麼區別?
- 29. R中的數據框和列表有什麼區別?
- 30. Cassandra數據類型中的INT和VARINT有什麼區別?
簡單高超包括SYNACK的細節。 – LazerSharks 2014-07-29 07:54:16