前言
TCP協(xié)議在不可靠的網(wǎng)絡(luò)環(huán)境上提供了可靠的通信通道,隱藏了大量的底層細(xì)節(jié),使應(yīng)用程序更加簡潔。但有些應(yīng)用并不需要這么高的可靠性,并不需要按序交付,而且TCP為了提高可靠性也增加了延時,在某些對延時或抖動要求很高的情景下并不適用。為此,UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)被提出。UDP雖然應(yīng)用較為廣泛,比如DNS查詢等,但一直不是重要的角色。自從WebRTC被提出以來,它可以使瀏覽器在UDP的基礎(chǔ)上實(shí)現(xiàn)原生的語音和視頻實(shí)時通信及其他形式的P2P通信,UDP在這種境況下顯得更加重要。本文大致介紹UDP的原理及應(yīng)用,以求加深對其理解。
UDP
TCP是面向連接的,需要三次握手建立連接之后再傳輸數(shù)據(jù),而是UDP面向無連接的,它并不能保證信息交付,也不能保證按序交互,也不跟蹤連接狀態(tài),也不需要擁塞控制。
要了解UDP和為什么它通常被稱為“空協(xié)議”,我們首先需要了解一下互聯(lián)網(wǎng)協(xié)議(IP),它位于TCP和UDP協(xié)議層下面。IP層主要任務(wù)就是基于地址將數(shù)據(jù)報(bào)從源主機(jī)發(fā)送到目的主機(jī)。要做到這一點(diǎn),消息都封裝在一個IP包,標(biāo)識源和目的地址,以及一些其他路由參數(shù)。
我們再次強(qiáng)調(diào)一下上面提到的數(shù)據(jù)報(bào)這個術(shù)語的含義:IP層提供了不可靠的數(shù)據(jù)傳輸,既沒有消息確認(rèn),也沒有丟失通知, IP層直接把這一層的不可靠性暴露給上層。如果一個數(shù)據(jù)報(bào)在傳輸過程中因?yàn)槟硞€路由節(jié)點(diǎn)擁塞,高負(fù)荷,或因其他原因丟失,那么由IP上層的協(xié)議來檢測,恢復(fù),并重傳數(shù)據(jù) - 當(dāng)然這是在上層有這個需求的時候!IPv4的首部結(jié)構(gòu)如下:
UDP協(xié)議會用自己的分組結(jié)構(gòu)封裝用戶信息,其數(shù)據(jù)格式如下:
如上圖所示,我們在UDP數(shù)據(jù)報(bào)里增加了源端口和目標(biāo)端口,這樣就使得當(dāng)IP分組被送到接收端后,接收端就可以拆開UDP分組,根據(jù)目標(biāo)端口找到對應(yīng)的應(yīng)用程序,然后再把數(shù)據(jù)傳遞給應(yīng)用程序。
從IP和UDP的數(shù)據(jù)格式可以看到,它們的首部都帶有校驗(yàn)和,都可以用來校驗(yàn)數(shù)據(jù),那么應(yīng)用程序即使忽略UDP的校驗(yàn)和也不影響數(shù)據(jù)完整性,校驗(yàn)和字段是可選的。這意味著UDP層所有的錯誤檢測和糾錯,可以委托給上述應(yīng)用層校驗(yàn)。說到底,UDP僅僅是在IP層上通過嵌入應(yīng)用程序的源端口和目標(biāo)端口,提供了一個“應(yīng)用程序多路復(fù)用”機(jī)制。由此可以得到UDP的特征如下:
不保證消息交付:不確認(rèn),不重傳,無超時;
不保證交付順序:不設(shè)置包序號,不重排,不發(fā)生隊(duì)首阻塞;
不跟蹤連接狀態(tài):不必建立連接或重啟狀態(tài)機(jī);
不需要擁塞控制:不內(nèi)置客戶端或網(wǎng)絡(luò)反饋機(jī)。
TCP是一個面向字節(jié)流的協(xié)議,能夠通過多個分組的形式發(fā)送應(yīng)用程序的消息數(shù)據(jù),包內(nèi)本身沒有任何明確的消息邊界。為了實(shí)現(xiàn)這一目標(biāo),連接兩端都分配了連接狀態(tài),并且數(shù)據(jù)包被排序,重發(fā)丟包,按順序發(fā)送。相反UDP數(shù)據(jù)報(bào)有明確的界限:每一個數(shù)據(jù)報(bào)都被打包到一個IP包中,應(yīng)用層讀到的每一個UDP包都是完整的信息 -數(shù)據(jù)報(bào)不能被分割。
關(guān)于數(shù)據(jù)報(bào)(Datagram)詳細(xì)定義如下:
數(shù)據(jù)報(bào):一個自包含的,獨(dú)立的數(shù)據(jù)實(shí)體,其承載了足夠的信息,使其可以從源路由到達(dá)目標(biāo)路由,而不依賴于在網(wǎng)絡(luò)節(jié)點(diǎn)前的數(shù)據(jù)交換和傳輸網(wǎng)絡(luò)沒有任何依賴。
數(shù)據(jù)報(bào)文(Datagram)和數(shù)據(jù)包(Packet)兩個術(shù)語往交替使用,但其實(shí)二者有一些細(xì)微差別。數(shù)據(jù)包(packet)一般用來描述任何格式的數(shù)據(jù)塊,而數(shù)據(jù)報(bào)(Datagram)往往被保留用來描述通過一個不可靠的服務(wù)傳輸?shù)臄?shù)據(jù)包(Packet) - 沒有傳輸保障,沒有失敗通知。所以UDP包一般或者說更準(zhǔn)確的被稱為數(shù)據(jù)報(bào)(Datagram)。
UDP是一個簡單的,無狀態(tài)的協(xié)議,適合于引導(dǎo)上層的其他應(yīng)用層協(xié)議 - 幾乎所有的協(xié)議決策都留給它上面的應(yīng)用層。然而,在你想實(shí)現(xiàn)自己的協(xié)議來取代TCP,你應(yīng)該仔細(xì)考慮有關(guān)的復(fù)雜性,如UDP與其它層的交互(比如NAT穿越),以及網(wǎng)絡(luò)協(xié)議一些最佳實(shí)踐。沒有仔細(xì)的規(guī)劃和設(shè)計(jì),設(shè)計(jì)一個新的協(xié)議不是一個好主意,最終也許實(shí)現(xiàn)成一個的簡陋的TCP版本。
編輯:hfy
-
TCP
+關(guān)注
關(guān)注
8文章
1347瀏覽量
78933 -
DNS
+關(guān)注
關(guān)注
0文章
215瀏覽量
19771 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1009瀏覽量
35226 -
數(shù)據(jù)報(bào)
+關(guān)注
關(guān)注
0文章
4瀏覽量
7246 -
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
91瀏覽量
12054
發(fā)布評論請先 登錄
相關(guān)推薦
評論