stun 服务器?turn协议的工作原理
大家好,今天给各位分享stun 服务器的一些知识,其中也会对turn协议的工作原理进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
turn协议的工作原理
a)客户端A向STUN Port发送Allocate请求(图中绿色部分)
** b)**STUN服务器接收到客户端A的Allocate请求,服务器一看是Allocate请求,则根据relay端口分配策略为A分配一个端口。
c)服务器发送response成功响应。在该response中包含XOR-RELAYED-ADDRESS属性。该属性值就是A的relay端口的异或结果。
d)客户端接收到response后,就知道了自己的relay地址。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就可以了,具体的转发原理请看下一小节。
任何想要联系客户端A的人,只要知道客户端A的relay地址就可以了。
如上图所示:因为客户端A位于NAT后,所以其他客户端无法和A建立直接的通信。但是客户端A在STUN服务器上申请了一个端口(上图中:A的relay端口),其他客户端想要和A通信,那么只需要将信息发送到“A的relay端口”,STUN服务器会将从relay端口接收到的信息通过STUN Port发送给A。
A应答其他客户端发来的消息的时候,是通过原路返回的。
思考
1.STUN服务器为什么不直接从A的relay端口把数据转发给A呢(如下图所示)?而非要从STUN端口发送?
STUN服务器给客户端A分配的relay地址都具有一定的有效时长,可能是30秒或者1分钟或者几十分钟。客户端如果需要STUN服务器一直为它开启这个端口,就需要定时的向STUN服务器发送请求,该请求用刷新relay端口的剩余时间。
在标准的TURN(RFC 5766)协议中,客户端A向STUN服务器发送Allocate请求,STUN服务器在响应消息中添加了一个“LifeTime”的属性,该属性表示relay的存活时间。客户端需要在relay的存活时间内周期性的调用REFRESH请求,服务端接收到REFRESH请求后,刷新剩余时间;当REFRESH请求中的lifetime属性为0时,说明是客户端主动要求关闭relay地址。
由于与STUN服务器通信使用的是UDP,所以为了保持一个长连接,需要客户端周期性的向STUN服务器的STUN Port发送心跳包。
周期性心跳包的目的就是,使得NAT设备对客户端A的反射地址(Server Reflexive Address)一直有效。使得从STUN Port发送的数据能通过A的反射地址到达A。此处不理解的可以查阅“NAT类型的分类以及NAT的作用”。
此处解释了,7.2.2.3中的第一个问题,因为客户端A没有和relay Port保活,又由于NAT的特性,数据直接通过relay port转发给A时,NAT直接就丢弃了,所以A是收不到的。所以数据必须经过STUN服务器的STUN Port发送。
如上图所示是B主动给A发消息:“Hello”,A回应“Hi”的过程。
序号1、2、3、4、5为B的发送请求(蓝色箭头方向);
序号6、7、8、9、10为A的回应,原路返回(绿色箭头方向)。
注意:在“Hello”发送的过程中,1、2阶段时,发送的数据为裸的UDP数据。在4、5过程中,是被STUN协议包装过的“Hello”,称之为Data indication。
同样在“Hi”发送的过程中,6、7阶段为被STUN协议包装过的“Hi”,称之为Send indication,9、10是裸的UDP数据。
在4、5阶段,由于数据是从STUN Port转发下来的,为了能够让客户端A知道这个包是哪个客户端发来的,所以,STUN协议对“Hello”进行了重新的包装,最主要的就是添加了一个XOR-PEER-ADDRESS属性,由裸数据包装成STUN协议的过程,我们称之为添加了STUN头。XOR-PEER-ADDRESS的内容就是客户端B的反射地址(Server Reflexive Address)。
在6、7阶段,A的响应原路返回,为了能够让A的relay port知道最终发往哪个客户端,因此也为“Hi”添加了STUN头,也是添加了XOR-PEER-ADDRESS属性,内容就是客户端B的反射地址(Server Reflexive Address)。这样A的relay port就知道“Hi”的目的地址。
第3阶段是:从A的relay端口收到数据,添加STUN头后,最后从STUN Port发出的过程。
第8阶段是:从STUN Port接收到带STUN头的数据,去掉STUN头,最后从A的relay端口发出的过程。
客户端B主动发送信息给A的交互流程如上图所示,那么客户端A主动发送信息给客户端B的交互流程是怎样的呢,你能画出来吗?
要知道客户端A主动发消息给客户端B,应该将消息发往客户端B的relay port哦。。
100分求助能在windows下运行的stun服务器软件
HP机器是没有系统光盘的(如果你没有把机器内的系统备份刻出盘来的话)
如果还想用自己正版的VISTA系统,只能F11恢复(电脑买来后如果没有被重新分过区,是一定能F11恢复的)
系统没有大问题的话也可以强行进入桌面试一下,打开任务管理器--文件--新建任务--浏览--windows(Win的系统文件夹)--explorer.exe(运行这个文件)
如果没有就重别的VISTA COPY一个过来放到这个文件夹内
coturn服务器配置
注:为了更好的体验,将内容复制到工具中效果才好
#coturn服务器配置
##操作系统:建议使用ubuntu16+
##安装步骤:
以下安装以ubuntu16为例
###安装软件包
* apt update
* apt install coturn
###配置coturn服务器
####复制DTLS、TLS支持的证书文件(目录中已经有相应的证书)
* cp/usr/share/coturn/examples/etc/turn_server_cert.pem/etc/turn_server_cert.pem
* cp/usr/share/coturn/examples/etc/turn_server_pkey.pem/etc/turn_server_pkey.pem
####编辑/etc/turnserver.conf文件
listening-device=eth0#网卡
listening-port=3478#对外服务的商品,需要在防火墙、云服务器安全组放通,协议为UDP/TCP,出入站都需要
listening-ip=127.0.0.1#内网地址
tls-listening-port=5349#备用端口
listening-ip=172.17.0.4#局域网地址
relay-ip=172.17.0.4#局域网地址
external-ip=81.0.187.0#外网地址
lt-cred-mech
server-name=stun.xxx.cn#域名
realm=stun.xxx.cn#域名
min-port=50001#穿透需要用到的开始端口需要在防火墙,云服务器安全组中放通
max-port=50009#穿透需要用到的结束端口
user=test:test#用户名:密码测试或者客户端接入时需要用到
userdb=/var/db/turndb#数据文件的位置,如果没有该文件,启动会有错误提示
cert=/etc/turn_server_cert.pem#密钥相关上面步骤准备的
pkey=/etc/turn_server_pkey.pem#密钥相关上面步骤准备的
no-stdout-log
log-file=/var/tmp/turn.log#日志文件
pidfile="/var/run/turnserver.pid"#pid文件位置
no-stun#不使用stun服务主要用于测试turn中继方式时来关闭stun 更多类容可以参考配置文件自带的说明
###编辑/etc/default/coturn文件
*默认是不需要改的,但还是检查一下
* TURNSERVER_ENABLED=1
##安装完成,重启服务
* service coturn restart
##端口放通
*参考各系统、服务器,不赘述
##测试
*使用自带工具
turnutils_uclient ip或者域名-u用户名-w密码
##客户端使用
iceServers: [{
'urls':'stun:stun.xxxx.cn:3478',
'credential':"test",
'username':"test"
}
,{
'urls':'turn:stun.xxxx.cn:3478',
'credential':"test",
'username':"test"
}];
好了,文章到这里就结束啦,如果本次分享的stun 服务器和turn协议的工作原理问题对您有所帮助,还望关注下本站哦!