天天看點

網絡協定之:基于UDP的高速資料傳輸協定UDT簡介UDT協定UDT的缺點總結

簡介

簡單就是美。在網絡協定的世界中,TCP和UDP是建立在IP協定基礎上的兩個非常通用的協定。我們現在經常使用的HTTP協定就是建立在TCP協定的基礎上的。相當于TCP的穩定性來說,UDP因為其資料傳輸的不可靠性,是以用在某些特定的場合,如直播、廣播消息、視訊音頻流處理等不太需要校驗資料完整性的場合。

UDP相對TCP協定而言,其特點就是簡潔,它删除了在TCP協定中為了保證消息準确性的各種限制性特征。簡潔帶來的好處就是快!今天給大家講解一下,基于UDP的高速資料傳輸協定UDT。

UDT協定

UDP因為其簡單的特性,是以可以做到很多TCP做不到的事情,比如進行大資料量的快速傳輸。這裡并不是要将TCP和UDP分個好壞高下,畢竟各個協定的适應場景不同,他們之是以流行,就是因為可以在特定的場景發揮出重要的作用。套用中國的一句諺語就是:不管白貓黑貓,能抓到老鼠的,就是好貓。

用好UDP協定,我們就可以快速的傳遞大量的資料,這個協定就是UDT協定。

話說,像這些基礎協定都是老外發明的,而中國的網際網路巨頭都在搶着做平台、做流量的生意,真的是無話可說….

UDT項目開始于2001年,是由Yunhong Gu在芝加哥伊利諾伊大學國家資料挖掘中心 (NCDM)讀博士期間開發的,并在畢業之後持續的進行維護和更新改進。

UDP的出現是因為那時候,傳輸更快更便宜的光纖網絡出現了,代替了之前的銅纜線和雙絞線,進而極大的提升了資訊傳輸的效率。這時候大家就發現之前使用TCP協定來進行大資料的傳輸會有很大的問題。進而基于UDP的UDT協定出現了。

UDT的第一個版本,也稱為SABUL(Simple Available Bandwidth Utility Library),UDT通過支援批量資料傳輸,進而友善在私有網絡中進行資料的傳輸。

要注意的是UDT的第一個版本SABUL使用UDP協定進行傳輸資料,同時使用單獨的TCP協定連接配接傳輸控制消息。

UDT的初始版本是在超高速網絡(1 Gbit/s、10 Gbit/s等)上進行開發和測試的,2003年10月,NCDM實作了從美國芝加哥到荷蘭阿姆斯特丹的平均每秒6.8G比特的傳輸。在30分鐘内的測試中,他們傳輸了大約1.4TB的資料。

從2004年釋出的2.0版本開始,SABUL改名為UDT,UDT的全稱是UDP-based Data Transfer Protocol,也就是基于UDP的資料傳輸協定。

為什麼要改成UDT呢?因為在UDT2.0中,删除了SABUL中的TCP 控制連接配接,并使用UDP來處理資料和控制資訊。 另外,UDT2還引入了一種新的擁塞控制算法,允許協定動态調整UDT和TCP流,實作UDT和TCP流的并發運作。

在2006年,UDT協定更新到了3版本,該協定不僅是在私有網絡中運作了,而是擴充到了商業網際網路中。同時UDT3中的擁塞控制可以進行調整優化,可以在低帶寬的環境中運作,并且允許使用者輕松定義和安裝自己的擁塞控制算法。另外,UDT3還顯着減少了系統資源(CPU和記憶體)的使用。

2007年,UDT4版本在高并發和防火牆穿透方面進行優化和性能的提升。UDT4允許多個UDT連接配接綁定到同一個UDP端口,它還支援集合連接配接設定,以便UDP hole punching。

什麼是UDP hole punching呢?

UDP hole punching通常被用在網絡位址轉換 (NAT)中。用來維護穿越NAT的使用者UDP資料包流。它是一種使用網絡位址轉換器在專用網絡中的Internet主機之間建立雙向UDP連接配接的方法。

什麼是NAT呢?

大家都知道IPV4位址是有限的,很快IPV4位址就快用完了,那怎麼解決這個問題呢?

當然,一個永久解決的辦法是IPV6,不過IPV6推出這麼多年了,好像還沒有真正的普及。

不使用IPV6的話還有什麼解決辦法呢?

這個辦法就是NAT(Network Address Translators)。

NAT的原理是将區域網路的IP和端口和NAT裝置的IP和端口做個映射。

NAT内部維護着一張轉換表。這樣就可以通過一個NAT的IP位址和不同的端口來連接配接衆多的區域網路伺服器。

那麼NAT有什麼問題呢?

NAT的問題在于,内部用戶端不知道自己外網IP位址,隻知道内網IP位址。

如果是在UDP協定中,因為UDP是無狀态的,是以需要NAT來重寫每個UDP分組中的源端口、位址,以及IP分組中的源IP位址。

如果用戶端是在應用程式内部将自己的IP位址告訴伺服器,并想跟伺服器建立連接配接,那麼肯定是建立不了的。因為找不到用戶端的公網IP。

即使找到了公網IP,任何到達NAT裝置外網IP的分組還必須有一個目标端口,而且NAT轉換表中也要有一個條目可以将其轉換為内部主機的IP位址和端口号。否則就可能出現下圖的連接配接失敗的問題。

怎麼解決呢?

第一種方式是使用STUN伺服器。

STUN伺服器是IP位址已知的伺服器,用戶端要通信之前,先去STUN伺服器上面查詢一下自己的外網IP和端口,然後再使用這個外網IP和端口進行通信。

但有時UDP包會被防火牆或者其他的應用程式所阻擋。這個時候就可以使用中繼器技術Traversal Using Relays around NAT (TURN) 。

雙方都将資料發送到中繼器server,由中繼器server來負責轉發資料。注意,這裡已經不是P2P了。

最後,我們有一個集大成者的協定叫做ICE(Interactive Connectivity Establishment ):

它實際上就是直連,STUN和TURN的綜合體,能直連的時候就直連,不能直連就用STUN,不能用STUN就用TURN。

在使用STUN和ICE的過程中,我們會有一台網絡主機用來建立端口映射和保持其他UDP端口狀态,但是UDP的狀态通常在幾十秒到幾分鐘的短時間後過期,為了保證NAT中UDP的狀态和生命周期,于是有了UDP hole punching的技術。通過定時傳輸keep-alive資料包,對NAT中的UDP狀态進行更新。

UDT的缺點

因為UDT是基于UDP協定的,但是UDP協定因為其簡潔的特性,是以并不具備安全性的特征。是以基于其上的UDT協定因為缺乏安全特性,是以在商業環境中應用會受到一定的限制。

不過UDT的新版本已經在開發中,大家可以期待一下。

總結

UDT被廣泛用于高性能計算,比如光纖網絡上的高速資料傳輸。我們後續會在netty中告訴大家怎麼使用UDT協定。

本文已收錄于 http://www.flydean.com/11-udt/

最通俗的解讀,最深刻的幹貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!

歡迎關注我的公衆号:「程式那些事」,懂技術,更懂你!

繼續閱讀