在程序員面試中,有一個(gè)經(jīng)常被問到的網(wǎng)絡(luò)協(xié)議,那便是TCP與UDP,可能TCP大家都比較熟悉,三次握手四次揮手,對(duì)于UDP可能陌生一點(diǎn),覺得應(yīng)用場(chǎng)景比較少,不過(guò)這幾年,由于直播行業(yè)的快速發(fā)展,UDP的應(yīng)用也越來(lái)越廣,今天我們來(lái)學(xué)習(xí)下UDP協(xié)議。

UDP,用戶數(shù)據(jù)包協(xié)議,又稱不可靠數(shù)據(jù)包協(xié)議,顧名思義,就是不能保證數(shù)據(jù)一定能傳輸?shù)侥繕?biāo)機(jī)器,既然不能保證傳達(dá),為什么還要用這種協(xié)議呢?豈不是非常地不合理?
場(chǎng)景
有位偉人說(shuō)過(guò),存在即為合理。例如網(wǎng)絡(luò)直播,網(wǎng)絡(luò)直播采用的很多協(xié)議都是基于UDP的,為什么呢?在網(wǎng)絡(luò)直播的業(yè)務(wù)中,是允許部分丟包的,即便我們丟失了部分幀,也能夠正常的播放,并且用戶不一定感受得到。TCP是不允許丟包的,TCP協(xié)議會(huì)有復(fù)雜的重試機(jī)制,特別是在弱網(wǎng)環(huán)境下,一旦有數(shù)據(jù)發(fā)送失敗,TCP協(xié)議就會(huì)不停地重試,導(dǎo)致新的視頻內(nèi)容沒辦法刷出來(lái),那樣子視頻反而會(huì)一卡一頓。同樣,在我們經(jīng)常玩的MOBA游戲中,例如王者榮耀或者英雄聯(lián)盟,一旦包丟失了,重新獲取到幾秒鐘前的包已經(jīng)意義不大了。
構(gòu)成
UDP的數(shù)據(jù)包非常的簡(jiǎn)單,包頭只有源端口、目標(biāo)端口、長(zhǎng)度跟校驗(yàn)和四個(gè)字段,剩下的就是具體的包體了。和TCP相比,這已經(jīng)是精簡(jiǎn)到不能再精簡(jiǎn)了,每一個(gè)字段都是必須的。源端口跟目標(biāo)端口用來(lái)給操作系統(tǒng)定位是哪個(gè)應(yīng)用來(lái)發(fā)送接收包信息,長(zhǎng)度跟校驗(yàn)和用來(lái)校驗(yàn)UDP包是否正確。
特點(diǎn)
我們注意到,UDP的數(shù)據(jù)包并沒有序列,所以,UDP不保證消息交付順序,并且不確認(rèn),不重傳,不排重,隨心所欲,有包就發(fā),不像TCP會(huì)優(yōu)先發(fā)隊(duì)首。
UDP不跟蹤連接狀態(tài),不建立連接也不關(guān)心對(duì)方是否能收到!
UDP不需要流量控制,不管網(wǎng)絡(luò)的情況,沒有擁塞控制。
應(yīng)用
即使UDP這么的不靠譜,但是某些場(chǎng)景下的確需要這么搞。UDP有三大使用場(chǎng)景。
- 多播,因?yàn)閁DP不用建立連接,所以非常適合用來(lái)廣播,要想,如果你是一個(gè)一萬(wàn)臺(tái)機(jī)器組建的集群,建立連接的消耗的代價(jià)是非常大的。
- 網(wǎng)絡(luò)好或者允許丟包的的內(nèi)網(wǎng)應(yīng)用,在公司內(nèi)網(wǎng),網(wǎng)絡(luò)一般都非常好,這個(gè)時(shí)候非常適合使用UDP協(xié)議,消耗更小。
- 需要處理速度更快,可以容忍少數(shù)丟包。UDP初生牛犢不怕虎,就跟敢死隊(duì)一樣,無(wú)論環(huán)境怎么樣,都會(huì)一個(gè)勁地上,TCP就不這樣了,一旦隊(duì)列發(fā)生擁堵,就會(huì)等前面地處理完再處理。
總結(jié)
UDP雖然非常的簡(jiǎn)單,但是UDP的應(yīng)用仍然非常廣泛,可以關(guān)注我,后面我們?cè)僖黄饘W(xué)習(xí),一起分享。大家的支持是我繼續(xù)嘮嗑的動(dòng)力。同名公眾號(hào)(沙茶敏碎碎念)