当我有一个基于socket.io的信令服务器时,是否对于webrtc绝对需要STUN服务器?

时间:2014-05-17 20:27:43

标签: webrtc stun

我对webrtc的STUN服务器的理解是,当客户端在NAT后面时(在大多数情况下,如果不是全部),STUN服务器将帮助webrtc客户端识别他们的地址和端口。我还读到一些文章说webrtc客户端需要一个信令服务器。信令服务器可以是web服务器,socket.io,甚至是通过电子邮件发送网址。我的第一个问题是:STUN服务器是信令服务器吗?

实际上现在我构建了一个非常简单的基于socket.io的服务,它将客户端的会话描述广播给所有其他客户端。所以我相信基于socket.io的服务器应该对客户端有足够的了解。地址和端口信息。如果是这种情况,为什么我们还要打扰另一台STUN服务器?

4 个答案:

答案 0 :(得分:29)

STUN服务器信令服务器。

信令服务器的目的是在会话启动时在对等体之间传递信息(如何在不知道发送给谁的情况下发送报价?)。此信息包括在要约和答案上创建的SDP以及由任何一方创建的任何冰候选者。

拥有STUN服务器的原因是两个对等方可以相互发送媒体。媒体流不会到达您的信令服务器,而是直接转到另一方(对等连接的定义),使用TURN服务器时会出现例外情况。

媒体无法神奇地通过NAT或防火墙,因为双方无法直接相互访问(就像他们在同一个局域网上一样)。

简而言之,当双方不在同一网络上(为了获得对等媒体流的有效连接候选)并且信令服务器总是< / em>需要(无论它们是否在不同的网络上),以便可以进行协商和连接建立。 Good explanation of the connection and streaming process

答案 1 :(得分:7)

STUN用于实现ICE协议,该协议试图在两个客户端之间找到有效的网络路径。对于两个客户端(由于NAT /防火墙限制)无法建立直接对等连接的情况,ICE还将使用TURN中继服务器(如果在RTCPeerConnection中配置)。

STUN服务器用于识别计算机在Internet上使用的外部地址(NAT外部地址),并尝试设置对等端可用的端口映射(如果NAT不是&#34;对称&#34;) - 联系STUN服务器将告诉您尝试在ICE中使用的外部IP和端口。这些是SDP或涓流ICE消息中包含的ICE候选者。

对于几乎保证连接,服务器应该具有TURN服务器(最好支持UDP和TCP TURN,尽管UDP是首选)。请注意,与STUN不同,TURN可以使用可观的带宽,因此可以花费很多钱来托管。幸运的是,大多数连接都成功而无需使用TURN服务器(即它们运行点对点)

答案 2 :(得分:1)

NAT(网络地址转换)用于将“专用IP”(仅在LAN中有效)转换为在WAN中有效的“公共IP”。 问题是“公共IP”只能从外部看到,所以我们需要STUN或TURN服务器向您发回“Public IP”。 此过程使WebRTC对等方能够为自己获取可公开访问的地址,然后通过信令机制将其传递给另一个对等方

STUN服务器用于获取外部网络地址。 如果直接(对等)连接失败,则TURN服务器用于中继流量。 您还可以参考以下链接:https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/#what-is-signaling

答案 3 :(得分:0)

根据您的情况,您需要 STUN 。大多数客户端将位于NAT之后,因此您需要STUN才能获得客户端的公共IP。但是,如果两个客户端都不在NAT后面,那么您就不需要STUN。更一般地说,不是,并非严格要求。我知道这一点是因为我成功连接了2个WebRTC对等端而没有电击服务器。我使用了来自aiortc的example code,这是一个python WebRTC / ORTC库,两个客户端都在我的笔记本电脑上本地运行。信号通道使用了我的手动复制粘贴。我将SD(会话描述)从一个对等方复制到另一方。然后,将SD从第二个对等方再次复制到第一个对等方。

来自WebRTC使用的ICE RFC(RFC8445)

ICE代理应收集服务器自反和中继的候选者。 但是,在某些情况下,可能不必要使用STUN和TURN服务器 网络和使用TURN服务器可能很昂贵,因此有些 部署可以选择不使用它们。

尚不清楚STUN是否是ICE的要求,但上面说可能是不必要的。

但是,信令与此无关。这个问题实际上是由于不了解 STUN所做的事情以及 STUN如何与信号交互作用。我认为这里的其他3个答案实际上并没有回答这2个问题。

先决条件::了解NAT的基本概念。 STUN是绕过NAT的工具,因此您必须了解它。

信令:简要地说,在WebRTC中,您需要实现自己的信令策略。您可以手动键入由一个对等方在另一个对等方创建的本地会话描述,使用WebSockets,socket.io或任何其他方法(我开玩笑说可以使用烟雾信号,但是如何您将通过冒烟信号传递以下会话描述(也称为SDP message)。再次,我复制粘贴了与下面非常相似的内容:

 v=0
 o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
 s=
 c=IN IP4 host.anywhere.com
 t=0 0
 m=audio 49170 RTP/AVP 0
 a=rtpmap:0 PCMU/8000
 m=video 51372 RTP/AVP 31
 a=rtpmap:31 H261/90000
 m=video 53000 RTP/AVP 32
 a=rtpmap:32 MPV/90000

如果两个对等点都不在后面,则您不需要STUN服务器,因为IP地址位于会话描述中(上面的c=字段称为{{ 3}})由每个对等方生成,足以使每个对等方相互发送数据报或数据包。在上面的示例中,他们提供了域名而不是IP地址 host.anywhere.com,但是可以将其解析为A记录。 (有关更多信息,请研究DNS。)

为什么在这种情况下您不需要STUN服务器?从RFC8445:

有不同类型的候选人;有些来自物理或逻辑网络接口,而另一些则可以通过STUN和TURN发现。

如果您不使用NAT,则客户端已经知道对等方可以直接寻址的IP地址,因此STUN生成的其他ICE候选对象将无济于事(它只会为您提供您已经知道的相同IP地址关于)。

但是,当客户端位于NAT之后时,他们认为IP不会帮助对等方联系他们。就像告诉您我的IP地址是192.168.1.235,确实是,但是它是我的私有IP。 NAT可能在路由器上,并且您的客户端可能无法请求公用IP。因此,STUN是用于处理此问题的工具。具体来说,

它为端点提供了一种方法来确定由NAT分配的与其专用IP地址和端口相对应的IP地址和端口。

STUN基本上可以让客户端找出IP地址。如果您是在笔记本电脑上托管“使命召唤”服务器,并且端口在路由器设置中将端口转发到了您的计算机,那么您仍然必须从connection data之类的网站中查找公用IP地址。 STUN允许客户端自行完成此操作,而无需访问浏览器。

最后,STUN与信令如何相互作用? ICE候选程序是在本地生成的,并借助STUN(当它们位于NAT之后时可获取客户端的公共IP地址)甚至TURN。使用信令通道将会话描述发送到对等方。如果不使用STUN,则可能会发现由ICE尝试生成的ICE候选对象全部失败,并且未成功创建连接(除信令通道之外)。