網絡去中心化技術p2p架構之網絡穿透


實現NAT網絡穿透打洞首先需要判斷NAT網關類型,判斷邏輯如下:

1.先判斷網關是對稱型NAT還是錐型NAT;

同一個client socket給兩個server 120.94.23.1802230120.94.23.1802234發送消息;server1把獲取到的client IP地址發給server2server2來對比這兩個網關的IP地址是否是一樣,如果一樣是錐形NAT[走邏輯2的判斷流程],不一樣是對稱NAT;

錐形NAT client只有一個端口對外使用,但會與不同的目的地址及端口生成記錄表中的不同的記錄。

2.判斷網關是完全錐型NAT還是限制性錐型NAT;

cliecnt先給server1發送消息,server1把獲取到的client IP地址發送給server2,server2直接給網關發送數據,client如果沒有收到數據,隔很長一段時間由client再次啟動一次,啟動三次,仍然沒有收到數據,這是判斷是IP限制型錐型NAT;如果client收到數據,判斷為完全錐型NAT

3.在流程2的前提下,判斷判斷網關是否是端口限制型錐型NAT;

在同一台server中開兩個端口120.94.23.1802234120.94.23.1802230;同一個client socket120.94.23.1802234發送數據,server收到數據后再通過120.94.23.1802230client端發送響應數據,如果client沒有收到數據,判斷是端口限制型錐型NAT

 

做網絡穿透時有限采用UDP協議,因為UDP sendto()時可以直接帶目的IP地址。

采用UDP實現網絡高並發。多個client端給server UDP 8080端口發送數據,也就是說server sockfd 會收到不同客戶端發送的數據。當client1 sendto()server 8080端口發送數據,Serverrecvfrom()可以獲取到這個客戶端網關的IP地址和端口號,當收到clent1的數據后server重新創建一個socket,再綁定本地的另外一個端口,創建一個fd,通過這個端口sendto()client1發送數據。這時server每一個socket都會和client形成一對一的關系。這里server每創建一個socket都交給epoll來管理。當端口不夠用了,端口復用,只需保證五元組不重復就可以了。注意當網關是對稱型NAT(雖然是同一台server的不同端口,網關上記錄表沒有生成與server端新的端口的記錄)或者是端口限制型NATclient會收不到server發送的報文數據,導致網絡穿透失敗。

 

網絡穿透

 

A to B網絡穿透共4*4=16NAT搭配組合可歸類為3

 

1.兩邊任意一邊是完全錐形NAT(8種組合搭配),這時是完全可以穿透的。

 

 

分為4個步驟:

步驟1client1發送數據給server請求與client2通信,server獲取到client1的公網ip和端口號;

步驟2server發送數據通知client2,數據報文內容包含client1的公網ip和端口號;

步驟3client2發送數據給client1進行網絡穿透打洞,client1可以收到client2的數據並獲取到client2的公網ip和端口號;

步驟4client1發送數據給client2client2可以收到來自client1的數據,網絡穿透成功。

 

2.兩邊都是限制性NAT(4種組合搭配),這種情況是可以穿透的;

兩邊都是限制型NAT組合的網絡穿透分為7個步驟:

步驟1clientA發送報文給server,server獲取到clientA的公網IP和端口號;

步驟2server發送通知報文{獲取到clientA的公網IP,端口號}clientB

步驟3clientB發送報文給clientA的公網IP和端口號,探測嘗試穿透,但是clientA所在的NATA是限制型錐型NAT,因此clientA此時不能收到clientB發送的報文數據;

步驟4clientB發送報文給server,server獲取到clientB的公網IP和端口號;

步驟5server發送通知報文{獲取到clientB的公網IP,端口號}clientA

步驟6:由clientA發送報文給clientB的公網IP和端口號,進行網絡穿透,由於步驟3NATB路由器上記錄表已生成記錄,這時clientB是可以收到clientA發送的報文數據,NATB網絡穿透成功;

步驟7clientB再次發送報文給clientA的公網IP和端口號,這時NATA路由器上記錄表也已經生成記錄,clientA是可以收到clientB發送的報文數據,NATA網絡穿透成功;

 

3.對稱NAT與限制型NAT的組合(4種組合搭配),對稱NAT穿透不了,這NAT組合穿透比較麻煩。對稱NATclient端接收到數據,進行第3步穿透時會重新分配新的端口號,不能直接穿透。端口預測打孔,需要猜測對稱NAT網關在第三步生成的記錄,client2再次給服務器發送消息,生成第三條記錄,服務器將兩條記錄發送給client1client猜測網絡穿透第三步生成的記錄端口號,如果這個端口號在服務器返回的兩條記錄端口號區間內,則可以穿透

 

 

 

限制型錐型NAT和對稱NAT組合的網絡穿透分為7個步驟:

步驟1clientA發送報文給server請求與clientB進行透傳,server獲取到clientA的公網IP和端口號;

步驟2server發送通知報文{獲取到clientA的公網IP,端口號}clientB

步驟3clientB發送報文給clientA的公網IP和端口號,探測嘗試穿透,由於NATB是對稱NAT,所以在報文發送經過NATB路由器會生成新的映射記錄,並且分配新的{112.92.114.23,端口號5000};但是NATA是限制型錐型NAT,因此clientA此時不能收到clientB發送的報文數據;

步驟4clientB發送報文數據給server的另一個端口8000,NATB路由器會生成新的映射記錄,並且分配新的{公網IP地址112.92.114.23,端口號5005}server獲取到clientB的另一個{公網IP地址112.92.114.23,端口號5005}

步驟5:由server的另一個端口8000端口發送通知報文{公網IP地址112.92.114.23,端口號5005}clientA,可以用來猜測判斷步驟3 clientB產生的{公網IP,端口號},根據路由器分配端口號的策略得知步驟3 clientB產生的{公網IP,端口號}5000端口號在記錄表端口號4347和端口號5005區間內[記錄表端口號4347是在步驟3之前產生的]

步驟6:由clientA發送報文給clientB的公網IP和猜測端口號,進行網絡穿透,如果猜測端口號命中,即找到5000端口,clientA發送報文數據到{112.92.114.235000}clientB是可以收到clientA發送的報文數據,NATB網絡穿透成功;

步驟7clientB再次發送報文給clientA的公網IP和端口號,clientA是可以收到clientB發送的報文數據,NATA網絡穿透成功;

 

解決UDP在空閑狀態下的超時的問題:

多數NAT設備內部都有一個UDP轉換的空閑狀態計時器,如果在一段時間內沒有UDP數據通信,NAT設備會關掉由“打洞”過程打出來的“洞”。穿透后通過keepalive心跳包維持連接,來解決UDP在空閑狀態下的超時。

拔掉網線,客戶端網絡全部會被回收,再次插上,網卡重新啟動,網關進行重連IP和端口號會被重新分配。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM