2.6 UDP協(xié)議的收發(fā)操作
不需要重發(fā)的數(shù)據(jù)用UDP發(fā)送更高效
如果漏掉了一個包就要全部重發(fā)一遍邑彪,怎么看都很低效。為了實現(xiàn)高效的傳輸胧华,我們要避免重發(fā)已經(jīng)送達(dá)的包寄症,而是只重發(fā)那些出錯的或者未送達(dá)的包。TCP之所以復(fù)雜矩动,就是因為要實現(xiàn)這一點有巧。
數(shù)據(jù)很短,用一個包就能裝得下悲没。如果只有一個包篮迎,就不用考慮哪個包未送達(dá)了,因為全部重發(fā)也只不過是重發(fā)一個包而已示姿,這種情況下我們就不需要TCP這樣復(fù)雜的機(jī)制了甜橱。
我們發(fā)送了數(shù)據(jù),對方一般都會給出回復(fù)栈戳,只要將回復(fù)的數(shù)據(jù)當(dāng)作接收確認(rèn)就行了岂傲,也不需要專門的接收確認(rèn)包了。
控制用的短數(shù)據(jù)
像DNS查詢等交換控制信息的操作基本上都可以在一個包的大小范圍內(nèi)解決子檀,這種場景中就可以用UDP來代替TCP镊掖。UDP沒有TCP的接收確認(rèn)、窗口等機(jī)制堰乔,因此在收發(fā)數(shù)據(jù)之前也不需要交換控制信息脐恩,也就是說不需要建立和斷開連接的步驟驶冒,只要在從應(yīng)用程序獲取的數(shù)據(jù)前面加上UDP頭部,然后交給IP進(jìn)行發(fā)送就可以了(表2.5)崇猫。接收也很簡單需忿,只要根據(jù)IP頭部中的接收方和發(fā)送方IP地址,以及UDP頭部中的接收方和發(fā)送方端口號涕烧,找到相應(yīng)的套接字并將數(shù)據(jù)交給相應(yīng)的應(yīng)用程序就可以了。
UDP協(xié)議沒有其他功能了父款,遇到錯誤或者丟包也一概不管憨攒。因為UDP只負(fù)責(zé)單純地發(fā)送包而已阀参,并不像TCP一樣會對包的送達(dá)狀態(tài)進(jìn)行監(jiān)控,所以協(xié)議棧也不知道有沒有發(fā)生錯誤包晰。但這樣并不會引發(fā)什么問題炕吸,因此出錯時就收不到來自對方的回復(fù)赫模,應(yīng)用程序會注意到這個問題,并重新發(fā)送一遍數(shù)據(jù)胸嘴。
音頻和視頻數(shù)據(jù)
音頻和視頻數(shù)據(jù)中缺少了某些包并不會產(chǎn)生嚴(yán)重的問題斩祭,只是會產(chǎn)生一些失真或者卡頓而已摧玫,一般都是可以接受的。
在這些無需重發(fā)數(shù)據(jù)屋群,或者是重發(fā)了也沒什么意義的情況下坏挠,使用UDP發(fā)送數(shù)據(jù)的效率會更高。
音視頻采用udp对竣,丟包會產(chǎn)生卡頓,就算TCP重發(fā)數(shù)據(jù)姐刁,卡頓已經(jīng)產(chǎn)生烦味,重發(fā)并不能彌補(bǔ)谬俄∑恚卡頓時也是覺得當(dāng)前網(wǎng)絡(luò)質(zhì)量不佳,信號差的鍋钥勋。