UDP"打洞"原理

    NAT分類

根據Stun協議(RFC3489),NAT大致分爲下面四類

1)      Full Cone

這種NAT內部的機器A連接過外網機器C,NAT會打開一個端口.然後外網的任何發到這個打開的端口的UDP數據報都可以到達A.不管是不是C發過來的.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

任何發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

2)      Restricted Cone

這種NAT內部的機器A連接過外網的機器C,NAT打開一個端口.然後C可以用任何端口和A通信.其他的外網機器不行.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

任何從C發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

 

3)      Port Restricted Cone

這種NAT內部的機器A連接過外網的機器C,NAT打開一個端口.然後C可以用原來的端口和A通信.其他的外網機器不行.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

C(202.88.88.88:2000)發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

 

以上三種NAT通稱Cone NAT.我們只能用這種NAT進行UDP打洞.

4)      Symmetic

對於這種NAT.連接不同的外部目標.原來NAT打開的端口會變化.Cone NAT不會.雖然可以用端口猜測.但是成功的概率很小.因此放棄這種NATUDP打洞.

2.       UDP hole punching

對於Cone NAT.要採用UDP打洞.需要一個公網機器C來充當介紹人”.內網的A,B先分別和C通信.打開各自的NAT端口.C這個時候知道A,B的公網IP:Port. 現在AB想直接連接.比如AB.除非BFull Cone.否則不能通信.反之亦然.但是我們可以這樣.

A要連接B.AB發一個UDP.同時.A讓那個介紹人給B發一個命令,B同時給A發一個UDP.這樣雙方的NAT都會記錄對方的IP,然後就會允許互相通信.

3.       同一個NAT後面的情況

如果A,B在同一個NAT後面.如果用上面的技術來進行互連.那麼如果NAT支持loopback(就是本地到本地的轉換),A,B可以連接,但是比較浪費帶寬和NAT.有一種辦法是,A,B和介紹人通信的時候,同時把自己的local IP也告訴服務器.A,B通信的時候,同時發local ip和公網IP.誰先到就用哪個IP.但是local ip就有可能不知道發到什麼地方去了.比如A,B在不同的NAT後面但是他們各自的local ip段一樣.ABlocal IP發的UDP就可能發給自己內部網裏面的某某某了.

還有一個辦法是服務器來判斷A,B是否在一個NAT後面.(網絡拓樸不同會不會有問題?)

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章