一種通過穿透nat實現p2p通信的方法、設備、服務器及系統的制作方法
【技術領域】
[0001 ]本發明涉及穿透NAT實現P2P通信技術領域,尤其涉及一種穿透NAT實現P2P通信的方法、設備、服務器及系統。
【背景技術】
[0002]NAT (Network Address Translator,網絡地址轉換),它是一種把內部私有網絡IP地址翻譯成公有網絡IP地址的技術,在IP地址日益缺乏的情況下,NAT的主要目的是使地址能夠重用,IP地址可分為公有地址和私有地址,私有地址用于內網,不同的內網,私有地址可重用,從而節省了公有地址,但私有地址不可在公網中被路由,所以內網的主機要訪問公網的服務器,便要經過NAT,公有地址是全球唯一的,能在公網上被路由。
[0003]內網主機用私有地址在內網能與其它內網主機無誤地通信,但內網主機要與外網通信,必須經過NAT設備(如網關、路由器)。例如,內網主機A要與外網服務器S通信,必須先通過網關,此時網關改變的數據包地址及端口,把私有地址改為公有地址,使數據包能夠在公網上被路由,送至外網服務器S。外網服務器S返回的數據包到達網關后,網關把公有地址改為相應的私有地址,然后轉發到內網主機A。如此,一個內網只需一個公有IP地址,就把整個內網的終端接入外網,從而解決了 IP地址缺乏的問題。
[0004]目前,NAT功能常被集成到路由器、防火墻、ISDN(IntegratedServices DigitalNetwork,綜合業務數字網)路由器或者單獨的NAT設備中,NAT可分為基本的NAT和NAPT(Network Address/Port Translator)。
[0005]基本的NAT,它僅將內網主機的私有IP地址轉換成公網IP地址,但并不將TCP/UDP端口信息進行轉換,有動態與靜態之區分。由于現在大部分都屬于另一種類型,即NAPT,故這里不詳細討論基礎NAT。
[0006]另外一種NAT叫做NAPT,從名稱上我們也可以看得出,NAPT不但會改變經過這個NAT設備的IP數據包的IP地址,還會改變IP數據包的TCP/UDP端口。
[0007 ] 例如,私有網絡中某一主機Cl i ent A (10.0.0.2),它的某個進程通過1234端口,想訪問外網服務器18.181.0.31的1235端口。那么當數據包通過NAT時,這個NAT的外網地址是155.99.25.11,首先NAT會改變這個數據包的原IP地址,改為155.99.25.11。并分配一個端口(如62000)給Client A,把數據包的原端口號改為62000。所以本來是(10.0.0.2:1234-〉
18.181.0.31:1235)的數據包到了互聯網上變為了(155.99.25.11:62000->18.181.0.31:1235) JAT會記住6 2000端口對應的是10.0.0.2的I 234端口,以后從外網服務器18.181.0.31發送到62000端口的數據會被NAT自動的改變目的IP和端口號,然后轉發到
10.0.0.2上。
[0008]NAPT又分為錐型(Cone)和對稱型(Symmetric),它們的區別在于,在NAT已分配端口號給Client A的情況下,如果Client A繼續用1235端口與另一外網服務器通訊,錐型NAT還會繼續用原來62000端口,即所分配的端口號不變。而對于對等型NAT,NAT將會分配另一端口號(如62001)給Client A的1235端口。也就是說,同一內網主機同一端口號,對于錐型NAT,無論與哪一外網主機通訊,都不改變所分配的端口號;而對于對等型NAT,同一內網主機同一端口號,每一次與不同的外網主機通信,就重新分配另一個端口號。
[0009]維型NAT可另外分類為完全維形(Full Cone)NAT,受限制維形(Restricted Cone)NAT,端口受限制維形(Port Restricted Cone)NAT0
[0010]完全錐形(FulICone)NAT
[0011]這種NAT內部的主機A連接過外網主機C后,NAT會打開一個端口。然后外網的任何發到這個打開的端口的UDP數據報都可以到達A,不管是不是C發過來的。
[0012]受限制維形(RestrictedCone)NAT
[0013]這種NAT內部的主機A連接過外網的主機C后,NAT打開一個端口。然后C可以用任何端口和A通信,但其他的外網主機不可以。
[0014]端口受限制維形(PortRestricted Cone)NAT
[0015]這種NAT內部的主機A連接過外網的主機C后,NAT打開一個端口。然后C只能用原來的端口和A通信,其他的外網主機不可以。
[0016]NAT很好地解決了地址緊缺的問題,還能夠有效避免來自網絡外部的攻擊,隱藏并保護網絡內部的計算機。同時,NAT也阻礙了外網到內網的直接訪問,例如:CDN P2P分布式傳輸和和服務器主動推送等。
[0017]NAT穿透是實現P2P通信的主要方案,常用方案是ICE(The InternetCommunicat1ns Engine,互聯網通信引擎)和UPnP。
[0018]ICE穿透要求外網服務器是雙網卡配置,這將帶來更多的安全風險,內網終端要求有兼容環境的存儲空間。例如:嵌入式設備上運行開源程序,如果是用不同語言實現的,需要加載基本庫。這在低成本的嵌入式項目中,將影響實際應用。
[0019]UPnP可以穿透UDP/TCP和對稱型,但卻不支持串聯的NAT設備。
[0020]常用的內網NAT穿透方案有:
[0021]1)ICE(STUN+TURN)
[0022]STUN (Simple Traversal ofUDP over NAT,NAT 的 UDP 簡單穿越)是一種網絡協議,可以穿透TCP NAT的圓錐型和受限錐型,不能穿透UDP和對稱型。這里,不考慮UDP NAT穿透,假設沒有對稱型防火墻或阻塞型,則需要TURN(Traversal Using Relays around NAT,使用中繼穿透NAT)中繼的概率是I /8 = I /2*I /4 (對稱型NAT),具體如圖1所示,具體步驟如下:
[0023]步驟SlOl,客戶端向服務器請求NAT映射后的公網地址;
[0024]步驟S102,判斷是否收到應答?如果收到進入步驟S104,否則進入步驟S103 ;
[0025]步驟S103,確認為阻塞型,網絡斷路或UDP/TCP報文被防火墻阻斷;
[0026]步驟S104,確認為非阻塞型,比較客戶端外網地址和NAT映射后的公網;
[0027]步驟S105,判斷地址是否相同?如果相同進入步驟S106,否則進入步驟Slll;
[0028]步驟S106,確認為公網,沒有NAT設備;
[0029]步驟S107,客戶端向服務器請求從其他IP地址和Port端口回復包;
[0030]步驟S108,判斷是否收到應答?如果收到進入步驟S109,否則進入步驟SI 10;
[0031 ]步驟S109,確認為開放型,客戶端在開放網絡上;
[0032]步驟3110,確認為對稱型?胃,1]0?/11^報文被前置防火墻阻斷;
[0033]步驟Slll,確認為私網,有NAT設備;
[0034]步驟SI12,客戶端向服務器請求從其他IP和Port回復包;
[0035]步驟S113,判斷是否收到應答?如果收到進入步驟S114,否則進入步驟步驟S115;
[0036]步驟SI14,確認為完全錐形,NAT設備是完全開放的;
[0037]步驟SI 15,確認為受限NAT,NAT設備是受限開放的;
[0038]步驟SI16,客戶端向服務器的另一個IP請求NAT映射后的公網地址,比較客戶端外網地址和NAT映射后的公網地址;
[0039]步驟S117,判斷地址是否相同?如果相同進入步驟S119,否則進入步驟S118;
[0040]步驟S118,對稱錐形NAT,UDP/TCP報文被前置NAT設備阻斷;
[0041 ]步驟SI 19,確認為受限錐形;
[0042]步驟S120,客戶端向服務器請求從相同地址和不同端口回復包;
[0043]步驟S121,判斷地址相同嗎?如果相同進入步驟S122,否則進入步驟S123;
[0044]步驟SI 22,確認為地址受限錐形;
[0045]步驟SI 23,確認為端口受限錐形。
[0046]STUN協議需要外網服務器配置雙網卡,用于內網終端的NAT類型檢測。開源版本“RFC3489: stund-0.97” 和 “RFC5389: stunserver” 都是基于C++實現,運行要有C++Lib庫支持,編譯大小是IM多,不適用于低成本嵌入式設備項目。
[0047]2)UPnP(即插即用)
[0048]UPnP是開放的設備互聯協議,基于TCP/IP且不需要驅動。開啟UPnP功能的NAT設備,內網終端可以讓NAT網關做自動端口映射。UPnP協議簇實現互聯互通,就是將內網終端的外網地址廣播公告出去。UPnP可以穿透UDP/TCP NAT和對稱型NAT,穿透效率很高,但應用場景有限。在串聯多級NAT設備的情況下,需要每級都打開UPnP功能請求自動端口映射,外網服務器才能獲知內網終端的公網地址。但事實上,外層