UDP協(xié)議的正確使用場(chǎng)合(謹(jǐn)慎使用)
高通信實(shí)時(shí)性要求和低持續(xù)性要求的場(chǎng)景下:
1,在分組交換通信當(dāng)中,協(xié)議棧的成本主要表現(xiàn)在以下兩方面:
- [1] 封裝帶來(lái)的空間復(fù)雜度;
- [2] 緩存帶來(lái)的時(shí)間復(fù)雜度。
以上兩者是對(duì)立影響的,如果想減少封裝消耗,那么就必須緩存用戶數(shù)據(jù)到一定量在一次性封裝發(fā)送出去,這樣每個(gè)協(xié)議包的有效載荷將達(dá)到***化,這無(wú)疑是節(jié)省了帶寬空間,帶寬利用率較高,但是延時(shí)增大了。如果想降低延時(shí),那么就需要將用戶數(shù)據(jù)立馬封裝發(fā)出去,這樣顯然會(huì)造成消耗更多的協(xié)議頭等消耗,浪費(fèi)帶寬空間。
因此,我們進(jìn)行協(xié)議選擇的時(shí)候,需要重點(diǎn)考慮一下空間復(fù)雜度和時(shí)間復(fù)雜度間的平衡。
2,通信的持續(xù)性對(duì)兩者的影響比較大,根據(jù)通信的持續(xù)性有兩種通信類型:
- [1] 短連接通信;
- [2] 長(zhǎng)連接通信。
對(duì)于短連接通信,一方面如果業(yè)務(wù)只需要發(fā)一兩個(gè)包并且對(duì)丟包有一定的容忍度,同時(shí)業(yè)務(wù)自己有簡(jiǎn)單的輪詢或重復(fù)機(jī)制,那么采用UDP會(huì)較為好些。在這樣的場(chǎng)景下,如果用TCP,僅僅握手就需要3個(gè)包,這樣顯然有點(diǎn)不劃算,一個(gè)典型的例子是DNS查詢。另一方面,如果業(yè)務(wù)實(shí)時(shí)性要求非常高,并且不能忍受重傳,那么首先就是UDP了或者只能用UDP了,例如NTP 協(xié)議,重傳NTP消息純屬添亂(為什么呢?重傳一個(gè)過(guò)期的時(shí)間***來(lái),還不如發(fā)一個(gè)新的UDP包同步新的時(shí)間過(guò)來(lái))。如果NTP協(xié)議采用TCP,撇開(kāi)握手消耗較多數(shù)據(jù)包交互的問(wèn)題,由于TCP受Nagel算法等影響,用戶數(shù)據(jù)會(huì)在一定情況下會(huì)被內(nèi)核緩存延后發(fā)送出去,這樣時(shí)間同步就會(huì)出現(xiàn)比較大的偏差,協(xié)議將不可用。
多點(diǎn)通信的場(chǎng)景下
對(duì)于一些多點(diǎn)通信的場(chǎng)景,如果采用有連接的TCP,那么就需要和多個(gè)通信節(jié)點(diǎn)建立其雙向連接,然后有時(shí)在NAT環(huán)境下,兩個(gè)通信節(jié)點(diǎn)建立其直接的TCP連接不是一個(gè)容易的事情,在涉及NAT穿越的時(shí)候,UDP協(xié)議的無(wú)連接性使得穿透成功率更高(原因詳見(jiàn):由于UDP的無(wú)連接性,那么其完全可以向一個(gè)組播地址發(fā)送數(shù)據(jù)或者輪轉(zhuǎn)地向多個(gè)目的地持續(xù)發(fā)送相同的數(shù)據(jù),從而更為容易實(shí)現(xiàn)多點(diǎn)通信。)
一個(gè)典型的場(chǎng)景是多人實(shí)時(shí)音視頻通信,這種場(chǎng)景下實(shí)時(shí)性要求比較高,可以容忍一定的丟包率。比如:對(duì)于音頻,對(duì)端連續(xù)發(fā)送p1、p2、p3三個(gè)包,另一端收到了p1和p3,在沒(méi)收到p2的保持p1的***一個(gè)音(也是為什么有時(shí)候網(wǎng)絡(luò)丟包就會(huì)聽(tīng)到嗞嗞嗞嗞嗞嗞…或者卟卟卟卟卟卟卟卟…重音的原因),等到到p3就接著播p3了,不需要也不能補(bǔ)幀,一補(bǔ)就越來(lái)越大的延時(shí)。對(duì)于這樣的場(chǎng)景就比較合適用UDP了,如果采用TCP,那么在出現(xiàn)丟包的時(shí)候,就可能會(huì)出現(xiàn)比較大的延時(shí)。
UDP的使用原則小結(jié)
通常情況下,UDP的使用范圍是較小的,在以下的場(chǎng)景下,使用UDP才是明智的。
- [1] 實(shí)時(shí)性要求很高,并且?guī)缀醪荒苋萑讨貍鳎?/li>
- 例子:NTP協(xié)議,實(shí)時(shí)音視頻通信,多人動(dòng)作類游戲中人物動(dòng)作、位置。
- [2] TCP實(shí)在不方便實(shí)現(xiàn)多點(diǎn)傳輸?shù)那闆r;
- [3] 需要進(jìn)行NAT穿越;
- [4] 對(duì)網(wǎng)絡(luò)狀態(tài)很熟悉,確保udp網(wǎng)絡(luò)中沒(méi)有氓流行為,瘋狂搶帶寬;
- [5] 熟悉UDP編程。





















