作者:陳碩
鏈接:https://www.zhihu.com/question/20060141/answer/26735814
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
鏈接:https://www.zhihu.com/question/20060141/answer/26735814
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
UDP 的使用范圍很窄,而且編程比 TCP 難多了:
一些協議,出於歷史原因,受當時技術和網絡條件限制,選擇了基於UDP實現,其選擇的理由現在很可能已經不再成立了。因此“xxx協議用UDP”不是你現在寫網絡應用程序也該用UDP的理由,除非你本身就是在實現xxx協議。
另外,那些說TCP比UDP慢、效率低的,你拿UDP寫個程序,把千兆網帶寬打滿(TCP等價的代碼只有兩行:客戶端 while (true) { send(...); } 服務端 while (true) { recv(...); }。),且不說你的程序會有多復雜,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛
- 你真的很在乎延遲,不能忍受重傳,那么就用UDP,例如 NTP 協議。重傳NTP消息純屬添亂。
- 你真的不在乎可靠性,丟一些包也不需要重傳,那么就可以用 UDP。例子我想不出來。有人說音頻或視頻流可以用UDP,不過據我看來各大視頻網站都用HTTP協議,而HTTP是基於TCP的。
- 你需要NAT穿透,那么不得不用UDP。
- 其他情況,一旦程序要自己做重傳,你都是在用UDP模擬出蹩腳的TCP,還不如直接用TCP呢。
一些協議,出於歷史原因,受當時技術和網絡條件限制,選擇了基於UDP實現,其選擇的理由現在很可能已經不再成立了。因此“xxx協議用UDP”不是你現在寫網絡應用程序也該用UDP的理由,除非你本身就是在實現xxx協議。
另外,那些說TCP比UDP慢、效率低的,你拿UDP寫個程序,把千兆網帶寬打滿(TCP等價的代碼只有兩行:客戶端 while (true) { send(...); } 服務端 while (true) { recv(...); }。),且不說你的程序會有多復雜,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛
========================================================
兩種協議都是傳輸層協議,為應用層提供信息載體。TCP協議是基於連接的可靠協議,有流量控制和差錯控制,也正因為有可靠性的保證和控制手段,所以傳輸效率比UDP低;UDP協議是基於無連接的不可靠協議,沒有控制手段,僅僅是將數據發送給對方,因此效率比TCP要高。
基於上述特性,不難得到結論,TCP協議適用於對效率要求相對低,但對准確性要求相對高的場景下,或者是有一種連接概念的場景下;而UDP協議適用於對效率要求相對高,對准確性要求相對低的場景。
好了,現在回到你的問題,舉幾個應用的例子。TCP一般用於文件傳輸(FTP HTTP 對數據准確性要求高,速度可以相對慢),發送或接收郵件(