P2P穿透&四種NAT類型

P2P穿透&四種NAT類型

 

以下對四種NAT類型分別予以說明:

1.全錐形NAT

IP、端口都不受限。只要客戶端由內到外打通一個洞之後(NatIP:NatPort -> A:P1),其他IP的主機(B)或端口(A:P2)都可以使用這個洞發送數據到客戶端。

映射關係爲:Client->NatIP:NatPort->Any,即任何外部主機都可通過NatIP:NatPort發送數據到Clietn上。

 

 

 

2.受限錐形NAT

IP受限,端口不受限。當客戶端由內到外打通一個洞之後(NatIP:NatPort -> A:P1),A機器可以使用他的其他端口(P2)主動連接客戶端,但B機器則不被允許。

映射關係爲:Client-> NatIP:NatPort->A,即只有來自A的數據包才能通過NatIP:NatPort發送到Client上。

 

 

3.端口受限錐型

IP、端口都受限。返回的數據只接受曾經打洞成功的對象(A:P1),由A:P2、B:P1發起的數據將不被NatIP:NatPort接收。

映射關係爲:Client->NatIP:NatPort->A:P1,即只有來自A:P1的數據纔可通過NatIP:NatPort發送到Client上。

 

4.對稱型NAT

對稱型NAT具有端口受限錐型的受限特性。但更重要的是,他對每個外部主機或端口的會話都會映射爲不同的端口(洞)。只有來自相同的內部地址(IP:PORT)並且發送到相同外部地址(X:x)的請求,在NAT上才映射爲相同的外網端口,即相同的映射。一個外部地址(X:x)對應一個NAT上的映射,如上圖紅色三角,每個映射僅接收來自他綁定的外部地址的數據。注:X在這裏意爲任意一臺外部主機,x爲這臺主機上的任意一個端口。

映射關係爲:Client->NatIP:Pa1->A:P1,當Client訪問B:P1時,映射關係變爲:

Client->NatIP:Pb->B:P1,同理,NatIP:Pa2也就是Client訪問A:P2時的映射。

 

 

 

以上我們只是說了一點基本的理論。接下來我們要實現不同內網通過internet網進行通迅
再來,我們舉個圖例

A<----------->NatA<---------->NatB<---------->B
A的地址是:192.168.1.100端口4000
B的地址是:192.168.1.100端口4000
它們兩個都是內網的地址。及局域網內部地址。並不是全球唯一地址。
兩個路由:
NatA的地址是:222.182.100.1
NatB的地址是:222.182.100.2
這兩個路由是外網的地址,及全球唯一地址。

現在我們要實現A與B的通迅。
因爲A與B都不是外網地址。所以A不可能向192.168.1.100發送消息。這消息只會它自己收到,因爲這個IP是它自己的。同樣B也不可以。
那麼A向NatB發送消息,B能收到嗎?答案是否定的,不能收到。剛纔我們提到過。因爲路由沒有映射B的地址。A並不知道這個Session就連NatB也不知道這個Session因爲B沒有向A發送消息,並不產生這個Session。
就算B和A同時向雙方的路由發送消息,產生的Session,A和B也得不到。因爲在路由上就把這個消息當做爲無用包給丟棄掉了。

那麼這樣的情況我們要進行通迅怎麼辦呢?
對,就是剛纔我們提到的第三方。第三方是個什麼方呢?
第三方必須是一個擁有固定外網IP的服務方。及一個外網服務器。全唯一IP地址。

圖例:
假定我們這個第三方爲C
C  IP:222.182.100.3端口4001
A<----------->NatA<--------------->C<-------------------->NatB<------------->B
                    ↑______________________________↑                                                          

原理如下
A通過路由向C發送消息,C獲取A的在路由上的Session地址,映射的IP和端口
B同樣。
這時候C就有了A和B的地址。
C可以和A、B進行通迅,但是A和B還不行。
現在C需要通知A方B的映射IP和端口。也要通知B方A的映射IP和端口。
這樣A就有了B的映射地址,B也有了A的。但是現在還不能進行通迅。
因爲在路由上A和B都只有對C的穿透。並沒有相互之前的穿透。
那麼A要向B發送消息怎麼辦呢?需要C向B發送一個消息告訴B方A的地址讓B向這個地址發送一個消息,對A進行一個穿透。
這樣A就可以向B發送消息了。在A向B發送消息的同時,A也在向B進行穿透。
這樣就可以實現相互的通迅了。如果有多個端點,也就以此類推了。
宗上所述就是P2P的UDP實現原理了。TCP也是一樣的。提示一點。Session在路由上是有時限的,一分鐘到幾小時不定。不同的路由不同的時間,爲了保持這個Session的存在,你需要在固定時間點進行通迅,保持這個穿透,否則就得重新穿透。

值得注意的一點。
路由上的映射有兩種情況
第一種情況是:Cone NAT
第二種情況是:Symmetric NAT
我們以上的實現是以Cone Nat爲基礎的。爲什麼呢?因爲Cone Nat在映射的時候端口是不變的。無論你內網有多少臺機器,向外網發送消息在路由上映射的端口都是不變的。

而Symmetric Nat則相反,一個映射一個端口。如果碰到這種情況只有祝你好運了,最好不要猜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章