转载 http://blog.csdn.net/mazidao2008/article/details/4934257后端
STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它容许位于NAT(或多重NAT)后的客户端找出本身的公网地址,查出本身位于哪一种类型的NAT以后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器以后的主机之间创建UDP通讯。该协议由RFC 3489定义。 服务器
一旦客户端得知了Internet端的UDP端口,通讯就能够开始了。若是NAT是彻底圆锥型的,那么双方中的任何一方均可以发起通讯。若是NAT是受限圆锥型或端口受限圆锥型,双方必须一块儿开始传输。 网络
须要注意的是,要使用STUN RFC中描述的技术并不必定须要使用STUN协议——还能够另外设计一个协议并把相同的功能集成到运行该协议的服务器上。 数据结构
SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,以后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为容许传入流量传回内网而开通的端口。 spa
以上的响应同时还使得STUN客户端可以肯定正在使用的NAT类型——由于不一样的NAT类型处理传入的UDP分组的方式是不一样的。四种主要类型中有三种是可使用的:彻底圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT——但大型公司网络中常常采用的对称型NAT(又称为双向NAT)则不能使用。.net
Simple Traversal of User Datagram Protocol (UDP) Through Network设计
Address Translators (NATs) (STUN)视频
STUN,是为了实现透明的穿透NAT,而定义的一套协议。它使本地的内网的机器,具备取得,可以得知它的NAT网关的IP,NAT类型的能力。server
为何须要STUN:blog
由于NAT虽然解决了IP地址稀少的问题,可是也带来了不少的问题。好比全部P2P应用,像文件SHARE,要想穿透NAT,首先知道NAT的一些特性:
NAT分为4种(加上防火墙的话,多几种状况):
1.彻底透明NAT(Full Cone NAT):
从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(OUT IP X)和端口(OUT PORT X)发送带外网.而且从另外一个服务器(Y),若是直连到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).
也就是说进内部网的数据包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(X)和端口发送带外网.和彻底NAT不一样的是,只有当为X时,外部机器的的请求就被转发到主机(IN IPX) +端口(IN PORTX)。也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,只能为NAT MAP数据的IP
3,端口受限NAT(Port Restricted Cone)
和受限NAT不一样的是,只有当外部主动请求的的源IP和端口,等于内部网发送的请求的目的IP和端口。
4.对称NAT
若是发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。内部网同一台机器,同一个端口若是目的地址不一样,那么MAPPING的端口也不一样,因此只有他主动连的服务器才可能知道他的 MAPPING后端口,别的服务器若是想连他只能靠猜想端口。
总结:前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。若是数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。这个功能为咱们的穿越提供了很好条件。
第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。注意SERVERA,和SERVERB是两个公网地址,而不是两台机器.
STUN协议(浅析例子分析)
主要功能是检测是否位于NAT后面,若是位于NAT后面,通过NAT转换后的地址和端口是什么,另外能够检测NAT的类型。
基本思想
在私网内部安装一个STUN client,在公网上安装一个STUN Server,STUN 协议定义了一些消息格式,大致上分红Request/Response,client向server发送 request,server发送response给client。如何检测STUN client是否在NAT后面呢?原理很简单,Server在收到client的UDP包之后,Server将接收到该包的地址和端口利用udp传回来给 client,client把这些地址和端口与本机的ip地址和端口进行比较,若是不一样,说明在NAT后面,不然就位于NAT前面。为了检测不一样类型的 NAT,STUN协议定义了一些消息属性,要求Server有不一样的动做,好比发送响应的时候使用不一样的IP地址和端口,或者改变端口等等。STUN协议 对NAT可能有效,可是对防火墙就无能为力了,由于防火墙可能不会打开UDP端口。
NAT分类
STUN协议将NAT粗略分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。举个实际例子来讲明这四种NAT的区别:
A机器在私网(192.168.0.4)
NAT服务器(210.21.12.140)
B机器在公网(210.15.27.166)
C机器在公网(210.15.27.140)
如今,A机器链接过B机器,假设是 A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)。
同时A历来没有和C通讯过。
则对于不一样类型的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端口上。
Port Restricted Cone:C没法与A通讯,由于A历来没有和C通讯过。而B也只能用它的210.15.27.166:2000与A的192.168.0.4:5000通讯,由于A也历来没有和B的其余端口通讯过。该类型NAT是端口受限的。
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通讯。
STUN 的简单操做过程:
发送请求。请求分为两种
1.Binding Requests, sent over UDP,
用来发现NAT的公网地址,和MAPPING后的端口
2. Binding Response,
服务器产生Binding Response,并把获得的MAPPINGIP 和端口,返回到客户端, 客户端比较MAPPING地址是否和本机地址相同,若是是说明是本机也是公网,不然判断NAT的类型(判断方法:client uses additional STUN Binding Requests)
3.Binding Error,
4.Shared Secret Requests, sent over TLS [2] over TCP.
这个请求要求服务器返回一临时用户名和密码,用来下一步的Binding Requests/ Response,用来验证信息的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
STUN 信息结构
STUN 由之后数据结构构成:STUN头+STUN有效载荷
STUN头结构以下: 存储的值都是以网络顺序存放
字段 类型
STUN message type Short int 消息类型
Length Short int 有效载荷长度,不包含头长度
transaction ID octet[16] 链接的ID值,检查Request,和Response
STUN的有效载荷
SHUN的有效载荷是一些STUN的属性构成,属性的类型由信息的类型来决定。
STUN的属性是定义好了的,属性列表(attribute)以下:
MAPPED-ADDRESS 必选 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS 可选 用在Binding Request,指定Response,发送到哪里
若是没有指定,Response发送到MAPING IP 和 PORT
CHANGE-REQUEST 可选 用在Binding Request。用来决定,CLIENT的NAT类型是
制NAT,仍是端口限制NAT,(命令服务器从不一样的源端口/IP,Response请求)
CHANGED-ADDRESS 可选 用在Binding Responses告诉Client改变的端口和IP
SOURCE-ADDRESS 必选 只用在Binding Responses,标记信息的源PORT HE IP
USERNAME 可选 Shared Secret Response/ Binding Requests
PASSWORD, 必选 SharedSecret Response
ESSAGEINTEGRITY 可选 用在Binding Responses, Binding Request记录信息的完整性
ERROR-CODE Binding Error Response and Shared Secret Error Response.
UNKNOWN-ATTRIBUTES
REFLECTED-FROM Binding Responses.用于追溯和防止DDOS
穿透的方法和过程