一、 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 |
公網 |
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 |