STUNSession 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):

 

一旦路经通过红色箱子的终点时,则无法通过NAT穿透建立UDP连接。一旦通过黄色或是绿色的箱子,就有连线的可能。

注:此算法在RFC 3489被提出,但在RFC 5389中被删除。详细的原因可以到RFC 5389的Page 45中19.Changes since RFC 3489查看。

参见

外部链接

实现