P2P網(wǎng)絡(luò)“自由”穿越NAT的“秘密”
穿越NAT的意義:
NAT是為了節(jié)省IP地址而設(shè)計(jì)的,但它隱藏了內(nèi)網(wǎng)機(jī)器的地址,“意外”起到了安全的作用。對(duì)外不可見,不透明的內(nèi)部網(wǎng)絡(luò)也與互聯(lián)網(wǎng)的“公平”應(yīng)用,“相互共享”的思想所不容,尤其是P2P網(wǎng)絡(luò)中“相互服務(wù)”的宗旨,所以穿越NAT,讓眾多內(nèi)部網(wǎng)絡(luò)的機(jī)器也參與到P2P網(wǎng)絡(luò)中的大集體中來,一直是P2P開發(fā)者的所希望的。穿越NAT需要借助外部的支持,說白了就是“內(nèi)外勾結(jié)”,騙過NAT。很多P2P網(wǎng)絡(luò)成功地實(shí)現(xiàn)了這一目標(biāo),但還是有一些“遺憾”---并非所有的情況下都可以。由于客戶端是主動(dòng)登錄P2P網(wǎng)絡(luò)才可穿越,所以P2P的方式也沒有違背企業(yè)的內(nèi)部管理原則,畢竟“自由世界”的加入都是自覺自愿的。
NAT原理:
NAT(Network Address Translation)網(wǎng)絡(luò)地址轉(zhuǎn)換/網(wǎng)絡(luò)地址翻譯。
工作原理:NAT主要的通過對(duì)數(shù)據(jù)包頭的地址替換來完成內(nèi)網(wǎng)計(jì)算機(jī)訪問外網(wǎng)服務(wù)的。當(dāng)內(nèi)部機(jī)器要訪問外部網(wǎng)絡(luò)時(shí),NAT設(shè)備把內(nèi)部的IP1與端口號(hào)1(網(wǎng)絡(luò)層地址與傳輸層地址),轉(zhuǎn)換成NAT的外部IP2與新的端口號(hào)2,再送給外部網(wǎng)絡(luò),數(shù)據(jù)返回時(shí),再把目的為IP2:端口2的數(shù)據(jù)包替換為IP1:端口1,送給內(nèi)網(wǎng)機(jī)器。若通訊協(xié)議的內(nèi)容中有IP地址的傳遞,如FTP協(xié)議,NAT在翻譯時(shí)還要注意數(shù)據(jù)包內(nèi)涉及協(xié)議地址交互的地方也要替換,否則協(xié)議就會(huì)出現(xiàn)地址混亂。在NAT設(shè)備中維護(hù)了這個(gè)要替換地址的映射表,并根據(jù)內(nèi)部計(jì)算機(jī)的通訊需求維護(hù)該表。外部網(wǎng)絡(luò)來數(shù)據(jù)包能否進(jìn)入NAT,主要是看是否已經(jīng)有可映射的表項(xiàng),若沒有就會(huì)丟棄。
NAT的外部公網(wǎng)地址可以是一個(gè)IP,也可以是一個(gè)網(wǎng)段,形成地址池。NAT還可以把某個(gè)外網(wǎng)地址直接影射給內(nèi)網(wǎng)的某個(gè)服務(wù)器,讓外網(wǎng)的用戶可以直接訪問到這臺(tái)服務(wù)器。NAT的工作的隱藏內(nèi)網(wǎng)的機(jī)器,但允許內(nèi)網(wǎng)主動(dòng)打開到外網(wǎng)的通訊“通道”,也就是建立映射表項(xiàng)。
NAT給P2P帶來的問題是:NAT只允許單方面發(fā)起連接,通訊的雙方不是平等的,P2P網(wǎng)絡(luò)的基礎(chǔ)有了問題,具體的表現(xiàn)為:
內(nèi)網(wǎng)主機(jī)IP是私有的,外部主機(jī)看不到,也無法主動(dòng)發(fā)起連接
即使知道了內(nèi)網(wǎng)IP,但NAT會(huì)丟棄沒有在影射表的數(shù)據(jù)包
內(nèi)網(wǎng)主機(jī)可以作為客戶端訪問外網(wǎng),但不能作為服務(wù)器提供服務(wù)
當(dāng)兩個(gè)主機(jī)都位于各自的NAT之后,要實(shí)現(xiàn)P2P的連接,就不僅是誰主動(dòng)的問題,而是如何解決在兩個(gè)NAT上同時(shí)有對(duì)方映射表項(xiàng)的問題。
STUN協(xié)議(IETF RFC 3489):
STUN協(xié)議是一種通道協(xié)議,可以作為正式通訊前的通路建立,它采用的是用戶終端干預(yù)的一種方法,可以解決應(yīng)用協(xié)議內(nèi)部傳遞IP地址給NAT帶來的麻煩。用戶通過其他方法得到其地址對(duì)應(yīng)在NAT出口上的對(duì)外地址,然后在報(bào)文負(fù)載中所描述的地址信息就直接填寫NAT上對(duì)外地址,而不是內(nèi)網(wǎng)的私有IP,這樣報(bào)文的內(nèi)容在經(jīng)過NAT時(shí)就按普通的NAT流程轉(zhuǎn)換報(bào)文頭部的IP地址即可,負(fù)載內(nèi)的IP地址信息無需再修改。利用STUN的思路可以穿越NAT。STUN協(xié)議是客戶端/服務(wù)器協(xié)議,分兩種請(qǐng)求方式:一是UDP發(fā)送的綁定請(qǐng)求(Binding Requests),二是TCP發(fā)送的秘密請(qǐng)求(Shared Secret Requests)。綁定請(qǐng)求用于確定NAT分配的綁定地址。
STUN標(biāo)準(zhǔn)中,根據(jù)內(nèi)部終端的地址(P:p)到NAT出口的公網(wǎng)地址(A:b)的影射方式,把NAT分為四種類型:
p2p機(jī)相關(guān)文章:p2p原理
評(píng)論