原文連結:
http://choudaxian.blog.163.com/blog/static/1900141120090122925744/
(1)全複製( Full Cone) : NAT把所有來自相同內部IP地址和連接埠的請求映射到相同的外部IP地址和連接埠。任何一個外部主機均可通過該映射發送IP包到該內部主機。
(2)限制性複製(Restricted Cone) : NAT把所有來自相同內部IP地址和連接埠的請求映射到相同的外部IP地址和連接埠。但是,只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。
(3)連接埠限制性複製( Port Restricted Cone) :連接埠限制性複製與限制性複製類似,只是多了連接埠號碼的限制,即只有內部主機先向IP地址為X,連接埠號碼為P的外部主機發送1個IP包,該外部主機才能夠把源連接埠號碼為P的IP包發送給該內部主機。
(4)對稱式NAT ( Symmetric NAT) :這種類型的NAT與上述3種類型的不同,在於當同一內部主機使用相同的連接埠與不同地址的外部主機進行通訊時, NAT對該內部主機的映射會有所不同。對稱式NAT不保證所有會話中的私人地址和公開IP之間綁定的一致性。相反,它為每個新的會話分配一個新的連接埠號碼。
STUN協議的全稱是Simple Traversal of User Datagram Protocol Through Network Address Translators,主要功能是檢測是否位於NAT後面,如果位於NAT後面,經過NAT轉換後的地址和連接埠是什麼,另外可以檢測NAT的類型。
現在,A機器串連過B機器,假設是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)。同時A從來沒有和C通訊過。則對於不同類型的NAT,有下列不同的結果:
Cone NAT
Full Cone NAT:C發資料到210.21.12.140:8000,NAT會將資料包送到A(192.168.0.4:5000)。因為NAT上已經有了192.168.0.4:5000到210.21.12.140:8000的映射。(即:外網中的主機可以主動與內網中的一台主機進行串連)
Restricted Cone:C無法和A通訊,因為A從來沒有和C通訊過,NAT將拒絕C試圖與A串連的動作。但B可以通過210.21.12.140:8000與A的 192.168.0.4:5000通訊,且這裡B可以使用任何連接埠與A通訊。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT會送到A的5000連接埠上。
(即:外網中的主機不可以主動與內網中的主機建立串連,但內網中原先A與B建立的串連仍存在,並且B可以改變連接埠號碼與A串連。)
Port Restricted Cone:C無法與A通訊,因為A從來沒有和C通訊過。而B也只能用它的210.15.27.166:2000與A的192.168.0.4:5000通訊,因為A也從來沒有和B的其他連接埠通訊過。該類型NAT是連接埠受限的。(即:A與B必須按照原先的方式進行串連,不能更改連接埠號碼,並且外網內的主機不能與內網中的主機建立串連.)
Symmetric NAT:上面3種類型,統稱為Cone NAT,有一個共同點:只要是從同一個內部地址和連接埠出來的包,NAT都將它轉換成同一個外部地址和連接埠。但是Symmetric有點不同,具體表現在:只要是從同一個內部地址和連接埠出來,且到同一個外部目標地址和連接埠,則NAT也都將它轉換成同一個外部地址和連接埠。但如果從同一個內部地址和連接埠出來,是到另一個外部目標地址和連接埠,則NAT將使用不同的映射,轉換成不同的連接埠(外部地址只有一個,故不變)。而且和Port
Restricted Cone一樣,只有曾經收到過內部地址發來包的外部地址,才能通過NAT映射後的地址向該內部地址發包。
現針對Symmetric NAT舉例說明:
A機器串連過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)
如果此時A機器(192.168.0.4:5000)還想串連C機器(210.15.27.140:2000),則NAT上產生一個新的映射,對應的轉換可能為A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8001)-> C(210.15.27.140:2000)。此時,B只能用它的(210.15.27.166:2000)通過NAT的(210.21.12.140: 8000)與A的(192.168.0.4:5000)通訊,
C也只能用它的(210.15.27.140:2000)通過NAT的(210.21.12.140:8001)與A的(192.168.0.4:5000)通訊,而 B或者C的其他連接埠則均不能和A的(192.168.0.4:5000)通訊。
對稱NAT
[202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]
^ ^ ^
| | |
v v v
9883 9882 9881
\ | /
[NAT]
^
|
v
[192.168.0.6:1827]
Symmetric 的英文意思是對稱。多個連接埠對應多個主機,平行的,對稱的!
內網地址
10.0.0.0~10.255.255.255,172.16.0.0~172.16.255.255,192.168.0.0~192.168.255.255。
NAT類型檢測步驟:
連結:http://www.cnblogs.com/my_life/articles/1908552.html
前提條件:有一個公網的Server並且綁定了兩個公網IP(IP-1,IP-2)。這個Server做UDP監聽(IP-1,Port-1),(IP-2,Port-2)並根據用戶端的要求進行應答。
第一步:
檢測用戶端是否有能力進行UDP通訊以及用戶端是否位於NAT後?
用戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)發送資料包要求伺服器返回用戶端的IP和Port, 用戶端發送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都逾時,無法接受到伺服器的回應,則說明用戶端無法進行UDP通訊,可能是防火牆或NAT阻止UDP通訊,這樣的用戶端也就 不能P2P了(檢測停止)。
當用戶端能夠接收到伺服器的回應時,需要把伺服器返回的用戶端(IP,Port)和這個用戶端socket的 (LocalIP,LocalPort)比較。如果完全相同則用戶端不在NAT後,這樣的用戶端具有公網IP可以直接監聽UDP連接埠接收資料進行通訊(檢 測停止)。否則用戶端在NAT後要做進一步的NAT類型檢測(繼續)。
第二步:
檢測用戶端NAT是否是Full Cone NAT?
用戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)發送資料包要求伺服器用另一對(IP-2,Port-2)響應用戶端的請求往回 發一個資料包,用戶端發送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都逾時,無法接受到伺服器的回應,則說明用戶端的NAT不是一個Full Cone NAT,具體類型有待下一步檢測(繼續)。如果能夠接受到伺服器從(IP-2,Port-2)返回的應答UDP包,則說明用戶端是一個Full
Cone NAT,這樣的用戶端能夠進行UDP-P2P通訊(檢測停止)。
第三步:
檢測用戶端NAT是否是Symmetric NAT?
用戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)發送資料包要求伺服器返回用戶端的IP和Port, 用戶端發送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程直到收到回應(一定能夠收到,因為第一步保證了這個用戶端可以進行UDP通訊)。
用同樣的方法用一個socket向伺服器的(IP-2,Port-2)發送資料包要求伺服器返回用戶端的IP和Port。
比 較上面兩個過程從伺服器返回的用戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明用戶端為Symmetric NAT,這樣的用戶端無法進行UDP-P2P通訊(檢測停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續)。
第四步:
檢測用戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?
用戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)發送資料包要求伺服器用IP-1和一個不同於Port-1的連接埠發送一個UDP 資料包響應用戶端, 用戶端發送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都逾時,無法接受到伺服器的回應,則說明用戶端是一個Port Restricted Cone NAT,如果能夠收到伺服器的響應則說明用戶端是一個Restricted
Cone NAT。以上兩種NAT都可以進行UDP-P2P通訊。
註:以上檢測過程中只說明了可否進行UDP-P2P的打洞通訊,具體怎麼通訊一般要藉助於Rendezvous Server。另外對於Symmetric NAT不是說完全不能進行UDP-P2P達洞通訊,可以進行連接埠預測打洞,不過不能保證成功。