在程式設計師面試中,有一個經常被問到的網路協議,那便是TCP與UDP,可能TCP大家都比較熟悉,三次握手四次揮手,對於UDP可能陌生一點,覺得應用場景比較少,不過這幾年,由於直播行業的快速發展,UDP的應用也越來越廣,今天我們來學習下UDP協議。
UDP,使用者資料包協議,又稱不可靠資料包協議,顧名思義,就是不能保證資料一定能傳輸到目標機器,既然不能保證傳達,為什麼還要用這種協議呢?豈不是非常地不合理?
場景有位偉人說過,存在即為合理。例如網路直播,網路直播採用的很多協議都是基於UDP的,為什麼呢?在網路直播的業務中,是允許部分丟包的,即便我們丟失了部分幀,也能夠正常的播放,並且使用者不一定感受得到。TCP是不允許丟包的,TCP協議會有複雜的重試機制,特別是在弱網環境下,一旦有資料傳送失敗,TCP協議就會不停地重試,導致新的視訊內容沒辦法刷出來,那樣子視訊反而會一卡一頓。同樣,在我們經常玩的MOBA遊戲中,例如王者榮耀或者英雄聯盟,一旦包丟失了,重新獲取到幾秒鐘前的包已經意義不大了。
構成UDP的資料包非常的簡單,包頭只有源埠、目標埠、長度跟校驗和四個欄位,剩下的就是具體的包體了。和TCP相比,這已經是精簡到不能再精簡了,每一個欄位都是必須的。源埠跟目標埠用來給作業系統定位是哪個應用來發送接收包資訊,長度跟校驗和用來校驗UDP包是否正確。
特點我們注意到,UDP的資料包並沒有序列,所以,UDP不保證訊息交付順序,並且不確認,不重傳,不排重,隨心所欲,有包就發,不像TCP會優先發隊首。
UDP不跟蹤連線狀態,不建立連線也不關心對方是否能收到!
UDP不需要流量控制,不管網路的情況,沒有擁塞控制。
應用即使UDP這麼的不靠譜,但是某些場景下的確需要這麼搞。UDP有三大使用場景。