摘要:Network Address Translation(NAT)技術(shù)能夠解決公網(wǎng)IP地址緊缺的問(wèn)題,確保網(wǎng)絡(luò)安全,但也阻隔了不同子網(wǎng)內(nèi)peer之間的直接通信。文章介紹了基于User Datagram Protocol(UDP)的UDP Hole Punching技術(shù)實(shí)現(xiàn)NAT的穿越,并提出在完全P2P環(huán)境下內(nèi)網(wǎng)中的P2P節(jié)點(diǎn)加入P2P網(wǎng)絡(luò)并實(shí)現(xiàn)了NAT穿透的Friend Select Node(FSN)模型。
關(guān)鍵詞:NAT;UDP Hole Punching;完全P2P;FSN
0 引言
網(wǎng)絡(luò)地址轉(zhuǎn)換協(xié)議(NAT:Network Address Translation),通過(guò)將局域網(wǎng)上的主機(jī)地址映射為Internet上的合法IP地址,從而實(shí)現(xiàn)網(wǎng)絡(luò)地址復(fù)用。NAT對(duì)解決當(dāng)前IP地址短缺問(wèn)題、構(gòu)建防火墻、保證網(wǎng)絡(luò)安全等都發(fā)揮了重要作用。但是隨著基于Internet的P2P網(wǎng)絡(luò)技術(shù)的廣泛應(yīng)用,更多的內(nèi)網(wǎng)主機(jī)需要參與到P2P中來(lái)。NAT協(xié)議下的主機(jī)IP地址(私網(wǎng)IP地址)在Internet上是不可見(jiàn)的,Internet上的主機(jī)不能主動(dòng)訪問(wèn)這些NAT協(xié)議下的主機(jī),而位于不同NAT協(xié)議下的主機(jī)間更是無(wú)法相互識(shí)別而不能直接交換信息。但是P2P網(wǎng)絡(luò)要求任何主機(jī)之間都能夠直接對(duì)等交換信息,因此P2P網(wǎng)絡(luò)應(yīng)用必須解決穿越NAT實(shí)現(xiàn)雙向?qū)Φ韧ㄐ诺膯?wèn)題。
本文將重點(diǎn)圍繞著Cone NAT穿越的完全P2P通信方法展開(kāi)研究。
1 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)的類型劃分
按照端口號(hào)轉(zhuǎn)換與否,NAT可以分為以下兩種:
(1)Basic NAT:將私網(wǎng)主機(jī)的私有IP地址轉(zhuǎn)換成公網(wǎng)IP地址,但并不轉(zhuǎn)換TCP/UDP端口信息。
(2)Network Address Port Translation(NAPT):NAPT將單獨(dú)的公網(wǎng)IP地址和內(nèi)部多臺(tái)主機(jī)進(jìn)行綁定,當(dāng)不同的內(nèi)部主機(jī)和外部通信時(shí),NAT不僅將內(nèi)部主機(jī)的私有IP轉(zhuǎn)換為公網(wǎng)IP,而且連端口號(hào)一起轉(zhuǎn)換。
按照端口號(hào)的分配情況,NAPT又可以分為以下兩種:
(1)Symmetric NAT:當(dāng)同一個(gè)內(nèi)部主機(jī)向不同的外網(wǎng)主機(jī)發(fā)起多個(gè)會(huì)話時(shí),Symmetric NAT為這些會(huì)話分配不同的端口,Symmetric NAT能夠區(qū)別多個(gè)不同的會(huì)話并進(jìn)行地址轉(zhuǎn)換。
(2)Cone NAT:與Symmetric NAT不同,當(dāng)同一個(gè)內(nèi)部主機(jī)向不同的外網(wǎng)主機(jī)發(fā)起多個(gè)會(huì)話時(shí),Cone NAT為這些會(huì)話分配同一個(gè)端口,并通過(guò)判斷數(shù)據(jù)包的來(lái)源(即反饋數(shù)據(jù)包中的IP地址和端口)來(lái)維持會(huì)話。所分配的同一個(gè)端口在所有會(huì)話結(jié)束后才收回。
由于當(dāng)前的NAT幾乎都是Cone NAT,所以本文只是基于Cone NAT進(jìn)行了研究,后面出現(xiàn)的NAT要是不特別說(shuō)明,指的是Cone NAT。
2 P2P節(jié)點(diǎn)穿越Cone NAT方法
UDP是簡(jiǎn)單的傳輸協(xié)議,幾乎不提供可靠性措施,是無(wú)連接的協(xié)議,但是效率非常高。不像TCP協(xié)議,傳輸數(shù)據(jù)之前要建立一種虛擬的連接關(guān)系,它只要知道對(duì)方的IP地址和UDP端口,就可以進(jìn)行數(shù)據(jù)傳輸。在P2P網(wǎng)絡(luò)中,采用UDP方式進(jìn)行數(shù)據(jù)傳輸,所以能夠獲得主機(jī)的Internet合法IP地址就可以進(jìn)行數(shù)據(jù)交換。
P2P的兩個(gè)節(jié)點(diǎn)分布有以下幾種情況:
(1)兩個(gè)節(jié)點(diǎn)都有自己的公網(wǎng)地址。
(2)兩個(gè)節(jié)點(diǎn)都使用同一個(gè)Cone NAT。
(3)一個(gè)節(jié)點(diǎn)有公網(wǎng)地址,另外一個(gè)節(jié)點(diǎn)使用一個(gè)ConeNAT協(xié)議。
(4)兩個(gè)節(jié)點(diǎn)使用不同的Cone NAT。
下面就對(duì)兩個(gè)P2P節(jié)點(diǎn)在不同內(nèi)網(wǎng)下,穿越NAT的User Datagram Protocol(UDP)Hole Punching方法進(jìn)行介紹。
如圖1所示,假設(shè)兩臺(tái)主機(jī)A和B處于不同的Cone NAT協(xié)議下。它們穿越NAT進(jìn)行直接通信的過(guò)程如下:
(1)A和B先登錄到注冊(cè)服務(wù)器(P2P Server),并向服務(wù)器發(fā)送各自的實(shí)際IP地址和UDP端口信息。
(2)注冊(cè)服務(wù)器記錄這兩個(gè)IP地址和端口號(hào),同時(shí)從接收到的UDP數(shù)據(jù)報(bào)頭中提取源IP地址和端口信息,同樣記錄IP地址和端口號(hào)。這樣在注冊(cè)服務(wù)器上的映射表中就增加兩條記