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

当我使用基于socket.io的信令服务器时,webrtc是否绝对需要STUN服务器?,webrtc,stun,Webrtc,Stun,我对用于webrtc的STUN服务器的理解是,当客户端位于NAT后面时(在大多数情况下,如果不是全部的话),STUN服务器将帮助webrtc客户端识别其地址和端口。我还读了一些文章,说webrtc客户端需要一个信令服务器。信令服务器可以是web服务器、socket.io,甚至可以通过电子邮件发送url。我的第一个问题是:STUN服务器是信令服务器吗 实际上,现在我构建了一个非常简单的基于socket.io的服务,它将客户端的会话描述广播给所有其他客户端。因此,我相信基于socket.io的服务器

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


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

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

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

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

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


简言之,当双方不在同一网络上时,大多数情况下都需要STUN服务器(以获得对等媒体流的有效连接候选),并且始终需要信令服务器(无论它们是否在不同的网络上),以便进行协商和连接建立

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

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

为了几乎保证连接性,服务器应该有TURN服务器(最好支持UDP和TCP TURN,尽管UDP是首选)。请注意,与STUN不同,TURN可以使用可观的带宽,因此主机可能需要花钱。幸运的是,大多数连接在不需要使用TURN服务器的情况下成功(即,它们运行点对点连接)

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

STUN服务器用于获取外部网络地址。 TURN服务器用于在直接(对等)连接失败时中继流量。
有关更多信息,您也可以从下面的链接中查阅:

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

来自ICE RFC(RFC8445),WebRTC使用

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

目前还不清楚晕眩是否是冰的必要条件,但上面说晕眩可能是不必要的

然而,信号传递与此无关。这个问题实际上源于不理解Stung做什么,以及Stung如何与信号传递相互作用。我认为这里的其他三个答案实际上没有回答这两个问题

先决条件:了解NAT的基本概念。STUN是绕过NAT的工具,所以你必须理解它

信令:简单地说,在WebRTC中,您需要实现自己的信令策略。您可以手动键入由一个对等方在另一个对等方中创建的本地会话描述,使用WebSocket、socket.io或任何其他方法(我看到了一个可以使用冒烟信号的笑话,但如何传递以下会话描述(aka.)通过烟雾信号…。再次,我复制粘贴了类似于以下内容的内容:

 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地址足以让每个对等方彼此发送数据报或数据包。在上面的示例中,它们是