webrtc学习: 部署stun和turn服务器

webrtc的P2P穿透部分是由libjingle实现的. 

步骤顺序大概是这样的: 

1. 尝试直连.

2. 通过stun服务器进行穿透

3. 无法穿透则通过turn服务器中转. 

 

stun 服务器比较简单. 网上也有很多公开的stun服务器可以用于测试. 例如 stun.ideasip.com

这里需要注意一下. 我在做Android应用时. 在少数老旧的手机上出现过一个bug: 

PeerConnection close时非常慢. 大概需要50~80s. 

后来反复检查, 才发现问题出在公用的stun服务器响应比较慢. 

解决办法就是在自己搭一个stun服务器即可. 

具体原因应该是: 一直在进行ice探测(stun bind request). 关闭的时候worker 线程因为网络卡住了, 然后main线程等待. 这个不太好查. 可能需要打很多log来定位代码. 

 

无法穿透的时候就需要 turn 服务器来保证视频通话的成功率. 

turn 包含了stun的功能. 所以只需要部署turn服务器即可. 

服务器代码可以从这里获取: https://code.google.com/p/coturn/

coturn 在原来的turnserver上增加了一些高级特性. (这是作者的描述, 两个项目是同一个作者. 作者更推荐使用coturn). 

coturn  支持tcp, udp, tls, dtls 连接.

coturn 支持Linux bsd solaris mac os. 暂不支持windows (未来会支持)

下面说一下安装和配置. 

1. coturn 的底层网络部分依赖libevent.  所以需要先安装libevent2, 地址在此 http://libevent.org/

2. coturn的安装很简单. configure make make install 三部曲就完事了. 

3. coturn的文档说明挺详细的. 但比较多. 我只是大概说明下. 

更具体的说明可以看 源码目录下的README.turnserver README.turnadmin README.turnutils

 

在bin目录下生成六个可执行文件

turnadmin turnutils_peer turnutils_stunclient
turnserver turnutils_rfc5769check turnutils_uclient

turnserver 就是我们需要的服务器. 

turnadmin 用来管理账户. 

turnutils_stunclient 用于测试stun服务

turnutils_uclient 用于测试turn服务. 模拟多个UDP,TCP,TLS or DTLS 类型的客户端

 

example 目录主要是示范如何配置和使用turn. 包含一些测试用例. 

example/etc 下是pem证书和conf配置文件

example/var/db 下是sqlite的db库. 用于示范数据库的格式.

coturn 支持三种配置. 命令行, conf文件和数据库. 数据库支持sqlite, MySQL, postgresql, MongoDBRedis.

 

examples\scripts 下一些测试用例: 

loadbalance 示范如何进行负载均衡.  设置一个master turn server 然后配置若干个slave turn server. 

longtermsecure 示范如何使用long-term 验证

longtermsecuredb 与 longtermsecure 类似, 不过是从数据库配置

shorttermsecure 示范如何使用short-term验证. 

restapi 示范了web方面的使用. 

 

stun 定义了两种验证方式. 

Long-Term Credential
Short-Term Credential

具体可以参考stun标准 http://tools.ietf.org/html/rfc5389#section-15.4

但是对于webrtc而言. 仅支持long-term . 

 

http://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
TURN REST Server API

这个PDF 描述了. turn服务器和客户端的交互流程.

 

4. 简单的使用

turnserver -o -a -f -v --mobility -m 10 --max-bps=100000 --min-port=32355 --max-port=65535 --user=ling:ling1234 --user=ling2:ling1234 -r demo

-m 10 表示启动十个relay线程. 

当TURN Server用于WebRTC时,必须使用long-term credential mechanism,  即指定 -a 或者 --lt-cred-mech

--max-bps=100000 限制最大速度为100KB/s. 

添加了两个用户ling 和ling2. 

可以直接使用turnutils_uclient -u ling -w ling1234 来测试. turnutils_uclient 有很多参数可以配置的. 

 

[javascript] view plain copy

 

  1. webrtc::PeerConnectionInterface::IceServer turnServer;  
  2. turnServer.uri = "turn:ip";  
  3. turnServer.username = "ling";  
  4. turnServer.password = "ling1234";  
  5. servers.push_back(turnServer);  

 

c++ webrtc中可以这样配置turn. web/android/iOS 也是类似的. 

如果从安全性方面考虑. 可以为账户生成key, 这样就可以直接通过key登录. 而不需要提供密码. 

key 通过turnadmin生成, 需要(username, password, realm) . realm是启动turn server时-r 参数指定的. 

[javascript] view plain copy

 

    1. turnadmin -k -u ling -p ling1234 -r demo  
    2. 0xccba8f3a6a025a38eb4a0e795fc92705  
时间: 2024-10-29 14:50:35

webrtc学习: 部署stun和turn服务器的相关文章

WebRTC学习资料大全

在学习WebRTC,找了些资料,记录一下,供以后查询. 有些需要FQ才能看 WebRTC 介绍 官网在这里:https://webrtc.org/.然后这里有一个官方的Getting Started:https://webrtc.org/start/. Google关于WebRTC的幻灯片: http://io13webrtc.appspot.com/ 然后是WebRTC的SPEC: https://www.w3.org/TR/webrtc/ WebRTC项目源码地址:https://chrom

restund 0.4.1发布 STUN/TURN服务器

restund 是一款模块化的STUN/TURN服务器,其主要设计是围绕着轻量级的核心和服务器模块的扩展功能原则.支持UDP和TCP,以及http://www.aliyun.com/zixun/aggregation/9485.html">IPv6和IPv4.支持的模块包括:STUN.TURN.MySQL数据库.系统日志和状态监测. 关于STUN STUN(Simple Traversal of UDP over NATs)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己

WebRTC学习与DEMO资源一览

一. WebRTC学习 1.1   WebRTC现状 本人最早接触WebRTC是在2011年底,那时Google已经在Android源码中加入了webrtc源码,放在/external/webrtc/,但是Android并没有用到它,更没有被浏览器使用.当时试图在Android 2.3(Gingerbread)高通平台的手机上用H.264 硬件codec替换掉WebRTC缺省使用的VP8软codec,费了不少劲勉强换掉后效果很差只得放弃. 最近得知Google最新版的Chrome for And

带一般处理程序的web网站在本地部署可以,在服务器上部署不起作用

问题描述 带一般处理程序的web网站在本地部署可以,在服务器上部署不起作用 带一般处理程序的web网站在本地部署可以,在服务器上部署不起作用

spark服务器异常关闭-spark开发部署的时,服务器经常关闭

问题描述 spark开发部署的时,服务器经常关闭 org.jivesoftware.openfire.XMPPServer - Exception during module shutdown java.lang.NullPointerException at org.jivesoftware.openfire.pubsub.PubSubEngine.shutdown(PubSubEngine.java:1743) at org.jivesoftware.openfire.pep.PEPServ

系统-请教大神:我win7电脑Java开发程序,部署到Linux云服务器,如何实现调用另一套VB开发的程序

问题描述 请教大神:我win7电脑Java开发程序,部署到Linux云服务器,如何实现调用另一套VB开发的程序 我win7电脑Java开发程序,部署到Linux云服务器,如何实现调用另一套VB开发的程序: 这套VB开发的程序是win平台的.急! 比如以下情况:比如门房有台电脑,win系统的,联网,打开我的系统,扫码,调用 VB,也就是说,在同一台电脑里面去实现, 可能不?? 解决方案 只能把VB程序放到另一台win的机器上,然后Linux云服务器通过http等,发送请求给VB的机器

如何将APP部署在阿里云服务器上

随着移动通信设备终端的逐步流行,移动互联网在互联网交流中起着越来越大的作用,而移动互联网采用纯网站应用的部分相当之少,曲而代之的APP应用软件正以雨后春笋般的速度生发出来,例如说苹果IOS市场里的很多APP.谷歌安卓尔市场里的APP等.很多APP会布局在有些手机市场里运营.但也有非常多的APP会采取自己租用服务器且自己配置环境的方式来运营,这样拥有更多的自主权.减少很多在综合APP市场里的限制,很多大型的APP都是采用自主运营的操作. 如果将APP部署在阿里云服务器,可能会有以下一些操作值得您参

源代码-tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口

问题描述 tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口 5C 求救1.tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口,然后应用程序就可以通过和服务器交互来使用mysql里面的数据,这样理解是对的吗?2.如果这是对的,那服务器是不是就要封装好数据库连接类.数据增删查改类?这样,应用程序就可以只需要传参数就可以使用数据了?3.在服务器端封装好数据库连接类的话:那不是每次应用程序使用数据的时候,服务器都要连接又断开数据库了吗

tomcat部署到阿里云服务器,虚拟路径启动有问题

问题描述 tomcat部署到阿里云服务器,虚拟路径启动有问题 server.xml同样的配置在本地可以跑,但是放到阿里云就启动不了,报: SEVERE: Error starting static Resources java.lang.IllegalArgumentException: Document base /test does not exist or is not a readable directory server.xml去掉了项目路径而已: <Host name="loc