stun协议实现.docx
《stun协议实现.docx》由会员分享,可在线阅读,更多相关《stun协议实现.docx(10页珍藏版)》请在冰豆网上搜索。
stun协议实现
竭诚为您提供优质文档/双击可除
stun协议实现
篇一:
stun协议简析
stun协议简析stun简介
stun(simpletraversalofudpovernats,nat的udp简单穿越)是一种网络协议,它允许位于nat(或多重nat)后的客户端找出自己的公网地址,查出自己位于哪种类型的nat之后以及nat为某一个本地端口所绑定的internet端端口。
这些信息被用来在两个同时处于nat路由器之后的主机之间建立udp通信。
该协议由RFc3489定义。
一旦客户端得知了internet端的udp端口,通信就可以开始了。
如果nat是完全圆锥型的,那么双方中的任何一方都可以发起通信。
如果nat是受限圆锥型或端口受限圆锥型,双方必须一起开始传输。
需要注意的是,要使用stunRFc中描述的技术并不一定需要使用stun协议——还可以另外设计一个协议并把相同的功能集成到运行该协议的服务器上。
sip之类的协议是使用udp分组在internet上传输音频和/或视频数据的。
不幸的是,由于通信的两个末端往往位于nat之后,因此用传统的方法是无法建立连接的。
这也就是stun发挥作用的地方。
stun是一个客户机-服务器协议。
一个Voip电话或软件包可能会包括一个stun客户端。
这个客户端会向stun服务器发送请求,之后,服务器就会向stun客户端报告nat路由器的公网ip地址以及nat为允许传入流量传回内网而开通的端口。
以上的响应同时还使得stun客户端能够确定正在使用的nat类型——因为不同的nat类型处理传入的udp分组的方式是不同的。
四种主要类型中有三种是可以使用的:
完全圆锥型nat、受限圆锥型nat和端口受限圆锥型nat——但大型公司网络中经常采用的对称型nat(又称为双向nat)则不能使用。
simpletraversalofuserdatagramprotocol(udp)throughnetworkaddresstranslators(nats)(stun)
stun,是为了实现透明的穿透nat,而定义的一套协议。
它使本地的内网的机器,具有取得,能够得知它的nat网关的ip,nat类型的能力。
为什么需要stun:
因为nat虽然解决了ip地址稀少的问题,但是也带来了很多的问题。
比如所有p2p应用,像文件shaRe,多媒体,和在线游戏等等.
要想穿透nat,首先知道nat的一些特性:
nat分为4种(加上防火墙的话,多几种情况):
1.完全透明nat(Fullconenat):
从相同内部主机(inipx)+端口(inpoRtx)发送的数据maping为相同的ip(outipx)和端口(outpoRtx)发送带外网.并且从另一个服务器(y),如果直连到maping的ip(outipx)和端口(outpoRtx)上,数据将会被转发到内部主机上.(inipx),(inpoRtx).
也就是说进内部网的数据包的spoRt,spoRt不受限制
2.受限nat(Restrictedcone),
从相同内部主机(inipx)+端口(inpoRtx)发送的数据maping为相同的ip(x)和端口发送带外网.和完全nat不同的是,只有当为x时,外部机器的的请求就被转发到主机(inipx)+端口(inpoRtx)。
也就是说进内部网的数据包的,spoRt不受限制,sip受限制,只能为natmap数据的ip
3,端口受限nat(portRestrictedcone)
和受限nat不同的是,只有当外部主动请求的的源ip和端口,等于内部网发送的请求的目的ip和端口。
4.对称nat
如果发送的包的目的ipandpoRt,那么mappingipandpoRt,将相同。
内部网同一台机器,同一个端口如果目的地址不同,那么mapping的端口也不同,所以
只有他主动连的服务器才可能知道他的mapping后端口,别的服务器如果想连他只能靠猜测端口。
总结:
前面3重nat,mapingpoRt和ip,是根据发送包的的内部网的ip和端口决定的。
如果数据的内网ip和端口相同,那么mapping后的端口和地址是固定。
这个功能为我们的穿越提供了很好条件。
第4种nat,打洞后的mapping地址和端口将变地不可靠。
很难穿越。
注意seRVeRa,和seRVeRb是两个公网地址,而不是两台机器.
stun协议(浅析例子分析)
主要功能是检测是否位于nat后面,如果位于nat后面,经过nat转换后的地址和端口是什么,另外可以检测nat的类型。
基本思想
在私网内部安装一个stunclient,在公网上安装一个stunserver,stun协议定义了一些消息格式,大体上分成Request/Response,client向server发送request,server发送response给client。
如何检测stunclient是否在nat后面呢?
原理很简单,server在收到client的udp包以后,server将接收到该包的地址和端口利用udp传回来给client,client把这些地址和端口与本机的ip地址和端口进行比较,如果不同,说明在nat后面,否则就位于nat前面。
为了检测不同类型的nat,stun协议定义了一些消息属性,要求server有不同的动作,比如发送响应的时候使用不同的ip地址和端口,或者改变端口等等。
stun协议对nat可能有效,但是对防火墙就无能为力了,因为防火墙可能不会打开udp端口。
nat分类
stun协议将nat粗略分为4种类型,即Fullcone、Restrictedcone、portRestrictedcone和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,有下列不同的结果:
Fullconenat:
c发数据到210.21.12.140:
8000,nat会将数据包送到a
(192.168.0.4:
5000)。
因为nat上已经有了192.168.0.4:
5000到210.21.12.140:
8000的映射。
Restrictedcone:
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:
20xx->210.21.12.140:
8000,nat会送到a的5000端口上。
portRestrictedcone:
c无法与a通信,因为a从来没有和c通信过。
而b也只能用它的210.15.27.166:
2000与a的192.168.0.4:
5000通信,因为a也从来没有和b的其他端口通信过。
该类型nat是端口受限的。
symmetricnat:
上面3种类型,统称为conenat,有一个共同点:
只要是从同一个内部地址和端口出来的包,nat都将它转换成同一个外部地址和端口。
但是
symmetric有点不同,具体表现在:
只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则nat也都将它转换成同一个外部地址和端口。
但如果从同一个内部地址和端口出来,是到另一个外部目标地址和端口,则nat将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。
而且和portRestrictedcone一样,只有曾经收到过内部地址发来包的外部地址,才能通过nat映射后的地址向该内部地址发包。
现针对symmetricnat举例说明:
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.bindingRequests,sentoverudp,
用来发现nat的公网地址,和mapping后的端口
2.bindingResponse,
服务器产生bindingResponse,并把得到的mappingip和端口,返回到客户端,客户端比较mapping地址是否和本机地址相同,如果是说明是本机也是公网,否则判断nat的类型(判断方法:
clientusesadditionalstunbindingRequests)
3.bindingerror,
4.sharedsecretRequests,sentovertls[2]overtcp.
这个请求要求服务器返回一临时用户名和密码,用来下一步的bindingRequests/Response,用来验证信息的完整性
5.sharedsecretResponse,
6sharedsecreterrorResponse。
篇二:
stun原理及过程
stun原理及过程
stun是RFc3489规定的一种nat穿透方式,它采用辅助的方法探测nat的ip和端口。
毫无疑问的,它对穿越早期的nat起了巨大的作用,并且还将继续在ant穿透中占有一席之地。
stun的探测过程需要有一个公网ip的stunserver,在nat后面的uac必须和此server配合,互相之间发送若干个udp数据包。
udp包中包含有uac需要了解的信息,比如nat外网ip,poRt等等。
uac通过是否得到这个udp包和包中的数据判断自己的nat类型。
假设有如下uac(b),nat(a),seRVeR(c),uac的ip为ipb,nat的ip为ipa,seRVeR的ip为ipc1、ipc2。
请注意,服务器c有两个ip,后面你会理解为什么需要两个ip。
(1)nat的探测过程:
step1:
b向c的ip1的pot1端口发送一个udp包。
c收到这个包后,会把它收到包的源ip和port写到udp包中,然后把此包通过ip1和port1发还给b。
这个ip和port也就是nat的外网ip和port(如果你不理解,那么请你去看我的blog里面的nat的原理和分类),也就是说你在step1中就得到了nat的外网ip。
熟悉nat工作原理的朋友可以知道,c返回给b的这个udp包b一定收到(如果你不知道,去读下我的其它文章)。
如果在你的应用中,向一个stun服务器发送数据包后,你没有收到stun的任何回应包,那只有两种可能:
1、stun