WebRTC 协议简介
本文介绍了 WebRTC API 所构建的基础协议。
ICE
交互式连接建立 (ICE) 是一个框架,允许您的浏览器与对等方连接。从对等方 A 到对等方 B 的直接连接之所以会失败,有很多原因。它需要绕过阻止建立连接的防火墙,在您没有公共 IP 地址(这很常见)的情况下为您分配一个唯一的地址,并在您的路由器不允许您直接与对等方连接时通过服务器中继数据。ICE 使用 STUN 和/或 TURN 服务器来实现此目的,如下所述。
STUN
NAT 的会话遍历实用程序 (STUN) 是一种用于发现您的公共地址并确定路由器中可能阻止与对等方直接连接的限制的协议。
客户端会向互联网上的 STUN 服务器发送一个请求,该服务器会回复客户端的公共地址以及客户端是否可以通过路由器的 NAT 访问。

NAT
网络地址转换 (NAT) 用于为您的设备分配一个公共 IP 地址。路由器将拥有一个公共 IP 地址,而连接到路由器的每个设备都将拥有一个私有 IP 地址。请求将从设备的私有 IP 转换为路由器的公共 IP,并带有一个唯一的端口。这样,您就不需要为每台设备分配唯一的公共 IP,但仍可在互联网上被发现。
某些路由器会对连接到网络上设备的用户进行限制。这意味着,即使我们通过 STUN 服务器找到了公共 IP 地址,也不是任何人都可以建立连接。在这种情况下,我们需要使用 TURN。
TURN
某些使用 NAT 的路由器会采用一种名为“对称 NAT”的限制。这意味着路由器只会接受来自您之前连接过的对等方的连接。
通过 NAT 代理进行遍历 (TURN) 旨在通过与 TURN 服务器建立连接并让所有信息通过该服务器进行中继来绕过对称 NAT 限制。您将与 TURN 服务器建立连接,并指示所有对等方将数据包发送到该服务器,然后由该服务器转发给您。这显然会带来一些开销,因此只有在没有其他选择的情况下才会使用。

SDP
会话描述协议 (SDP) 是一种用于描述连接的多媒体内容的标准,例如分辨率、格式、编解码器、加密等,以便在数据传输时双方能够相互理解。本质上,这是描述内容的元数据,而不是媒体内容本身。
因此,从技术上讲,SDP 并不是真正的协议,而是一种用于描述共享设备间媒体的连接的数据格式。
SDP 的文档记录远超出本文档的范围;但是,有几点在此值得注意。
结构
SDP 由一行或多行 UTF-8 文本组成,每行都以一个字符类型开头,后跟一个等号 (=),然后是组成值或描述的结构化文本,其格式取决于类型。以给定字母开头的文本行通常被称为“字母行”。例如,提供媒体描述的行类型为 "m",因此这些行被称为“m 行”。
了解更多信息
要了解更多关于 SDP 的信息,请参阅以下有用资源
多方视频会议
在 WebRTC 点对点网络中,对等方根据设备功能和网络带宽协商合适的视频编解码器/流。然后,每个发送者将包含视频信息的单个流“单播”到其对等方。
多方之间的视频会议更加复杂,因为对等方可能具有不同的功能和网络条件:一个特定的视频流分辨率、速率和质量可能不适合所有接收者,同时发送者为许多接收者生成和发送多个流既不高效也不可扩展。
解决这些问题的最常见方法是使用称为选择性转发单元 (SFU) 或选择性转发中间件 (SFM) 的中间服务器。发送者输出编码后的视频,以便 SFM 可以选择性地转发适合每个接收者的视频流。WebRTC 在这种情况下用于编码视频的两种主要技术是: simulcast 和可伸缩视频编码。
Simulcast
Simulcast 以不同分辨率和比特率的相同源的多个同步版本发送到单独的流中。SFM 根据接收者的网络条件和设备功能将最合适的流转发给每个接收者。
SFM 依赖于确定帧依赖关系的能力,例如从一个帧链到最后一个关键帧,以便在接收者察觉不到的情况下转发数据包和切换 simulcast 层。
VP8 和 VP9 编解码器分别可以在 VP8 有效载荷描述符和 VP9 有效载荷描述符中包含帧依赖信息。对于 AV1 编解码器,信息通过 依赖描述符 (DD) RTP 头扩展发送。
最近的浏览器实现通常对所有编解码器使用 DD 头,因为它与编解码器无关,这可以简化 SFM 的实现。此外,因为它属于 RTP 头的一部分而不是有效载荷,所以它可以在端到端加密场景中使用。
可伸缩视频编码
可伸缩视频编码 (SVC) 将视频源编码到单个流中,该流具有多个层,可以被选择性地解码以获得特定分辨率、比特率或质量的视频。SFM 可以转发一部分层,以发送适合每个接收者网络和设备的流。
请注意,在 simulcast(请参阅 SVC 规范中的依赖关系图以“了解”其复杂性)中,依赖关系比仅为选择要转发的流所需的要复杂得多。SVC 流包含一个提供最低质量水平的基础层,并且可能包含多个增强层,这些增强层允许可变的帧速率(“时间可伸缩性”)、更高的分辨率(“空间可伸缩性”)以及相同分辨率下的不同比特率。VP8 编解码器仅支持时间层,而 VP9 支持时间和空间层。
VP8 和 VP9 编解码器分别可以在 VP8 有效载荷描述符和 VP9 有效载荷描述符中包含帧依赖信息。对于 AV1 编解码器,信息通过 依赖描述符 (DD) RTP 头扩展发送。
与 simulcast 一样,最近的浏览器实现通常对所有支持 SVC 的编解码器使用 DD 头,以简化 SFM 的实现,并且因为它支持端到端加密场景。
Chrome 111 及更高版本支持 SVC。在撰写本文时(大约 FF136),Firefox 不支持 SVC。
依赖描述符 RTP 头扩展
在规范AV1 的 RTP 有效载荷格式 (v1.0) 中定义的 依赖描述符 (DD) RTP 头扩展,提供了一种独立于编解码器、灵活、高效且可扩展的方法来描述多层视频流中帧之间的关系。
SFM 可以使用这些信息来选择和转发与目标接收者所在层相关的数据包。由于该头文件是真正的扩展,因此它不是有效载荷的一部分,因此在端到端加密 (E2EE) 场景中仍然可以被 SFM 使用。
Chrome 和 Firefox(136+)支持 DD 头。
WebRTC 支持的编解码器
此信息可在 WebRTC 使用的编解码器 中找到。