穿越nat的意義:
nat是為了節省ip位址而設計的,但它隱藏了內網機器的位址,「意外」起到了安全的作用。對外不可見,不透明的內部網路也與網際網路的「公平」應用,「相互共享」的思想所不容,尤其是p2p網路中「相互服務」的宗旨,所以穿越nat,讓眾多內部網路的機器也參與到p2p網路中的大集體中來,一直是p2p開發者的所希望的。穿越nat需要借助外部的支援,說白了就是「內外勾結」,騙過nat。很多p2p網路成功地實現了這一目標,但還是有一些「遺憾」---並非所有的情況下都可以。由於客戶端是主動登入p2p網路才可穿越,所以p2p的方式也沒有違背企業的內部管理原則,畢竟「自由世界」的加入都是自覺自願的。
nat原理:
nat(network address translation)網路位址轉換/網路位址翻譯。
nat給p2p帶來的問題是:nat只允許單方面發起連線,通訊的雙方不是平等的,p2p網路的基礎有了問題,具體的表現為:
內網主機ip是私有的,外部主機看不到,也無法主動發起連線
即使知道了內網ip,但nat會丟棄沒有在影射表的資料報
內網主機可以作為客戶端訪問外網,但不能作為伺服器提供服務
當兩個主機都位於各自的nat之後,要實現p2p的連線,就不僅是誰主動的問題,而是如何解決在兩個nat上同時有對方對映表項的問題。
stun協議(ietf rfc3489):
stun協議是一種通道協議,可以作為正式通訊前的通路建立,它採用的是使用者終端干預的一種方法,可以解決應用協議內部傳遞ip位址給nat帶來的麻煩。使用者通過其他方法得到其位址對應在nat出口上的對外位址,然後在報文負載中所描述的位址資訊就直接填寫nat上對外位址,而不是內網的私有ip,這樣報文的內容在經過nat時就按普通的nat流程轉換報文頭部的ip位址即可,負載內的ip位址資訊無需再修改。利用stun的思路可以穿越nat。stun協議是客戶端/伺服器協議,分兩種請求方式:一是udp傳送的繫結請求(bindingrequests),二是tcp傳送的秘密請求(shared secret requests)。繫結請求用於確定nat分配的繫結位址。
2. restricted cone:來自相同的內部位址的請求訊息對映為相同的外部位址,返回的資料只接受該內部節點曾發資料的那個目的計算機位址x。對映關係為p:p↔a:b↔x,只有來自x的資料報才可通過(a:b)傳送到資料到(p:p)上。
3. port restricted cone:來自相同的內部位址的請求訊息對映為相同的外部位址,返回的資料只接受該內部節點曾發資料的那個目的位址x:x。對映關係為p:p↔a:b↔x:x,只有來自x:x的資料報才可通過(a:b)傳送到資料到(p:p)上。
4. symmetric(對稱) nat:只有來自相同的內部位址(p:p),並且傳送到同乙個位址(x:x) 的請求訊息,才被對映為相同的外部位址(a:b),返回的資料只接受該內部節點曾發資料的那個目的位址x:x。對映關係為p:p↔a:b↔x:x,當(p:p)訪問(y:y)時,對映為p:p↔b:c↔y:y。
p2p利用stun穿越nat:
位於nat後面終端a與b要穿越nat直接通訊,可以借助在公網上的第三者server來幫助。
穿越nat的情況分為為兩種方式:
2、雙方都在nat之後,連線的成功與否與兩個nat的型別有關。主要的思路的先通過終端與server的連線,獲得兩個終端在nat外部的位址(ip與埠號),再由終端向對方的外部位址發邀請包,獲取自己與對方通訊的外部位址,俗稱為「打洞」。關鍵是獲取了nat外部對映的位址,就可以發包直接溝通,建立連線。但當一方是對稱型,另一方是portrestricted或對稱型時,無法有效獲取外部位址,邀請包無法到達對方,也就無法穿越nat。具體的分析可以根據兩個nat的型別分成若干情況分析,這裡給一般的穿越例子。
例項:udp穿越nat:
a登入server,nat a分配埠11000,server得到a的位址為100.10.10.10:11000
b登入server,nat b分配埠22000,server得到b的位址為200.20.20.20:22000
此時b會把直接來自a的包丟棄,所以要在nat b上打乙個方向為a的洞,那麼a就可以向200.20.20.20:22000傳送資料了
打洞的指令來自server。b向a的位址100.10.10.10:11000發乙個udp報文,被nat a丟棄,但在nat b上建立對映記錄,nat b不在丟棄來自a的報文。
server通知a可以通訊,a發起資料udp包給b,nat b放行,b收到a的包,雙方開始通訊
注:若是對稱nat,當b向a打洞的埠要重新分配(nata不會再分配11000埠),b無法獲取這個埠,所以不適用本方法。
例項:tcp穿越nat:
a登入server,nat a分配埠11000,server得到a的位址為100.10.10.10:11000
b登入server,nat b分配埠22000,server得到b的位址為200.20.20.20:22000
a向b傳送tcp資料報syn:192.168.10.11:1234=>200.20.20.20:22000,在nat a上打洞
b向a傳送tcp資料報syn:192.168.20.22:1234=>100.10.10.10:11000,在nat b上打洞
通道建立,a與b三次握手建立tcp連線
典型案例:
P2P技術原理
組織結構 點對點技術又稱對等網際網路絡技術,是一種網路新技術,依賴網路中參與者的計算能力和頻寬,而不是把依賴都聚集在較少的幾台伺服器上。p2p網路通常用於通過adhoc連線來連線節點。這類網路可以用於多種用途,各種檔案分享軟體已經得到了廣泛的使用。p2p技術也被使用在類似voip等實時 業務的資料通...
區塊鏈的底層技術 P2P網路原理與應用詳解
針對區塊鏈的底層傳輸方式 p2p技術,迅雷鏈底層研發工程師李海友在沙龍中對 p2p網路的原理與應用 進行了詳細的解讀。李海友介紹,p2p網路是去中心化系統的基礎元件,應用在多個去中心化系統中,包括emule ethereum 迅雷鏈檔案系統tcfs等。典型的區塊鏈分為基礎層 核心層和應用層,p2p網...
P2P原理的解釋與實現
關於採用udp協議進行打洞以進行p2p會話的原理,我本來想寫一篇文章作說明,但是現在已經有一篇文章把原理性的東西解釋清楚了,我在這裡不再作這部分的重複,可以參見這裡 p2p 之 udp穿透nat的原理與實現 附源 下面解釋一下上面的文章中沒有提及或者說我覺得比較欠缺的地方.如果明白了上面的東西,下面...