STUN
?STUN(Simple Traversal of User Datagram Protocol through Network Address Translators (NATs),NAT的UDP簡單穿越)是一種網絡協議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網地址,查出自己位于哪種類型的NAT之后以及NAT為某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處于NAT 路由器之后的主機之間建立UDP通信。該協議由RFC 3489定義
一旦客戶端得知了Internet端的UDP端口,通信就可以開始了。如果NAT是完全圓錐型的,那么雙方中的任何一方都可以發起通信。如果NAT是受限圓錐型或端口受限圓錐型,雙方必須一起開始傳輸。
需要注意的是,要使用STUN RFC中描述的技術并不一定需要使用STUN協議——還可以另外設計一個協議并把相同的功能集成到運行該協議的服務器上。
SIP之類的協議是使用UDP分組在Internet上傳輸音頻和/或視頻數據的。不幸的是,由于通信的兩個末端往往位于NAT之后,因此用傳統的方法是無法建立連接的。這也就是STUN發揮作用的地方。
STUN是一個客戶機-服務器協議。一個VoIP電話或軟件包可能會包括一個STUN客戶端。這個客戶端會向STUN服務器發送請求,之后,服務器就會向STUN客戶端報告NAT路由器的公網IP地址以及NAT為允許傳入流量傳回內網而開通的端口。
以上的響應同時還使得STUN客戶端能夠確定正在使用的NAT類型——因為不同的NAT類型處理傳入的UDP分組的方式是不同的。四種主要類型中有三種是可以使用的:完全圓錐型NAT、受限圓錐型NAT和端口受限圓錐型NAT——但大型公司網絡中經常采用的對稱型NAT(又稱為雙向NAT)則不能使用。
算法
NAT設備的類型對于TCP穿越NAT,有著十分重要的影響,根據端口映射方式,NAT可分為如下4類,前3種NAT類型可統稱為cone類型。
(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 使用下列的算法(取自 RFC 3489)來發現 NAT gateways 以及防火墻(firewalls):
一旦路經通過紅色箱子的終點時,UDP的溝通是沒有可能性的。一旦通過黃色或是綠色的箱子,就有連線的可能.
?STUN客戶端向STUN服務器發送請求,要求得到自身經NAT映射后的地址:
??????? a,收不到服務器回復,則認為UDP被防火墻阻斷,不能通信,網絡類型:Blocked.
??????? b,收到服務器回復,對比本地地址,如果相同,則認為無NAT設備,進入第2步,否則認為有NAT設備,進入3步.
??? 2, (已確認無NAT設備)STUN客戶端向STUN服務器發送請求,要求服務器從其他IP和PORT向客戶端回復包:
??????? a,收不到服務器從其他IP地址的回復,認為包被前置防火墻阻斷,網絡類型:Symmetric UDP Firewall.
??????? b,收到則認為客戶端處在一個開放的網絡上,網絡類型:Opened.
??? 3, (已確認存在NAT設備)STUN客戶端向STUN服務器發送請求,要求服務器從其他IP和PORT向客戶端回復包:
??????? a,收不到服務器從其他IP地址的回復,認為包被前置NAT設備阻斷,進入第4步.
??????? b,收到則認為NAT設備類型為Full Cone,即網絡類型:Full Cone NAT.
??? 4, STUN客戶端向STUN服務器的另外一個IP地址發送請求,要求得到自身經NAT映射后的地址,并對比之:
??????? a,地址不相同,則網絡類型:Symmetric NAT.
??????? b,相同則認為是Restricted NAT,進入第5步,進一步確認類型.
??? 5, (已確認Restricted NAT設備)STUN客戶端向STUN服務器發送請求,要求服務器從相同IP的其他PORT向客戶端回復包:
??????? a,收不到服務器從其他PORT地址的回復,認為包被前置NAT設備阻斷,網絡類型:Port Restricted cone NAT.
??????? b,收到則認為網絡類型: Restricted cone NAT.
STUNT
STUNT (Simple Traversal of UDP Through NATs and TCP too )), which extends STUN to include TCP functionality, is a lightweight protocol that allows applications running behind a NAT to determine external IP and port-binding properties, packet filtering rules and various timeouts associated with TCP connections through the NAT. Knowing these parameters allows applications to establish TCP sessions between two NAT'ed hosts. As a result P2P and other applications can work through existing NAT infrastructure without sacrificing the benefits of TCP.
XSTUNT
XSTUNT is a C/C++ library which implements "STUNT #2" approach in "Characterization and Measurement of TCP Traversal through NAT and Firewalls". It provides programmers with a set of simple functions to create STUNT connections through cooperating with a particular XSTUNT server
?實現:http://www.cis.nctu.edu.tw/~gis87577/xDreaming/XSTUNT/index.html
其他資料:
1. Characterization and Measurement of TCP Traversal through NATs and Firewalls (PDF).
2.? Peer-to-Peer Communication Across Network Address Translators (翻譯: google搜素"穿越NAT的p2p通信方法研究").
?