kurento 6.14.0文档翻译第十一章 Kurento常用问题
11.1关于NAT,ICE,STUN,TURN
这些是非常重要的概念,开发人员必须充分理解才能使用WebRTC,这是有关这些首字母缩略词的所有Kurento的集合:
1.词汇:
--什么是NAT
--什么是NAT穿越
--什么是ICE
--什么是STUN
--什么是TURN
2.安装和配置STUN/TURN服务:
--怎样安装Coturn
--怎么测试我的STUN/TURN服务
--怎么配置STUN/TURN
3. WebRTC故障排除
4.NAT类型和NAT穿越高级知识
11.1.1什么时候需要STUN和TURN
NAT后面的每一个WebRTC参与者都需要STUN(也可能是TURN),所有的端想尝试去连接NAT之后将要打开它们自己的端口,被称为NAT穿越的过程, 这是通过使用部署在NAT外部的STUN服务器来实现的.
STUN服务配置UDP和TCP一定端口范围。在服务器的网络配置或安全组中,所有这些端口也应向所有流量开放。
如果你安装kurento在一个NAT环境(即:如果您的服务器位于NAT防火墙之后),你需要配置一个额外的STUN服务。在/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini文件,相似的,NAT后面的所有浏览器客户端都需要使用RTCPeerConnection构造函数的iceServers字段配置STUN服务器详细信息。
例子:
KMS和它的应用服务都运地在一个云环境,没有任何NAT或端口限制。而浏览器客户端从可能受限制的NAT网络运行,该网络禁止事先未“打开”任何端口的传入连接。
浏览器客户端可以出于信令的目的与应用服务通信,但最终,浏览器的WebRTC引擎和KMS之间完成了大部分音频/视频通信。
在这种情况下,客户端可以发送数据到KMS,因为它的NAT允许传出数据包,但KMS不允许发送数据到客户端,因为客户端的NAT对于传入包是关闭的。通过将客户端配置为使用STUN服务器来解决此问题,客户端的浏览器将使用此服务器打开NAT中的相应端口,在这操作之后,现在客户端开始从KMS接收音/视频流。
注意你也可以部署KMS到NAT防火墙之后,只是KMS也要配置使用STUN服务。
进一步阅读:
1.WebRTC-我需要部署多少个STUN/TURN服务(https://stackoverflow.com/questions/23292520/webrtc-how-many-stun-turn-servers-do-i-need-to-specify/23307588#23307588)。
2.什么是STUN,TURN和ICE(https://www.twilio.com/docs/stun-turn/faq#faq-what-is-nat)
11.1.2怎么安装Coturn?
Coturn是一个STUN服务和TURN中继, 支持ICE协议所需的所有功能,并允许从NAT后面建立WebRTC连接。
Coturn可以从ubuntu包仓库中安装
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \ coturn |
要为WebRTC配置它,请按照下列步骤操作:
- 编辑/etc/turnserver.conf.
此示例配置是很好的第一步, 它将与Coturn和KMS一起使用时有效WebRTC流。 但是你可能需要根据需要进行更改:
# This server's external/public address, if Coturn is behind a NAT. # It must be an IP address, not a domain name. external-ip=<CoturnIp> # STUN listener port for UDP and TCP. # Default: 3478. #listening-port=<CoturnPort> # TURN lower and upper bounds of the UDP relay ports. # Default: 49152, 65535. #min-port=49152 #max-port=65535 # Uncomment to run server in 'normal' 'moderate' verbose mode. # Default: verbose mode OFF. #verbose # Use fingerprints in the TURN messages. fingerprint # Use long-term credential mechanism. lt-cred-mech # Realm used for the long-term credentials mechanism. realm=kurento.org # 'Static' user accounts for long-term credentials mechanism. user=<TurnUser>:<TurnPassword> # Set the log file name. # The log file can be reset sending a SIGHUP signal to the turnserver process. log-file=/var/log/turnserver/turnserver.log # Disable log file rollover and use log file name as-is. simple-log |
提示:1).在使用内部NAT的云提供商中external-ip是必需的,像Amazon EC2(AWS),写入你的服务公有IP像198.51.100.1在<CoturnIp>参数,它必须是一个Ip不是一个域名。
2)选项fingerprint, lt-cred-mech, 和 realm是需要的。
3)用户参数是使用TURN中继功能的最基本授权形式。 在<TurnUser>和<TurnPassword>字段中输入所需的用户名和密码。
4)其它参数可以根据需要调整,更多相关信息可以查看Coturn帮助页面
– https://github.com/coturn/coturn/wiki/turnserver ––https://github.com/coturn/coturn/wiki/CoturnConfig
––完整注释的示例配置文件:https://raw.githubusercontent.com/coturn/coturn/ master/examples/etc/turnserver.conf
- 编辑 /etc/default/coturn文件
TURNSERVER_ENABLED=1 |
因此,服务器将作为系统服务守护程序自动启动。
- 以下各节以测试Coturn是否正常运行,然后在KMS中将其设置为STUN / TURN服务器。
11.1.3怎么测试我的STUN/TURN服务
测试你的STUN/TURN服务是否运行正常,打开trickle-ice测试页面,在这个页面按照以下几步:
- 删除默认情况下可能已填充的所有服务器
- 填充你的STUN/TURN服务详情
- 仅仅测试STUN服务(TURN中继将不会测试)
stun:<StunServerIp>:<StunServerPort> |
-
- 测试STUN服务和TURN中继
turn:<TurnServerIp>:<TurnServerPort> |
也要填充TURN用户名和TURN密码
- 点击添加服务(Add Server),列表中只有一个条目,其中包含您的服务器详细信息。
- 点击收集候选人(Gather candidates)验证您是否获得srflx类型的候选人,如果你正在测试STUN。同样如果要测试TURN,则应获得srflx类型和Relay类型的候选对象。
如果你遗漏了预期的候选人类型,你的STUN/TURN服务不会工作的很好,并且WebRTC将失败,检查你的服务配置和你的云提供的网络设置。
11.1.4怎么样配置STUN/TURN?
配置STUN服务或TURN中继,你可以使用两个方法的一个:
- 在/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini配置文件写入参数,如果您的设置是静态的并且事先知道它们,请执行此操作。
只使用STUN服务(TURN中继将不会使用)
stunServerAddress=<StunServerIp> stunServerPort=<StunServerPort> |
<StunServerIp>应该是STUN服务的公网IP,它必须是一个IP地址,不是一个域名例如:
stunServerAddress=198.51.100.1 stunServerPort=3478 |
SUTN服务和TURN中继都使用:
turnURL=<TurnUser>:<TurnPassword>@<TurnServerIp>:<TurnServerPort> |
<TurnServerIp>应该是TURN中继的公网IP,它必须是一个IP地址,不是一个域名例如:
turnURL=myuser:[email protected]:3478 |
- 使用API的方法去设置动态的参数,如果你的STUN服务详细不是事先知道的或者你的TURN凭证在运行时生成,
只使用STUN服务(TURN中继将不会使用)
setStunServerAddress("<StunServerIp>"); setStunServerPort(<StunServerPort>); |
Kurento客户端API文档:Java(https://doc-kurento.readthedocs.io/en/latest/_static/client-javadoc/org/kurento/client/WebRtcEndpoint.html#setStunServerAddress-java.lang.String-),javascript(https://doc-kurento.readthedocs.io/en/latest/_static/client-jsdoc/module-elements.WebRtcEndpoint.html#setStunServerAddress)
SUTN服务和TURN中继都使用:
setTurnUrl("<TurnUser>:<TurnPassword>@<TurnServerIp>:<TurnServerPort>"); |
Kurento客户端API文档:Java(https://doc-kurento.readthedocs.io/en/latest/_static/client-javadoc/org/kurento/client/WebRtcEndpoint.html#setTurnUrl-java.lang.String-),javascript(https://doc-kurento.readthedocs.io/en/latest/_static/client-jsdoc/module-elements.WebRtcEndpoint.html#setStunServerAddress)
提示:如果你已经配置了TURN中继,你不需要设置STUN服务,因为TURN只是STUN的延伸。
以下的端口你应该在你的防火墙或你的云机器的安全组中打开。
• (默认: 3478) UDP 和TCP.
• 49152-65535 UDP 和 TCP: 根据RFC 5766, 这些端口在TURN中继交换媒体. 这些端口可以在Coturn的min-port和 max-port 参数改变。
提示:端口范围必须在Coturn和KMS之间匹配。查看/etc/turnserver.conf 和 /etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini文件,验证两个文件是否使用同样的设置。
当你配置完成,启动(重启)Coturn和Kurento服务
sudo service coturn restart sudo service kurento-media-server restart |
11.2我的应用需要多少个媒体管道?
一个管道是一个高级的容器,它处理每一个资源,所以应该可以实现任何类型的相互之间的交互。媒体元素只能在它们是同一管道下才能通信,不同的管道在服务中是独立的,所以它们不能共享音频、视频、数据和事件。
99%的时间,在每个类似“房间”的视频会议中使用1个管道对象,是否有1位演示者和N位观众(“一对多”)都没关系,或者如果有N个参加者风格(多对多),它们都使用一个管道管理,所以最实际的实际应用只需要一个管道,因为它足够应付大多数需要。
一个很好的启发式方法是,通道中每组通信伙伴需要一个管道,并且与参与者交换的每个音频/视频流都需要在该管道中有一个端点。
11.3我需要多少个EndPoints(端点)?
您的应用程序将需要为流向(或来自)每个参与者的每个媒体流创建至少一个端点。如果要记录流或为其他目的复制流,则实际上可能需要更多
11.4哪个参与者对应于哪个端点?
Kurento API无法提供获取存储在媒体元素中的应用程序级语义属性的方法。但是,应用程序开发人员可以维护HashMap或等效数据结构,将端点标识符(纯字符串)存储到所需的任何应用程序信息(例如参与者的姓名)。