在您的情况下,您需要STUN。大多数客户端将在 NAT 之后,因此您需要 STUN 来获取客户端的公共 IP。但是如果你的两个客户端都不在 NAT 之后,那么你就不需要 STUN。更一般地说,不,STUN 服务器不是严格要求的。我知道这一点是因为我成功连接了 2 个没有 stun 服务器的 WebRTC 对等体。我使用了来自 aiortc 的示例代码,这是一个 python WebRTC/ORTC 库,两个客户端都在我的笔记本电脑上本地运行。信令通道使用了我的手动复制粘贴。我从字面上将 SD(会话描述)从一个对等方复制到另一个对等方。然后,再次将 SD 从第二个对等体复制到第一个对等体。
来自 WebRTC 使用的 ICE RFC (RFC8445)
ICE 代理应该收集服务器反射和中继的候选人。但是,在某些网络中可能不需要使用 STUN 和 TURN 服务器,并且使用 TURN 服务器可能很昂贵,因此某些部署可能会选择不使用它们。
不清楚 STUN 是 ICE 的要求,但上面说它可能是不必要的。
然而,信号与它无关。这个问题实际上源于不了解STUN 做什么,以及STUN 如何与信号相互作用。我认为这里的其他 3 个答案实际上并没有回答这两个问题。
先决条件:了解 NAT 的基本概念。STUN 是一个绕过 NAT 的工具,所以你必须了解它。
信令:简而言之,在 WebRTC 中,您需要实现自己的信令策略。您可以在另一个对等点中手动键入一个对等点创建的本地会话描述,使用 WebSockets、socket.io 或任何其他方法(我看到一个可以使用烟雾信号的笑话,但是您将如何通过以下会话描述(又名。SDP 消息)通过烟雾信号...)。同样,我复制粘贴了与下面非常相似的内容:
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
当两个对等点都不在 NAT 之后,您不需要 STUN 服务器,因为位于每个对等点生成的会话描述(c=
上面的字段,称为连接数据)中的 IP 地址足以让每个对等点发送数据报或数据包相互。在上面的示例中,他们提供了域名而不是 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地址是什么。如果您从笔记本电脑托管使命召唤服务器,并在路由器设置中将端口转发到您的计算机,您仍然需要从https://whatismyipaddress.com/之类的网站查找您的公共 IP 地址。STUN 允许客户端为自己执行此操作,而无需您访问浏览器。
最后,STUN 如何与信令相互作用?
ICE 候选者是在本地生成的,并在 STUN 的帮助下(当它们位于 NAT 之后时获取客户端公共 IP 地址)甚至 TURN。会话描述使用信令通道发送到对等体。如果您不使用 STUN,您可能会发现 ICE 尝试生成的 ICE 候选都失败,并且连接(信令通道除外)没有成功创建。