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, MongoDB, redis.
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线程.
--max-bps=100000 限制最大速度为100KB/s.
添加了两个用户ling 和ling2.
可以直接使用turnutils_uclient -u ling -w ling1234 来测试. turnutils_uclient 有很多参数可以配置的.
webrtc::PeerConnectionInterface::IceServer turnServer;
turnServer.uri = "turn:ip";
turnServer.username = "ling";
turnServer.password = "ling1234";
servers.push_back(turnServer);
c++ webrtc中可以这样配置turn. web/android/ios 也是类似的.
如果从安全性方面考虑. 可以为账户生成key, 这样就可以直接通过key登录. 而不需要提供密码.
key 通过turnadmin生成, 需要(username, password, realm) . realm是启动turn server时-r 参数指定的.
例如这样:
turnadmin -k -u ling -p ling1234 -r demo
0xccba8f3a6a025a38eb4a0e795fc92705
webrtc学习: 部署stun和turn服务器的更多相关文章
- [转]webrtc学习: 部署stun和turn服务器
[转]webrtc学习: 部署stun和turn服务器 http://www.cnblogs.com/lingdhox/p/4209659.html webrtc的P2P穿透部分是由libjingle ...
- WebRTC信令控制简介与STUN, TURN服务器搭建
本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了如何构建信令服务器.但构建的信令服务器是如何工作的?哪些消息需要信令服务器控制和中 ...
- (译)WebRTC实战: STUN, TURN, Signaling
http://xiaol.me/2014/08/24/webrtc-stun-turn-signaling/ 原文:WebRTC in the real world: STUN, TURN and s ...
- stun/turn服务器部署
目录: 一.简介 二.安装 三.配置与运行 四.运行检测 五.答疑环节 一.简介 本文通过在服务器上安装coturn这个软件,实现搭建STUN服务器和TURN服务器. coturn 简介:是一个免费的 ...
- WebRTC学习资料大全
在学习WebRTC,找了些资料,记录一下,供以后查询. 有些需要FQ才能看 WebRTC 介绍 官网在这里:https://webrtc.org/.然后这里有一个官方的Getting Started: ...
- webrtc学习笔记2(Android端demo代码结构)
最近正在修改webrtc的Android端demo和服务器交互的内容,介绍一下demo的大体结构吧,以便能快速回忆. 环境:Android5.0以上.libjingle_peerconnection_ ...
- webrtc学习笔记1(建立连接基本流程)
最近在做一个基于webrtc的视频软件,以下是自己对于上层建立通话连接流程的基本理解,记录于此. 假设A和B要建立视频通话,A为房间创建端,B为加入房间端: 1.A通过http登录.获取其他服务器地址 ...
- WebRTC学习之 Intel® Collaboration Suite for WebRTC源码流程解读
年后回来,因为新项目的需求,开始了解WebRTC相关的知识.目前接触的是Intel® Collaboration Suite for WebRTC.刚开始看SDK发现很多概念是我目前不知道的,于是恶补 ...
- WebRTC学习之ICE深入理解
ICE(交互式连接建立---Interactive Connectivity Establishment),是一种标准穿透协议.它利用STUN和TURN服务器来帮助端点建立连接.下图显示了ICE的基本 ...
随机推荐
- 关于Python的import机制原理
很多人用过python,不假思索地在脚本前面加上import module_name,但是关于import的原理和机制,恐怕没有多少人真正的理解.本文整理了Python的import机制,一方面自己总 ...
- C# 线程中使用delegate对控件进行操作
如果在线程中想改变控件的值是不可以的,会报出以下错误. 那么,如何在线程中改变控件上的值呢?第一个想到的就是委托. 委托定义:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行 ...
- BitMap位图与海量数据的理解与应用
1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空 ...
- Android多线程编程<一>Android中启动子线程的方法
我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...
- jdk8- list操作
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. student类 public class Student { private String age; ...
- PHP常用的正则表达式(有些需要调整)
平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) 顺平注: 验证输入id数值,不能为0 $reg1='/ ...
- Linux进程间通信(System V) --- 信号量
信号量 IPC 原理 信号量通信机制主要用来实现进程间同步,避免并发访问共享资源.信号量可以标识系统可用资源的个数.最简单的信号量为二元信号量 下图为 Linux 信号量通信机制的概念图.在实际应用中 ...
- [转]ionic3 实现android版本打包
本文转自:https://blog.csdn.net/weixin_39461487/article/details/79387250?utm_source=blogxgwz0 版权声明:本文为博主原 ...
- 发布webservice之后调用不通
在websrvice发布文件的webconfig中加入 <httpRuntime maxRequestLength="102400" /> <webServic ...
- Linux中inotify软件部署及参数事件演示
声明:博主使用的是CentOS6.9的系统 参考资料: https://github.com/rvoicilas/inotify-tools/wiki http://www.ibm.com/devel ...