如果 none 已打开端口,WebRTC 对等点如何相互连接?

How do WebRTC peers connect to each other if none have opened ports?

我知道需要一个 STUN/ICE/TURN 服务器来查找参与 WebRTC 通信的对等点的 IP 地址。然而,即使在找到 IP 之后,对等点如何在不打开任何端口的情况下真正相互独立交谈?

如果您建立网站,通常必须打开服务器上的端口才能让其他人访问您的网站。 WebRTC 中发生了什么我不理解的魔法?

有几种策略可以做到这一点:一种可能是客户端通过 UPnP 显式打开一个端口。我不确定当前是否有任何 WebRTC 客户端这样做,但在一般网络中这是可能的。

否则,STUN 服务器就会启动。它可以尝试几种 hole punching 技术;阅读前面链接的文章以了解详细信息。简而言之,防火墙通常会为 传出 流量打开一个端口(因为它需要接收响应),因此通过建立到已知目标的传出连接然后记下该端口已打开的可以打开一个端口。

即便如此,也需要 TURN 服务器。此服务器可从两个对等方公开访问,即使两个对等方无法看到对方。然后 TURN 服务器将充当两者之间的中继。这在某种程度上否定了 P2P 协议的意义,但在一定比例的情况下是必要的(估计范围在 10%-20% 左右)。

原来的问题是"what/who creates the sockets?"

  • 浏览器创建套接字并将它们绑定到本地端口 "ICE gathering".
  • 期间
  • 无论您使用任何 stun/turn 服务器还是 不,在冰聚期间产生的每个候选人都有一个 对应端口开放。
  • 那些端口通常只开放 3000 万 之后他们被撤销以避免被使用旧的人攻击 and/or恶搞考生。这 30mns 没有在任何指定 规范,并且是浏览器供应商的任意选择。 -

下一个问题是"how does the remote peer know about which ports are open"。

  • 通过 ICE 机制,每个媒体都会生成潜在的候选对象,并通过您首选的信令通道将它们发送到远程对等方。
  • ICE 候选人(实际上是 SDP 的一行)有 "type"。如果此类型为 HOST,则您的候选人是在未使用任何 stun 或 turn 服务器的情况下生成的本地候选人。如果类型是 SRFLX,那么你已经使用 STUN 服务器添加了本地 IP:port 和你的 public IP:port 之间的映射。如果您的类型是 RELAY,则与 TURN 服务器相同。
  • 当然,使用本地 IP:port HOST 候选将失败,除非远程对等点在同一本地网络上。
  • 从浏览器和本地系统的角度来看,套接字在本地 IP:PORT 无论如何都是打开的。因此,打开套接字和找出远程对等点应该连接到哪个端口以连接到套接字是单独处理的单独问题。

最后一个问题是:"can it really work without a STUN server"

  • 很可能不会,除非你们在同一个子网络上。
  • 统计数据显示 (http://webrtcstats.com) 即使使用 STUN 服务器,您仍然会在 8% 的情况下失败,对于一般 public。它在企业中更多,你最好有高级转向(支持通过 TCP/80 和 TLS/443 的隧道),甚至支持 HTTP 代理的 CONNECT 方法。