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

Qia*_*hen 18 stun webrtc

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

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

Ben*_*ent 30

STUN服务器不是信令服务器.

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

拥有STUN服务器的原因是两个对等体可以相互发送媒体.媒体流不会打你的信令服务器,而是将直接进入对方(一个对等网络连接的定义),唯一的例外是当使用TURN服务器的情况.

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

简而言之,当双方不在同一网络上时,大多数时候需要STUN服务器(以获得对等媒体流的有效连接候选者),并且始终需要信令服务器(无论它们是否在不同的位置)网络与否)以便建立协商和连接.连接和流媒体流程的良好解释

  • 感谢@bwtrent 提供非常清晰且内容丰富的答案。那么STUN服务器什么时候来玩呢?仅在对等连接开始时,还是在连接期间的所有时间?如果答案只是在连接的开头?为什么不让信令服务器做任何 STUN 服务器应该做的事情?因为我认为信令服务器应该足够了解对等方的 NAT 信息,以便与每个对等方交谈。我是否低估了 STUN 服务器的复杂性? (3认同)
  • @ElgsQianChen 它必须是一个 STUN 服务器。你的信令服务器和你的 STUN 服务器可以在同一个物理位置/同一个物理盒子/FQDN,但是 NAT 协商必须用 STUN(或当对称 NAT 正在运行时 TURN)来完成。这符合 WebRTC 规范/运动/无论现在被称为什么。 (2认同)
  • 从答案来看,在客户端 - 服务器连接的情况下(例如:客户端流式传输到服务器)是否需要 STUN/TURN 服务器,或者这个用例是否真的被 WebRTC 覆盖,这一点尚不清楚。 (2认同)

jes*_*sup 7

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

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

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

  • 同一服务器(FQDN/IP)既可以是STUN服务器,也可以是信令服务器 - 但它们是不同的功能.ICE将处理提供的STUN/TURN服务器列表.请注意,用于RTP/RTCP/datachannel的每个通道都获得不同的端口映射(尽管rtcp-mux将组合RTP和RTCP端口,而BUNDLE将(当实现时)将所有流复用到一个端口上 - 但它通常仍然不相同用于信令的端口(信令通常​​是TCP,而不是UDP,因为它可以是UDP ala SIP - 但通常在浏览器中不允许随机UDP端口访问). (3认同)
  • 谢谢@jesup。那么从技术上讲,是否可以使用信令服务器来做 STUN 服务器应该做的任何事情?如果 STUN 服务器的唯一任务是告诉 NAT 后面的客户端他们拥有什么公共 ip 和端口,为什么不让信令服务器这样做呢?你知道,如果我可以用我的基于 socket.io 的信令服务器来做它,我最好避免将 STUN 服务器作为依赖项。 (2认同)