在什么条件下以及如何在没有TURN服务器的情况下使用Webrtc PeerConnection?

7
阅读关于WebRTC的内容,我感觉“除了一些企业防火墙案例之外,它将显著降低服务器带宽使用率”,在这些案例中需要TURN服务器来中转对等方之间的整个流量。
例如,虽然与WebRTC无关,但类似的想法,维基百科文章 Chatroulette 指出:该网站使用Adobe Flash来显示视频并访问用户的网络摄像头。 Flash的点对点网络功能(通过RTMFP)允许几乎所有视频和音频流直接在用户计算机之间传输,而不使用服务器带宽。 但是,某些路由器组合将不允许UDP流量在它们之间流动,因此必须退回到RTMP。
还有类似的WebRTC文章专注于“是的,防火墙可能会出现问题,所以您需要一个TURN服务器,但请忽略此问题,并查看我的精彩PeerConnection javascript代码”。
我不理解的是:
两个对等方之间的连接需要打开服务器套接字,以便对等方可以连接到它。即使UDP也需要UDP服务器套接字的概念。由于几乎所有非服务器Internet连接的对等方都在某种类型的路由器后面。例如,每个智能手机都使用WiFi路由器,桌面PC使用服务提供商的路由器,... 因为路由器/防火墙的原因,不应该可以连接到在智能手机上托管(浏览器WebRTC服务器套接字)或桌面计算机上的服务器套接字。
因此,我的理解是几乎没有需要通过Internet发送其流量的两个对等方将能够使用直接的P2P连接,对吧? 那么只有在类似于局域网的环境中使用Webrtc才有用,对吧? 对于像Chatroulette这样基于WebRTC的视频聊天服务,在中继几乎所有流量的情况下都需要使用一堆TURN服务器。这使得Webrtc在服务器带宽方面与托管自己的解决方案相同。
所以我的问题是:我是对的吗?如果不是,是什么技术细节允许PeerConnection在没有TURN服务器的情况下用于两个节点之间分开的Internet?如何在第4层TCP / UDP传输层上建立连接?它是否使用UDP,所有WiFi路由器都允许托管UDP服务器套接字或类似的内容?这不会因为NAT和安全而没有意义。
更新1: 深入研究后,我发现“对称nat”意味着什么,以及它与企业有什么关系:在大多数企业中,似乎已实现对接到互联网的设备有“对称nat”。这意味着将内部“内部IP:内部端口”元组映射到“互联网IP:互联网端口”的路由表还存储“目标IP:目标端口”。因此,这样的路由/ NAT存储每个(TCP?)连接的表,具有6个列“内部IP:内部端口:互联网IP:互联网端口:目标IP:目标端口”。这意味着除了目标之外,没有人被允许与内部IP:内部端口通信。 而非企业路由器似乎只存储“内部IP:内部端口:互联网IP:互联网端口”组合。这也就是所
1个回答

8

你说得不对。所有的节点都有IP地址以便通信,并且可以使用这些地址访问它们,前提是防火墙允许。

NAT通常只针对客户端发起的客户端-服务器流量进行优化。这通常意味着它们最初仅允许出站流量,并且仅在出站流量发生后才在同一线路上允许入站流量。非常适合服务器。有关问题简介,请参见this WebRTCHacks article

这就是ICE的作用,它试图从内部(客户端)打洞防火墙,以便在两个节点之间直接建立通信线路,而不需要任何“服务器”套接字,无论这意味着什么。

ICE的工作方式相当复杂,详细说明在RFC中。

但总体而言,它分为多个步骤:

  1. 每个节点(例如浏览器)都有一个“ICE代理”,用于收集候选项。候选项是此节点可被访问的地址(IP:端口号),包括:
  2. 主机候选项:例如,机器的即时LAN / wifi / VPN IP。
  3. 服务器反射候选项:机器的公共(NAT外部)地址,通过将请求反弹到互联网上的镜像(STUN)服务器来获取。
  4. 中继候选项:地址指向共享的TURN服务器,以便在所有其他方法均失败时转发数据。
  5. 一旦发现了候选项,它们将被插入本地SDP,并通过信令通道向另一个节点滴入,在那里它们将被插入其远程描述中,对方代理将看到它们。
  6. 一旦ICE代理具有本地和远程候选项,它将开始配对本地和远程候选项,并通过在它们上发送STUN请求(实际上是尝试访问对等方)来检查它们的连通性。
  7. 成功的配对是两个ICE代理都已经收到响应的配对(如果您愿意,这是一个四次握手过程)。
  8. 如果有多个成功的配对,则按某个度量标准进行排序,并选择最佳配对。
  9. 然后,所选的配对用于发送媒体。每个(视频或音频)媒体轨道都需要一对。
  10. 如果稍后找到更好的配对,则所选的配对可能会更改,从而影响发送媒体的地址。

TURN只在以下情况下需要使用:当两个客户端都处于对称NAT之后,或UDP流量被完全阻止。


关于“server-socket”这个术语,我建议阅读有关网络编程的资料,或者首先从Java文档开始 https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html - John Doe
1
我已经阅读了你提到的文章,但它恰好停在我的问题开始的地方。例如,文章的第一部分说“这就是nat的工作方式”,“这会对p2p造成问题”。底部指出:“一旦WebRTC会话得到适当的信令并被接受,NAT/防火墙发现和穿越的过程就开始了。完成后,建立通信路径并可以传输媒体。”作者进一步阐述说,他只是讲述了为什么NAT会导致问题,而没有涉及WebRTC如何解决它。 - John Doe
1
所以我的问题目前尚未得到答案,尽管我对这可能如何工作有一个大致的想法。但是你的话“它是如何工作的相当复杂”正是我所问的。希望你能详细说明这是如何工作的,谢谢你的时间。 - John Doe
1
@JohnDoe 我已经更新了答案并加入了更多细节。希望对你有所帮助。 - jib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接