P2P NAT檢測和穿越方式


一、      NAT類型

本文轉自:http://www.cnblogs.com/hummersofdie/archive/2013/05/21/3090163.html 

1、基本的NAT類型:只轉發IP,不轉發端口;

tips:一個基本NAT往往需要具有多個公網IP來滿足多個內網節點中具有相同端口的應用程序的同時訪問。由於這種類型的NAT設備限制大,現在已不常見。

2、NAPT:轉換整個Endpoint(IP:PORT)

現在常用的NAT類型是NAPT,NAPT是一種向外的NAT類型;(就是你可以隨便訪問別人,別人要訪問你就受限),根據限制的不同分為以下四種類型:

(1)完全錐型(FULL CONE NAT)

(2)限制錐型(RESTRICT CONE NAT)

(3)端口限制型(PORT RESTRICT CONE NAT)

(4)對稱型(SYMMETRIC NAT)

二、      NAPT的四種類型

首先我們假設一種場景:一個內網用戶A(Private Endpoint)首次向外發送數據包時創建了地址映射會話,並為A分配了一個公網的Endpoint(IP+PORT),為了方便我們定義它為PA(Public Endpoint);現在外部主機B(IP:PORT)要與A進行通信:

(1)     任何外部主機(B、C、D、E)只要把消息發送到PA上,A就可以接收到消息;A所在的NAT是完全錐型(FULL CONE NAT);

(2)     把消息發送到PA,並且保證A曾經與B的主機IP通信,A才能接收到信息;A所在的NAT就是限制錐型(RESTRICT CONE NAT);

(3)     把消息發送到PA,並且保證A曾與B的Endpoint(IP+PORT)通信,A才能接收到信息;A所在的NAT就是端口限制型(PORT RESTRICT CONE NAT);

(4)     A與不同的外部主機通信,NAT就會給A分配不同的Public Endpoint,外部主機B和C、D、E們,想和A通信,必須A先發消息,它們才能把消息響應給A;A所在的NAT類型就是對稱型(SYMMETRIC NAT);

三、      NAT類型的檢測方法

根據NAT類型的不同,STUN服務器檢測NAT類型分為以下幾步。(STUN服務器有兩個公網Endpoint,我們假設為E1和E2,假設STUN服務器為STUN);

步驟1檢測主機是否位於NAT

A發UDP數據包給E1,STUN將E1收到的數據包頭打包用E1反饋給A,A比較包中的Endpoint與自己的Endpoint是否相同,如果相同,證明A不位於任何NAT之后;否則,就是位於NAT之后,並不能判斷具體的NAT類型;

步驟2:檢測NAT是否是完全錐型

A發UDP數據包給E1,STUN將E1收到到數據包頭打包,用E2反饋給A,如果能收到,證明A所處的NAT是完全錐型的,否則就不是;

步驟3:檢測NAT是否是對稱型的

A分別向E1、E2發送UDP數據包,STUN分別用相應的Endpoint將消息包頭打包反饋給A,A比較一下收到的兩個包頭中的Endpoint是否相同;如果相同,A所處的NAT就不是對稱型的,否則是對稱型的;

步驟4:檢測NAT是限制型還是端口限制型

A發UDP數據包給E1,STUN服務器用與E1相同的IP但不同的端口的Endpoint把收到的包頭打包發給PA,如果能收到,證明A所處的NAT類型是限制型的,如果不能收到,說明A所處的NAT類型是端口限制型的。

tips:A在發消息后會開始監聽端口,並設置超時時間,防止無限阻塞;另外每次檢測的時候也不止發一次UDP包。

四、      穿透方法

穿透有4種方法:

(1)直接通信(direct)

(2)打洞穿越(hole punching)

(3)反向穿越(reverse)

(4)端口預測(Port prediction)

為了方便說明,我們假設有兩個客戶端(Peer),A和B;A和B都會注冊到同一個服務器regist-server,我們簡稱為其RS;這樣RS要讓A和B進行通信而不通過自己;根據A和B所處的NAT環境不同,就有不同的方法。我們做如下假定

A是主動連接者,B是被動鏈接者;

NAT給A分配的Public Endpoint是PA;

NAT給B分配的Public Endpoint是PB;

A所屬的NAT為NAT-A;

B所屬的NAT為NAT-B;

A、 B不在同一個局域網內,不在同一個NAT后;

穿透的四種方法可以說明如下:

(1)直接通信:RS把PB(IP:PORT)直接發給PA,A向PB發消息;

(2)打洞穿越:RS把PA發給PB,把PB發給PA,PA發消息給PB,PB發消息給PA;

(3)反向穿越:RS把PA發給PB,讓B發消息給PA;

(4)端口預測:很難實現UDP-P2P通信

穿越方法根據NAT-A (sender)和NAT-B(receiver)的不同而不同,具體方式如下:

   NAT-B
NAT-A

公網

FULL CONE

RESTRICT CONE

PORT RESTRICT

SYMMETRIC

公網

direct

hole punching

hole punching

hole punching

reverse

FULL CONE

direct

hole punching

hole punching

hole punching

reverse

RESTRICT CONE

direct

hole punching

hole punching

hole punching

reverse

PORT RESTRICT

direct

hole punching

hole punching

hole punching

Port prediction

SYMMETRIC

direct

hole punching

hole punching

Port prediction

Port prediction


免責聲明!

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



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