基于UDP的高速數(shù)據(jù)傳輸協(xié)議UDT
簡(jiǎn)介
簡(jiǎn)單就是美。在網(wǎng)絡(luò)協(xié)議的世界中,TCP和UDP是建立在IP協(xié)議基礎(chǔ)上的兩個(gè)非常通用的協(xié)議。我們現(xiàn)在經(jīng)常使用的HTTP協(xié)議就是建立在TCP協(xié)議的基礎(chǔ)上的。相當(dāng)于TCP的穩(wěn)定性來(lái)說(shuō),UDP因?yàn)槠鋽?shù)據(jù)傳輸?shù)牟豢煽啃?,所以用在某些特定的?chǎng)合,如直播、廣播消息、視頻音頻流處理等不太需要校驗(yàn)數(shù)據(jù)完整性的場(chǎng)合。
UDP相對(duì)TCP協(xié)議而言,其特點(diǎn)就是簡(jiǎn)潔,它刪除了在TCP協(xié)議中為了保證消息準(zhǔn)確性的各種限制性特征。簡(jiǎn)潔帶來(lái)的好處就是快!今天給大家講解一下,基于UDP的高速數(shù)據(jù)傳輸協(xié)議UDT。
UDT協(xié)議
UDP因?yàn)槠浜?jiǎn)單的特性,所以可以做到很多TCP做不到的事情,比如進(jìn)行大數(shù)據(jù)量的快速傳輸。這里并不是要將TCP和UDP分個(gè)好壞高下,畢竟各個(gè)協(xié)議的適應(yīng)場(chǎng)景不同,他們之所以流行,就是因?yàn)榭梢栽谔囟ǖ膱?chǎng)景發(fā)揮出重要的作用。套用中國(guó)的一句諺語(yǔ)就是:不管白貓黑貓,能抓到老鼠的,就是好貓。
用好UDP協(xié)議,我們就可以快速的傳遞大量的數(shù)據(jù),這個(gè)協(xié)議就是UDT協(xié)議。
話說(shuō),像這些基礎(chǔ)協(xié)議都是老外發(fā)明的,而中國(guó)的互聯(lián)網(wǎng)巨頭都在搶著做平臺(tái)、做流量的生意,真的是無(wú)話可說(shuō)….
UDT項(xiàng)目開(kāi)始于2001年,是由Yunhong Gu在芝加哥伊利諾伊大學(xué)國(guó)家數(shù)據(jù)挖掘中心 (NCDM)讀博士期間開(kāi)發(fā)的,并在畢業(yè)之后持續(xù)的進(jìn)行維護(hù)和升級(jí)改進(jìn)。
UDP的出現(xiàn)是因?yàn)槟菚r(shí)候,傳輸更快更便宜的光纖網(wǎng)絡(luò)出現(xiàn)了,代替了之前的銅纜線和雙絞線,從而極大的提升了信息傳輸?shù)男?。這時(shí)候大家就發(fā)現(xiàn)之前使用TCP協(xié)議來(lái)進(jìn)行大數(shù)據(jù)的傳輸會(huì)有很大的問(wèn)題。從而基于UDP的UDT協(xié)議出現(xiàn)了。
UDT的第一個(gè)版本,也稱(chēng)為SABUL(Simple Available Bandwidth Utility Library),UDT通過(guò)支持批量數(shù)據(jù)傳輸,從而方便在私有網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)的傳輸。
要注意的是UDT的第一個(gè)版本SABUL使用UDP協(xié)議進(jìn)行傳輸數(shù)據(jù),同時(shí)使用單獨(dú)的TCP協(xié)議連接傳輸控制消息。
UDT的初始版本是在超高速網(wǎng)絡(luò)(1 Gbit/s、10 Gbit/s等)上進(jìn)行開(kāi)發(fā)和測(cè)試的,2003年10月,NCDM實(shí)現(xiàn)了從美國(guó)芝加哥到荷蘭阿姆斯特丹的平均每秒6.8G比特的傳輸。在30分鐘內(nèi)的測(cè)試中,他們傳輸了大約1.4TB的數(shù)據(jù)。
從2004年發(fā)布的2.0版本開(kāi)始,SABUL改名為UDT,UDT的全稱(chēng)是UDP-based Data Transfer Protocol,也就是基于UDP的數(shù)據(jù)傳輸協(xié)議。
為什么要改成UDT呢?因?yàn)樵赨DT2.0中,刪除了SABUL中的TCP 控制連接,并使用UDP來(lái)處理數(shù)據(jù)和控制信息。 另外,UDT2還引入了一種新的擁塞控制算法,允許協(xié)議動(dòng)態(tài)調(diào)整UDT和TCP流,實(shí)現(xiàn)UDT和TCP流的并發(fā)運(yùn)行。
在2006年,UDT協(xié)議升級(jí)到了3版本,該協(xié)議不僅是在私有網(wǎng)絡(luò)中運(yùn)行了,而是擴(kuò)展到了商業(yè)互聯(lián)網(wǎng)中。同時(shí)UDT3中的擁塞控制可以進(jìn)行調(diào)整優(yōu)化,可以在低帶寬的環(huán)境中運(yùn)行,并且允許用戶(hù)輕松定義和安裝自己的擁塞控制算法。另外,UDT3還顯著減少了系統(tǒng)資源(CPU和內(nèi)存)的使用。
2007年,UDT4版本在高并發(fā)和防火墻穿透方面進(jìn)行優(yōu)化和性能的提升。UDT4允許多個(gè)UDT連接綁定到同一個(gè)UDP端口,它還支持集合連接設(shè)置,以便UDP hole punching。
什么是UDP hole punching呢?
UDP hole punching通常被用在網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT)中。用來(lái)維護(hù)穿越NAT的用戶(hù)UDP數(shù)據(jù)包流。它是一種使用網(wǎng)絡(luò)地址轉(zhuǎn)換器在專(zhuān)用網(wǎng)絡(luò)中的Internet主機(jī)之間建立雙向UDP連接的方法。
什么是NAT呢?
大家都知道IPV4地址是有限的,很快IPV4地址就快用完了,那怎么解決這個(gè)問(wèn)題呢?
當(dāng)然,一個(gè)永久解決的辦法是IPV6,不過(guò)IPV6推出這么多年了,好像還沒(méi)有真正的普及。
不使用IPV6的話還有什么解決辦法呢?
這個(gè)辦法就是NAT(Network Address Translators)。
NAT的原理是將局域網(wǎng)的IP和端口和NAT設(shè)備的IP和端口做個(gè)映射。
NAT內(nèi)部維護(hù)著一張轉(zhuǎn)換表。這樣就可以通過(guò)一個(gè)NAT的IP地址和不同的端口來(lái)連接眾多的局域網(wǎng)服務(wù)器。
那么NAT有什么問(wèn)題呢?
- NAT的問(wèn)題在于,內(nèi)部客戶(hù)端不知道自己外網(wǎng)IP地址,只知道內(nèi)網(wǎng)IP地址。
如果是在UDP協(xié)議中,因?yàn)閁DP是無(wú)狀態(tài)的,所以需要NAT來(lái)重寫(xiě)每個(gè)UDP分組中的源端口、地址,以及IP分組中的源IP地址。
如果客戶(hù)端是在應(yīng)用程序內(nèi)部將自己的IP地址告訴服務(wù)器,并想跟服務(wù)器建立連接,那么肯定是建立不了的。因?yàn)檎也坏娇蛻?hù)端的公網(wǎng)IP。
即使找到了公網(wǎng)IP,任何到達(dá)NAT設(shè)備外網(wǎng)IP的分組還必須有一個(gè)目標(biāo)端口,而且NAT轉(zhuǎn)換表中也要有一個(gè)條目可以將其轉(zhuǎn)換為內(nèi)部主機(jī)的IP地址和端口號(hào)。否則就可能出現(xiàn)下圖的連接失敗的問(wèn)題。
怎么解決呢?
第一種方式是使用STUN服務(wù)器。
STUN服務(wù)器是IP地址已知的服務(wù)器,客戶(hù)端要通信之前,先去STUN服務(wù)器上面查詢(xún)一下自己的外網(wǎng)IP和端口,然后再使用這個(gè)外網(wǎng)IP和端口進(jìn)行通信。
但有時(shí)UDP包會(huì)被防火墻或者其他的應(yīng)用程序所阻擋。這個(gè)時(shí)候就可以使用中繼器技術(shù)Traversal Using Relays around NAT (TURN) 。
雙方都將數(shù)據(jù)發(fā)送到中繼器server,由中繼器server來(lái)負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù)。注意,這里已經(jīng)不是P2P了。
最后,我們有一個(gè)集大成者的協(xié)議叫做ICE(Interactive Connectivity Establishment ):
它實(shí)際上就是直連,STUN和TURN的綜合體,能直連的時(shí)候就直連,不能直連就用STUN,不能用STUN就用TURN。
在使用STUN和ICE的過(guò)程中,我們會(huì)有一臺(tái)網(wǎng)絡(luò)主機(jī)用來(lái)建立端口映射和保持其他UDP端口狀態(tài),但是UDP的狀態(tài)通常在幾十秒到幾分鐘的短時(shí)間后過(guò)期,為了保證NAT中UDP的狀態(tài)和生命周期,于是有了UDP hole punching的技術(shù)。通過(guò)定時(shí)傳輸keep-alive數(shù)據(jù)包,對(duì)NAT中的UDP狀態(tài)進(jìn)行更新。
UDT的缺點(diǎn)
因?yàn)閁DT是基于UDP協(xié)議的,但是UDP協(xié)議因?yàn)槠浜?jiǎn)潔的特性,所以并不具備安全性的特征。所以基于其上的UDT協(xié)議因?yàn)槿狈Π踩匦?,所以在商業(yè)環(huán)境中應(yīng)用會(huì)受到一定的限制。
不過(guò)UDT的新版本已經(jīng)在開(kāi)發(fā)中,大家可以期待一下。
總結(jié)
UDT被廣泛用于高性能計(jì)算,比如光纖網(wǎng)絡(luò)上的高速數(shù)據(jù)傳輸。我們后續(xù)會(huì)在netty中告訴大家怎么使用UDT協(xié)議。