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