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之间完成了大部分音频/视频通信。

kurento 6.14.0文档翻译第十一章 Kurento常用问题

在这种情况下,客户端可以发送数据到KMS,因为它的NAT允许传出数据包,但KMS不允许发送数据到客户端,因为客户端的NAT对于传入包是关闭的。通过将客户端配置为使用STUN服务器来解决此问题,客户端的浏览器将使用此服务器打开NAT中的相应端口,在这操作之后,现在客户端开始从KMS接收音/视频流。

kurento 6.14.0文档翻译第十一章 Kurento常用问题

注意你也可以部署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配置它,请按照下列步骤操作:

  1. 编辑/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

  1. 编辑 /etc/default/coturn文件

TURNSERVER_ENABLED=1

因此,服务器将作为系统服务守护程序自动启动。

  1. 以下各节以测试Coturn是否正常运行,然后在KMS中将其设置为STUN / TURN服务器。

11.1.3怎么测试我的STUN/TURN服务

测试你的STUN/TURN服务是否运行正常,打开trickle-ice测试页面,在这个页面按照以下几步:

  1. 删除默认情况下可能已填充的所有服务器
  2. 填充你的STUN/TURN服务详情
    1. 仅仅测试STUN服务(TURN中继将不会测试)

stun:<StunServerIp>:<StunServerPort>

    1. 测试STUN服务和TURN中继

turn:<TurnServerIp>:<TurnServerPort>

也要填充TURN用户名和TURN密码

  1. 点击添加服务(Add Server),列表中只有一个条目,其中包含您的服务器详细信息。
  2. 点击收集候选人(Gather candidates)验证您是否获得srflx类型的候选人,如果你正在测试STUN。同样如果要测试TURN,则应获得srflx类型和Relay类型的候选对象。

如果你遗漏了预期的候选人类型,你的STUN/TURN服务不会工作的很好,并且WebRTC将失败,检查你的服务配置和你的云提供的网络设置。

11.1.4怎么样配置STUN/TURN?

配置STUN服务或TURN中继,你可以使用两个方法的一个:

  1. 在/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

  1. 使用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或等效数据结构,将端点标识符(纯字符串)存储到所需的任何应用程序信息(例如参与者的姓名)。