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