如果没有打开端口,WebRTC对等体如何相互连接?

时间:2015-04-22 10:39:37

标签: networking webrtc p2p

我知道需要一个STUN / ICE / TURN服务器来查找WebRTC通信中涉及的对等体的IP地址。然而,即使在找到IP之后,如果没有打开任何端口,对等体如何实际上彼此独立地交谈?

如果您构建网站,则通常需要打开服务器上的端口以让其他人访问您的网站。我不理解WebRTC中发生的魔力是什么?

2 个答案:

答案 0 :(得分:4)

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

如果失败,STUN服务器就会启动。它可以尝试多种hole punching技术;阅读上述相关文章的血淋淋的细节。简而言之,防火墙通常会打开传出流量的端口(因为它需要接收响应),因此通过建立到已知目标的传出连接然后记下打开的端口可以打开一个端口。

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

答案 1 :(得分:4)

原始问题是“什么/谁创建套接字?”

  • 浏览器会创建套接字并将它们绑定到本地端口 在“ICE聚会”期间。
  • 你使用任何眩晕/转弯服务器或者 不是,冰集会期间产生的每个候选人都有 相应的端口打开。
  • 这些端口通常只能打开30分钟 之后他们被撤销以避免使用旧的人的攻击 和/或恶搞候选人。这些30毫秒没有任何指定 规范,是浏览器供应商的任意选择。 -

接下来的问题是“远程对等方如何知道哪些端口处于打开状态”。

  • 通过ICE机制,每个媒体都会生成潜在的候选人,并通过您首选的信令渠道将其发送给远程对等体。
  • ICE候选人(实际上是SDP的一行)有一个“类型”。如果此类型是HOST,那么您的候选人是在不使用任何眩晕或转弯服务器的情况下生成的本地候选人。类型是SRFLX,然后您使用STUN服务器添加本地IP:端口和您的公共IP:端口之间的映射。如果您的类型是RELAY,则与TURN服务器相同。
  • 当然,使用本地IP:端口HOST候选者将失败,除非远程对等体位于同一本地网络上。
  • 从浏览器和本地系统的角度来看,套接字在本地IP:PORT上是打开的。因此,打开套接字并找出远程对等端应连接到哪个端口以连接到套接字是单独处理的单独问题。

最后一个问题是:“如果没有STUN服务器,它能真正起作用吗”

  • 很可能不会,除非您在同一个子网络上。
  • 统计显示(http://webrtcstats.com)即使使用STUN服务器,对于普通公众而言,在8%的情况下仍然会失败。它更适用于企业,你最好先进行转弯(通过TCP / 80和TLS / 443支持隧道),甚至支持HTTP代理的CONNECT方法。