STUN

STUN（Session Traversal Utilities for NAT，NAT会话穿越应用程序）是一种网络协议，它允许位于NAT（或多重NAT）后的客户端找出自己的公网地址，查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由 RFC 5389 定义。

 方案 
一旦客户端得知了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）则不能使用。

 演算法 

STUN使用下列的演算法（取自RFC 3489）來發現NAT中间件以及防火牆（firewalls）:

-{zh-hans: 614px; zh-hant: 614px}-

一旦路經通過紅色箱子的終點時，则无法通过NAT穿透建立UDP连接。一旦通過黃色或是綠色的箱子，就有連線的可能。

註：此演算法在RFC 3489被提出，但在RFC 5389中被刪除。詳細的原因可以到RFC 5389的Page 45中查看。

 參見 
NAT穿越
TURN
ICE

 外部链接 
 RFC 3489, STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)
 RFC 5389, STUN - Session Traversal Utilities for NAT 
 Latest revision (bis) to the RFC - draft-ietf-behave-rfc3489bis-09
 NAT traversal White Paper comparing STUN with other NAT traversal techniques such as TURN, ICE, ALGs and Session Border Controllers - Source: Newport Networks
 STUNT - "STUN and TCP too", which extends STUN to include TCP functionality
 Yahoo! - Director of Engineering explaining STUN and TURN (Video)

 實現 
 STUN Client and Server library 
 JSTUN - A Java STUN implementation 
 Java STUN library "stun4j"

S
S