# UDP
網絡協議是每個前端工程師都必須要掌握的知識,我們將先來學習傳輸層中的兩個協議:UDP 以及 TCP。對于大部分工程師來說最常用的協議也就是這兩個了,并且面試中經常會提問的也是關于這兩個協議的區別。
我們先來解答這個常考面試題關于 UDP 部分的內容,然后再詳細去學習這個協議。
> 常考面試題:UDP 與 TCP 的區別是什么?
首先 UDP 協議是面向無連接的,也就是說不需要在正式傳遞數據之前先連接起雙方。然后 UDP 協議只是數據報文的搬運工,不保證有序且不丟失的傳遞到對端,并且UDP 協議也沒有任何控制流量的算法,總的來說 UDP 相較于 TCP 更加的輕便。
## 面向無連接
首先 UDP 是不需要和 TCP 一樣在發送數據前進行三次握手建立連接的,想發數據就可以開始發送了。
并且也只是數據報文的搬運工,不會對數據報文進行任何拆分和拼接操作。
具體來說就是:
* 在發送端,應用層將數據傳遞給傳輸層的 UDP 協議,UDP 只會給數據增加一個 UDP 頭標識下是 UDP 協議,然后就傳遞給網絡層了
* 在接收端,網絡層將數據傳遞給傳輸層,UDP 只去除 IP 報文頭就傳遞給應用層,不會任何拼接操作
## 不可靠性
首先不可靠性體現在無連接上,通信都不需要建立連接,想發就發,這樣的情況肯定不可靠。
并且收到什么數據就傳遞什么數據,并且也不會備份數據,發送數據也不會關心對方是否已經正確接收到數據了。
再者網絡環境時好時壞,但是 UDP 因為沒有擁塞控制,一直會以恒定的速度發送數據。即使網絡條件不好,也不會對發送速率進行調整。這樣實現的弊端就是在網絡條件不好的情況下可能會導致丟包,但是優點也很明顯,在某些實時性要求高的場景(比如電話會議)就需要使用 UDP 而不是 TCP。
## 高效
雖然 UDP 協議不是那么的可靠,但是正是因為它不是那么的可靠,所以也就沒有 TCP 那么復雜了,需要保證數據不丟失且有序到達。
因此 UDP 的頭部開銷小,只有八字節,相比 TCP 的至少二十字節要少得多,在傳輸數據報文時是很高效的。

UDP 頭部包含了以下幾個數據
* 兩個十六位的端口號,分別為源端口(可選字段)和目標端口
* 整個數據報文的長度
* 整個數據報文的檢驗和(IPv4 可選 字段),該字段用于發現頭部信息和數據中的錯誤
## 傳輸方式
UDP 不止支持一對一的傳輸方式,同樣支持一對多,多對多,多對一的方式,也就是說 UDP 提供了單播,多播,廣播的功能。
## 適合使用的場景
UDP 雖然對比 TCP 有很多缺點,但是正是因為這些缺點造就了它高效的特性,在很多實時性要求高的地方都可以看到 UDP 的身影。
### 直播
想必大家都看過直播吧,大家可以考慮下如果直播使用了基于 TCP 的協議會發生什么事情?
TCP 會嚴格控制傳輸的正確性,一旦有某一個數據對端沒有收到,就會停止下來直到對端收到這個數據。這種問題在網絡條件不錯的情況下可能并不會發生什么事情,但是在網絡情況差的時候就會變成畫面卡住,然后再繼續播放下一幀的情況。
但是對于直播來說,用戶肯定關注的是最新的畫面,而不是因為網絡條件差而丟失的老舊畫面,所以 TCP 在這種情況下無用武之地,只會降低用戶體驗。
### 王者榮耀
雖然我具體不知道王者榮耀底層使用了什么協議,但是對于這類實時性要求很高的游戲來說,UDP 是跑不了的。
為什么這樣說呢?首先對于王者榮耀來說,用戶體量是相當大的,如果使用 TCP 連接的話,就可能會出現服務器不夠用的情況,因為每臺服務器可供支撐的 TCP 連接數量是有限制的。
再者,因為 TCP 會嚴格控制傳輸的正確性,如果因為用戶網絡條件不好就造成頁面卡頓然后再傳輸舊的游戲畫面是肯定不能接受的,畢竟對于這類實時性要求很高的游戲來說,最新的游戲畫面才是最需要的,而不是老舊的畫面,否則角色都不知道死多少次了。
## 小結
這一章節的內容就到這里,因為 UDP 協議相對簡單,所以內容并不是很多,但是下一章節會呈現很多關于 TCP 相關的內容,請大家做好準備。
最后總結一下這一章節的內容:
* UDP 相比 TCP 簡單的多,不需要建立連接,不需要驗證數據報文,不需要流量控制,只會把想發的數據報文一股腦的丟給對端
* 雖然 UDP 并沒有 TCP 傳輸來的準確,但是也能在很多實時性要求高的地方有所作為