劉繼明, 馬 樂, 李 波
(西安郵電大學(xué) 通信與信息工程學(xué)院, 陜西 西安 710121)
近年來,P2P(peer-to-peer)技術(shù)因其拓展性強(qiáng)、隱私性好、性能高等優(yōu)勢成為通信網(wǎng)絡(luò)領(lǐng)域研究與發(fā)展的熱點(diǎn)[1]。P2P技術(shù)廣泛存在于網(wǎng)絡(luò)地址轉(zhuǎn)換(network address translation,NAT)設(shè)備中,NAT技術(shù)緩解了IPv4資源短缺的問題,避免了來自網(wǎng)絡(luò)外部的攻擊,提高了內(nèi)網(wǎng)的安全性[2]。但是,NAT技術(shù)也改變了內(nèi)部網(wǎng)絡(luò)主機(jī)與外部網(wǎng)絡(luò)主機(jī)之間通信的拓?fù)浣Y(jié)構(gòu),給P2P通信帶來了巨大的影響[3]。為了能充分發(fā)揮P2P通信的積極作用,必須先實現(xiàn)NAT穿越[4],即位于專用網(wǎng)絡(luò)中的主機(jī)可以通過它們之間連接的NAT路由器直接傳輸信息。
目前,STUN技術(shù)是實現(xiàn)NAT穿越的非常重要和廣泛使用的技術(shù)之一[5]。根據(jù)STUN技術(shù),NAT設(shè)備的類型可以分為受限圓錐型NAT、完全圓錐型NAT、端口受限圓錐型NAT和對稱型NAT[6-7]等4種類型。STUN技術(shù)允許NAT后的客戶端查出自己位于哪種類型的NAT之后以及自己的公網(wǎng)地址[8],從而使得兩個同時處于NAT之后的客戶端之間可以建立P2P通信。
常見的建立P2P通信的STUN算法有反向連接算法和UDP打洞算法[9-10]。反向連接算法是針對通信雙方只有一方連接NAT的情況下所使用的算法,該算法允許計算機(jī)從NAT內(nèi)部主動向外部發(fā)送請求獲取外部地址信息,從而與外部計算機(jī)設(shè)備建立連接[11]。UDP打洞算法針對通信雙方均設(shè)置在不同類型的NAT之后,以中間服務(wù)器作為媒介來完成NAT穿越,實現(xiàn)P2P通信[12]。
不同的STUN算法各有優(yōu)缺點(diǎn),反向連接算法設(shè)計簡單,實現(xiàn)方便,但是在實際應(yīng)用中局限性較高,并且需要雙方發(fā)送多項請求才能建立P2P通信,建立通信過程中吞吐量較低[13]。UDP打洞算法在實際應(yīng)用中適應(yīng)性強(qiáng),但是在建立P2P通信過程中需要多次與中間服務(wù)器建立請求連接,復(fù)雜度較高,等待時延過長[14-15]。為提高穿越等待時延,本文在總結(jié)兩種算法優(yōu)點(diǎn)的基礎(chǔ)上,提出了一種優(yōu)化穿越性能的STUN算法。在該算法中,客戶端向STUN服務(wù)器發(fā)送綁定請求,根據(jù)獲得的返回信息計算出端口分配間距,然后利用得到的分配間距提前計算出需要分配的實際傳輸?shù)亩丝谔枴2⒋罱▋?yōu)化算法的NAT穿越模擬測試平臺,以驗證本文算法提高端口分配的準(zhǔn)確性有效性,以及UDP穿越NAT時的性能。
STUN技術(shù)可以用來在客戶端和服務(wù)器之間的路徑上發(fā)現(xiàn)NAT的類型,并嘗試通過一個結(jié)構(gòu)化的請求和響應(yīng)序列來發(fā)現(xiàn)NAT的類型[16]。STUN技術(shù)測試設(shè)備NAT的流程如下。
步驟1 客戶端利用UDP協(xié)議向STUN服務(wù)器發(fā)送一個Binding Request消息,發(fā)送地址為STUN服務(wù)器IP1的端口port1端口。STUN服務(wù)器獲取該UDP包的源IP地址和端口號,將獲取的地址信息寫入該UDP包中并返回給客戶端。在一定時長內(nèi),如果客戶端未收到STUN服務(wù)器返回的數(shù)據(jù)包,說明該UDP通信鏈接受到阻塞,此時NAT不支持外部數(shù)據(jù)向內(nèi)部傳輸。如果客戶端收到STUN服務(wù)器返回的數(shù)據(jù)包,那么該客戶端便可獲取到自身對應(yīng)于NAT的外部IP地址和端口號。然后,客戶端將獲取的IP地址和端口號與其初始的IP地址和端口號作比較。如果二者相同,可以判定客戶端處于公網(wǎng)中;如果不同,則說明存在NAT,系統(tǒng)進(jìn)行步驟2的操作。
步驟2 客戶端利用UDP協(xié)議向STUN服務(wù)器發(fā)送一個Binding Request消息,發(fā)送地址為STUN服務(wù)器的IP1,STUN服務(wù)器收到UDP請求包后,通過另外一個地址IP2將UDP包返回給客戶端。如果客戶端收到返回的UDP包,說明其處于完全圓錐型NAT之后;如果沒有收到,那么系統(tǒng)接著進(jìn)行步驟3的操作。
步驟3 客戶端利用UDP協(xié)議向STUN服務(wù)器發(fā)送一個Binding Request消息,發(fā)送地址為STUN服務(wù)器IP2的端口port2,STUN服務(wù)器通過UDP請求包后獲取該UDP包的源IP地址和端口號,將獲取的地址信息寫入該UDP包中,然后通過自己的地址IP2的端口port2把此包返回給客戶端。和步驟1相同,客戶端可以收到這個返回的UDP包。如果收到的地址信息與發(fā)出的地址信息相同,說明這個NAT是圓錐型NAT,否則是對稱型NAT。如果此NAT是圓錐型NAT,繼續(xù)進(jìn)行下述步驟4。
步驟4 客戶端利用UDP協(xié)議向STUN服務(wù)器發(fā)送一個Binding Request消息,發(fā)送地址為STUN服務(wù)器地址IP2的端口port2。STUN服務(wù)器用地址IP2和端口port3將UDP包返回給客戶端。如果客戶端可以收到返回的UDP包,則說明當(dāng)?shù)刂稩P相同且端口號不同時,該NAT也允許UDP包傳輸,此時NAT為受限圓錐型NAT;如果客戶端沒有收到UDP包,說明是端口受限圓錐型NAT。
考慮到通信雙方主機(jī)的網(wǎng)絡(luò)環(huán)境存在多種情況,可能導(dǎo)致同時處于不同NAT之后的兩個客戶端之間無法建立UDP通信。而STUN算法可以很好地實現(xiàn)NAT的穿越,建立P2P通信。STUN算法的流程如圖1所示。
圖1 STUN算法流程
如果終端A位于NAT A之后,終端B位于NAT B之后。終端B通過UDP包向STUN服務(wù)器發(fā)送Binding Request請求登錄包,STUN服務(wù)器收到該UDP包后向終端B返回UDP響應(yīng)請求包,告知終端B其在NAT B上的地址信息,終端B將其通過STUN服務(wù)器獲得的地址信息通過UDP包發(fā)送給終端A。終端A收到終端B發(fā)來的消息后,依據(jù)UDP協(xié)議向STUN服務(wù)器發(fā)送Binding Request請求登錄包,當(dāng)STUN服務(wù)器收到終端A發(fā)來的UDP包后,STUN服務(wù)器生成響應(yīng)請求包,并將其發(fā)送給終端A告知其在NAT A上的地址信息,終端A也將其通過STUN服務(wù)器獲得的地址信息通過UDP包發(fā)送給終端B。發(fā)起會話方終端B和會話接收方終端A之間由此可以建立P2P通信。
在傳統(tǒng)的STUN算法中,通信雙方需要多次與中間服務(wù)器建立請求連接,來獲取自己在所處NAT設(shè)備上的IP地址與端口號。所建立P2P通信復(fù)雜度較高,等待時延過長,傳輸數(shù)據(jù)的吞吐量不高。
為了有效提高端口分配的準(zhǔn)備性,避免客戶端多次向服務(wù)器發(fā)送請求消息來獲取端口號引起的時延,本文提出了一種優(yōu)化穿越性能的STUN算法。算法的主要思想是利用客戶端向STUN服務(wù)器發(fā)送UDP綁定請求,根據(jù)返回信息計算出端口分配間距,然后利用分配間距提前計算出需要分配的實際傳輸?shù)亩丝谔?。外網(wǎng)終端Client2與內(nèi)網(wǎng)終端Client1建立連接,其通信的流程如圖2所示,優(yōu)化STUN算法的設(shè)計原理如下。
圖2 優(yōu)化的STUN算法流程
步驟5 客戶端Client1和Client2向目的端對等結(jié)點(diǎn)的目的地址及端口預(yù)測號發(fā)送連接用的數(shù)據(jù)包,從而建立起P2P連接。
在PC端的Linux環(huán)境下搭建基于優(yōu)化算法的STUN服務(wù)器,以實現(xiàn)NAT穿越并驗證優(yōu)化STUN算法的有效性。搭建過程按照安裝必須的庫文件,下載編譯,開放端口,啟動服務(wù)器等4個步驟完成。
在PC端的Windows環(huán)境下安裝客戶端模塊Iperf,在命令提示符中進(jìn)入Iperf安裝文件夾,輸入iperf命令運(yùn)行Iperf終端,使用命令行#iperf -u -s -p7000 -i1設(shè)置PC1 端為客戶端的數(shù)據(jù)接收端,其中-u表示PC2端傳送模式為UDP包,-s表示將PC1端設(shè)為數(shù)據(jù)接收端,-p表示將端口號設(shè)為7000。然后使用命令行#iperf -u -c192.168.1.102 -b 100m -t -p7000 -i1設(shè)置PC2端為客戶端的數(shù)據(jù)發(fā)送端,其中-u表示PC2端傳送模式為UDP包,-c表示將PC2設(shè)置為數(shù)據(jù)發(fā)送端,后面寫入服務(wù)器端的IP地址,-b表示UDP模式使用的帶寬為100M,-t表示設(shè)置傳輸?shù)目倳r間,-p表示設(shè)置端口號為7000,與接收端的監(jiān)聽端口一致。
將基于優(yōu)化算法搭建的STUN服務(wù)器成功開啟,并將客戶端的數(shù)據(jù)發(fā)送端和數(shù)據(jù)接收端設(shè)置完成之后,發(fā)送端開啟灌包模式,向接收端連續(xù)發(fā)送UDP數(shù)據(jù)包,客戶端的接收端和發(fā)送端界面顯示如圖3和圖4所示??蛻舳私缑娴娘@示表明UDP數(shù)據(jù)包可以成功穿越NAT,且丟包率和時延都相對較小。
圖3 客戶端數(shù)據(jù)接收界面
圖4 客戶端數(shù)據(jù)發(fā)送界面
為了驗證優(yōu)化的STUN算法的性能,根據(jù)該方案搭建網(wǎng)絡(luò)系統(tǒng),將802.11ac作為AP設(shè)備,PC端均以網(wǎng)線直連的方式接入AP設(shè)備,以減少外部網(wǎng)絡(luò)干擾,構(gòu)建的網(wǎng)絡(luò)測試拓?fù)浣Y(jié)構(gòu)如圖5所示。
圖5 網(wǎng)絡(luò)測試拓?fù)鋱D
圖中,將AP一端用網(wǎng)線連接PC1端,登錄管理員界面配置好參數(shù)后點(diǎn)擊Start開啟AP設(shè)備,安裝SecureCRT8.3.exe并設(shè)置AP的傳輸速率、帶寬、中心頻率及信道值等參數(shù)。將AP另一端用射頻線與網(wǎng)卡直連插入PC2端的USB端口,通過去耦合的方式建立網(wǎng)絡(luò)連接,以此將外部網(wǎng)絡(luò)的干擾降至最低,保證了實驗的可靠性。 在PC端的Windows環(huán)境下打開Iperf建立PC1端和PC2端之間的連接。在信號接收端PC2端安裝WirelessMon信號強(qiáng)度監(jiān)測軟件,該軟件用來監(jiān)測出接收信號強(qiáng)度,以確保實驗中信號強(qiáng)度保持不變,避免因信號強(qiáng)度增強(qiáng)或減弱而引起實驗數(shù)據(jù)傳輸時的失真。
設(shè)置AP的傳輸速率為最高,帶寬設(shè)為40MHz,中心頻率設(shè)置默認(rèn)為5.8GHz,信道值設(shè)置默認(rèn)為6,在Iperf的控制臺上配置傳輸數(shù)據(jù)腳本和測試參數(shù)并建立兩臺PC端的路徑連接。當(dāng)WirelessMon信號強(qiáng)度監(jiān)測軟件監(jiān)測出接收信號強(qiáng)度為-38dBm時,開始進(jìn)行時延和吞吐量的測試。
分別對反向連接算法,UDP打洞算法和優(yōu)化的STUN算法進(jìn)行10次數(shù)據(jù)傳輸測試,圖6和圖7是用3種算法測出的通信雙方建立P2P連接所需的時延和傳輸數(shù)據(jù)吞吐量的數(shù)據(jù)對比結(jié)果。
將3種算法分別進(jìn)行10次測試后,對測試結(jié)果參數(shù)取平均值進(jìn)行對比分析,如表1所示。
根據(jù)圖6、圖7和表1的數(shù)據(jù)結(jié)果顯示,在環(huán)境變量相同的情況下,相對于傳統(tǒng)的STUN算法而言,通信雙方用優(yōu)化的STUN算法建立P2P連接所需的平均時延縮短了近20.96%,傳輸數(shù)據(jù)的吞吐量提升了近34.05%。綜合以上結(jié)果來看,優(yōu)化的STUN算法可以有效提升UDP穿越NAT時的性能。
圖6 時延的數(shù)據(jù)對比
圖7 吞吐量的數(shù)據(jù)對比
算法平均吞吐量/Mbps平均時延/s反向連接算法212.282.077 7UDP打洞算法228.242.246 8優(yōu)化的STUN算法288.781.370 2
針對UDP簡單穿越NAT過程提出了一種優(yōu)化穿越性能的STUN算法。該算法根據(jù)客戶端向STUN服務(wù)器發(fā)送UDP綁定請求所返回信息,計算出端口分配間距,利用分配間距提前計算出需要分配的實際傳輸?shù)亩丝谔?,實現(xiàn)了NAT穿越。結(jié)合該算法,通過搭建STUN服務(wù)器和客戶端系統(tǒng)進(jìn)行數(shù)據(jù)包傳輸性能測試。結(jié)果表明,優(yōu)化的STUN算法與傳統(tǒng)的STUN算法相比,有效提升了UDP穿越NAT時的性能,使得通信雙方建立P2P連接更加快速高效。因此,該優(yōu)化穿越性能的STUN算法在P2P通信技術(shù)實際應(yīng)用中具有一定的參考價值。