UDP協(xié)議的那點(diǎn)事兒
UDP( User Datagram Protocol )協(xié)議,翻譯過來(lái)就是用戶數(shù)據(jù)報(bào)協(xié)議 ,跟 TCP 協(xié)議一樣,都是位于 OSI 模型的傳輸層。不過比起 TCP 協(xié)議,UDP 協(xié)議就顯得簡(jiǎn)單多了,因?yàn)樗鼪]有「流量控制」、「擁塞控制」等復(fù)雜的處理機(jī)制。它甚至沒有重傳機(jī)制,也就是說,如果你的數(shù)據(jù)包半路走丟了,那就是真找不回來(lái)了,所以說 UDP 協(xié)議是不可靠的。當(dāng)然了,這個(gè)重傳機(jī)制是針對(duì)傳輸層而言的,你完全可以在應(yīng)用層寫一個(gè)協(xié)議來(lái)進(jìn)行丟包處理,比如說像 TCP 一樣,增加 ACK 和序列號(hào)機(jī)制。
那你可能會(huì)疑惑了,為什么放著可靠的 TCP 協(xié)議不用,而選擇 UDP 協(xié)議?
UDP 報(bào)文段結(jié)構(gòu)
這當(dāng)然要根據(jù)應(yīng)用的需求來(lái),不過在說這個(gè)話題之前,我們先來(lái)詳細(xì)了解一下 UDP 協(xié)議。
說實(shí)話,UDP 的報(bào)文段結(jié)構(gòu)比 TCP 報(bào)文段簡(jiǎn)潔多了(見下圖),畢竟 UDP 協(xié)議就沒有什么多余的機(jī)制。
言歸正傳,報(bào)文段里的「源端口號(hào)」和「目的端口號(hào)」是為了告訴傳輸層,我這個(gè)報(bào)文是從哪兒(哪個(gè)進(jìn)程)來(lái)的,要到哪兒(哪個(gè)進(jìn)程)去。但要注意一點(diǎn):一個(gè) UDP 套接字是由一個(gè)二元組標(biāo)識(shí)的,這個(gè)二元組指的是目的 IP 地址和目的端口號(hào),也就是說,服務(wù)器上對(duì)應(yīng)的進(jìn)程,不在乎你是從哪個(gè)客戶端來(lái)的,我都放進(jìn)同一個(gè)套接字處理,處理完了再根據(jù)源端口號(hào)和源 IP 地址,把應(yīng)答信息發(fā)送給客戶端。相較而言,TCP 套接字需要一個(gè)四元組來(lái)標(biāo)識(shí):源 IP 地址,源端口號(hào),目的 IP 地址和目的端口號(hào)。這一點(diǎn)在講 TCP 協(xié)議的時(shí)候還會(huì)細(xì)講,所以這里就不贅述了。
PS:你可能會(huì)問,這報(bào)文段里怎么沒有 IP 地址啊?這是因?yàn)镮P 地址保存在網(wǎng)絡(luò)層的 IP 協(xié)議段里,傳輸層的報(bào)文段里當(dāng)然就沒有了。
無(wú)連接
每次提到 TCP 協(xié)議,我們最先想到的就是三次握手和四次揮手,對(duì) UDP 協(xié)議來(lái)說,這都是沒有的事兒~ 使用 UDP 協(xié)議的時(shí)候,如果客戶端要發(fā)送報(bào)文段給服務(wù)端,不用握手,直接就發(fā)出去了,也正因?yàn)檫@樣,UDP 協(xié)議被稱為是無(wú)連接的。
很容易想到,不需要握手這一過程的話,就沒有因?yàn)榻⑦B接而造成的時(shí)延,一個(gè)字,快!這也是 DNS(域名系統(tǒng))運(yùn)行在 UDP 協(xié)議之上的很大一部分原因。
但是 UDP 協(xié)議不可靠啊,傳輸過程中丟包了怎么辦?最簡(jiǎn)單的做法就是——忽略它!(否則就得像文章開頭說的那樣,在應(yīng)用層實(shí)現(xiàn)重傳機(jī)制)就拿 DNS 來(lái)說吧,如果數(shù)據(jù)包丟失,客戶端重發(fā)就是了(有超時(shí)機(jī)制),而且在正常情況下,丟包的概率很低。但如果使用 TCP 協(xié)議的話,因?yàn)橐⑦B接,域名查詢就會(huì)慢很多,除此之外,使用 UDP 協(xié)議的網(wǎng)絡(luò)開銷更小——UDP 報(bào)文段有 8 個(gè)字節(jié)的首部開銷,而 TCP 協(xié)議有 20 字節(jié)的開銷(看前面的關(guān)于報(bào)文段的兩張圖)。網(wǎng)絡(luò)開銷小,意味著 DNS 服務(wù)器能接受更多客戶端的請(qǐng)求。
還有一個(gè)方面,TCP 協(xié)議有擁塞控制機(jī)制,它會(huì)在網(wǎng)絡(luò)擁塞時(shí)遏制 TCP 發(fā)送方,以至于延遲報(bào)文段的傳送,所以對(duì)于一些要求傳輸延遲小,且能夠容忍一些數(shù)據(jù)丟失的實(shí)時(shí)程序來(lái)說,UDP 協(xié)議可能是一個(gè)更好的選擇。路由選擇協(xié)議(RIP)、 網(wǎng)絡(luò)管理協(xié)議(SNMP) 也都選擇了 UDP 來(lái)作為底層的傳輸協(xié)議。
最后,這是一張客戶端與服務(wù)端利用 UDP 協(xié)議通信的流程圖:
UDP 協(xié)議要講的內(nèi)容不多,下次要講的 TCP 協(xié)議,就比較燒腦了,做好準(zhǔn)備吧!