70

我对浏览器中的点对点连接感兴趣。由于 WebRTC 似乎可以做到这一点,我想知道它是如何工作的。

我已经阅读了一些解释并查看了有关它的图表,现在我很清楚,连接建立在服务器上工作。服务器似乎在愿意相互连接的客户端之间交换一些数据,以便它们可以启动直接连接,即独立于服务器。

但这正是我不明白的。到目前为止,我认为创建连接的唯一方法是侦听计算机 A 上的端口并从计算机 B 连接到该端口。但在 WebRTC 中似乎并非如此。我认为没有一个客户端开始监听端口。不知何故,他们可以在不监听端口和接受连接的情况下创建连接。客户端 A 和客户端 B 都没有开始充当服务器。

但是怎么做?通过 WebRTC 服务器交换哪些数据,客户端可以使用这些数据相互连接?

感谢您对此的解释:)

编辑

我找到了这篇文章。它与 WebRTC 无关,但我认为它回答了我的部分问题。我不确定,很难。如果有人可以向我解释并给我一些额外的链接,它仍然会很酷。

4

4 回答 4

60

WebRTC 将 SDP Offer 提供给客户端 JS 应用程序以发送(无论 JS 应用程序想要)到其他设备,后者使用它来生成 SDP Answer。

诀窍在于 SDP 包括 ICE 候选者(实际上是“尝试通过此 IP 地址和此端口与我交谈”)。ICE 可以在防火墙中打开端口;虽然如果双方都是对称 NAT,一般情况下是不可能的,并且可以使用替代候选者(在 TURN 服务器上)。

一旦他们直接交谈(或通过 TURN,这实际上是一个数据包镜像),他们就可以打开一个 DTLS 连接并使用它来加密 SRTP-DTLS 媒体流,并通过 DTLS 发送 DataChannel。

编辑:这里的首字母缩略词:http ://blog.1click.io/10-jargons-abbreviations-for-webrtc-fans/其余的是谷歌。其中大部分是由 IETF ( http://ietf.org/ )定义的

编辑 2:Firefox 和 Chrome(以及规范)已经开始对 ICE 候选者使用“涓流”,因此 ICE 候选者通常在面后添加到 PeerConnection 并独立于初始 SDP 进行交换(尽管您可以等到最初的候选人在发送报价之前已经准备好,并将它们捆绑在一起)。见https://webrtcglossary.com/trickle-ice/https://datatracker.ietf.org/doc/draft-ietf-ice-trickle/

于 2012-10-03T22:18:55.257 回答
27

WebRTC 的工作原理

本文档对 WebRTC 进行了快速而抽象的介绍。要获得有关 WebRTC 的更多信息,请查看本文档末尾的进一步阅读部分。

网络RTC

WebRTC(Web Real-Time Communication)是为浏览器之间的点对点双工实时通信而开发的一组技术。顾名思义,它与 Web 兼容,并且是W3C 中的标准WebRTC 的一个重要特性是它甚至可以在 NAT 地址后面工作。

WebRTC 点对点

WebRTC 使用多种技术在浏览器之间提供实时对等通信。这些技术是

还有一件事是运行 WebRTC 需要Signaling Server 。但是,在实现信令服务器方面并没有明确的标准。每个实现都创建自己的样式。本节稍后将提供有关 Signaling Server 的更多信息。

让我们快速了解一下上述技术。

SDP(会话描述协议)

SDP 是一个简单的协议,它用于浏览器支持的编解码器。例如,假设有两个对等点(客户端 A客户端 B)将通过 WebRTC 连接。客户端 A客户端 B创建定义它们支持的编解码器的 SDP 字符串。例如,客户端 A可能支持视频的 H264、VP8 和 VP9 编解码器,音频的 Opus 和 PCM 编解码器。客户端 B可能仅支持视频的 H264 和音频的仅 Opus 编解码器。对于这种情况,客户端 A客户端 B之间将使用的编解码器是 H264 和 Opus。如果对等体之间没有通用编解码器,则无法建立对等通信。

您可能对这些 SDP 字符串如何在彼此之间发送有疑问。这是 Signaling Server 发生的地方。

ICE(交互连接建立)

ICE 是在对等点之间建立连接的魔法,即使它们位于 NAT 之后。让我们再次假设客户端 A客户端 B将连接起来,并看看 ICE 是如何用于此的。

  • 客户端 A通过 STUN 服务器找出他们的本地地址和公共 Internet 地址,并通过信令服务器将这些地址发送给客户端 B。从 STUN 服务器接收到的每个地址称为ICE 候选

在上图中,有两台服务器。其中一个是 STUN,另一个是 TURN 服务器。

STUN 服务器用于让客户端 A了解其所有地址。举个例子,我们的电脑一般在 192.168.0.0 网络中有一个本地地址,我们连接到www.whatismyip.com时看到的还有第二个地址,这个IP地址实际上是我们的公共IP地址互联网网关(调制解调器、路由器等)所以让我们定义 STUN 服务器;STUN 服务器让对等方知道他们的公共和本地 IP 地址。顺便说一句,谷歌提供免费的 STUN 服务器(stun.l.google.com:19302)。

图中还有一个服务器,TURN Server。当对等点之间无法建立对等连接时,使用 TURN Server。TURN 服务器只是在对等点之间中继数据。

  • 客户端 B也这样做,从 STUN 服务器获取本地和公共 IP 地址,并通过信令服务器将这些地址发送给客户端 A。

  • 客户端 A 接收客户端 B的地址并通过发送特殊 ping 来尝试每个 IP 地址,以便创建与客户端 B的连接。如果客户端 A接收到来自任何 IP 地址的响应,它将将该地址连同其响应时间和其他性能凭据一起放入一个列表中。最后客户端A根据其性能选择最佳地址。

  • 客户端 B执行相同操作以连接到客户端 A

RTP(实时协议)

RTP 是一种成熟的传输实时数据的协议。它基于UDP。音频和视频在 WebRTC 中使用 RTP 传输。RTP 有一个姊妹协议,名为 RTCP(实时控制协议),它在 RTP 通信中提供 QoS。RTP 也用于 RTSP(实时流协议)

信令服务器

最后一部分是未在 WebRTC 中定义的信令服务器。如上所述,Signaling Server 用于在Client AClient B之间发送 SDP 字符串和 ICE Candidates 。信令服务器还决定哪些对等方相互连接。WebSocket 技术一般用于 Signaling Server 进行通信。

兼容性

在过去的一年里,包括 Safari、Edge 在内的所有浏览器都发布了支持 WebRTC 的新版本。Chrome、Firefox 和 Opera 已经支持 WebRTC 有一段时间了。浏览器常用的视频编解码器是 H264。对于音频,Opus 在浏览器中很常见。PCM 也可用于音频编解码器,但由于许可问题,即使所有浏览器都支持 AAC,也不使用 AAC。IP 摄像机通常支持 H264 视频编解码器和 PCM 或 AAC 音频编解码器。

进一步阅读和参考

顺便说一句,我是Ant Media Server的开发人员,它支持可扩展的一对多 WebRTC 和对等 WebRTC 连接

于 2018-11-14T05:00:25.547 回答
20

建立 p2p WebRTC 连接有 3 个步骤(10.000 英尺概览):

  1. 第 1 步:信令:双方都连接到信令服务器(使用 80/443 上的 websockets、comet、SIP 等)并交换信息(关于他们的媒体功能、公共 IP:可用时的端口对等)

  2. 第 2 步:发现:连接到 LAN 或移动网络的设备不知道可以访问它们的公共 IP(和端口),因此它们使用位于公共 Internet 上的 STUN/TURN 服务器来发现它们的 ip:port 对(ICE候选人)。在此过程中,他们在步骤 3 中使用的 NAT/路由器上打了一个洞:

  3. 第 3 步:P2P 连接:一旦通过初始信令通道交换 ICE 候选者,每个对等点都知道彼此的 ip:port(并且在 NAT/路由器上打了孔),因此可以建立对等 UDP 连接。

在此处输入图像描述

上面的方案解释了 2 台设备连接到本地网络的过程。这是我写的一篇文章的一部分,它处理连接问题的故障排除,但它很好地解释了 WebRTC 的工作原理。

于 2017-06-08T10:57:54.227 回答
11

在这本书“高性能浏览器网络(O'Reilly)” http://chimera.labs.oreilly.com/books/1230000000545/ch03.html#STUN_TURN_ICE中可以找到一个很好的解释 ,它提供了 WebRTC 如何使用的基础知识冰技术。

在此处输入图像描述

特别是假设 STUN 服务器的 IP 地址已知,WebRTC 应用程序首先向 STUN 服务器发送绑定请求。STUN 服务器回复一个响应,其中包含从公共网络看到的客户端的公共 IP 地址和端口。

现在应用程序发现了它的公共 IP 和端口元组,这些元组可以通过 SDP 发送给其他对等方。(请注意,SDP 是通过外部信号通道发送的,通过网络服务建立的网络套接字)

有了这个机制,每当两个对等方想要通过 UDP 相互通信时,他们就可以使用已建立的公共 IP 和端口元组来交换数据。

不幸的是,在某些情况下,UDP 可能会被防火墙阻止。为了解决这个问题,每当 STUN 失败时,我们可以使用 Traversal Using Relays around NAT (TURN) 协议作为备用协议,该协议可以在 UDP 上运行并在其他所有方法都失败时切换到 TCP。

于 2016-06-13T14:22:38.950 回答