信令
什么是WebRTC信令?
当你创建一个WebRTC代理时,它对另一个对等体一无所知。它不知道它将与谁联系或他们将发送什么! 信令是使呼叫成为可能的初始引导。交换这些值后,WebRTC代理可以直接相互通信。
信令消息只是文本。WebRTC代理并不关心它们是如何传输的。它们通常通过Websockets共享,但这不是必需的。
WebRTC信令是如何工作的?
WebRTC使用称为SDP会话描述协议的现有协议。通过此协议,两个WebRTC代理将共享建立连接所需的所有状态。协议本身易于阅读和理解。 复杂性来自于理解WebRTC填充它的所有值。
此协议并非特定于WebRTC。我们将首先学习会话描述协议,甚至不谈论WebRTC。WebRTC只真正利用了协议的一个子集,所以我们只介绍我们需要的内容。 在我们了解协议之后,我们将继续讨论它在WebRTC中的应用用法。
什么是会话描述协议 (SDP)?
会话描述协议在 RFC 8866 中定义。它是一个键/值协议,每个值后都有一个换行符。感觉类似于 INI 文件。 会话描述包含零个或多个媒体描述。在心理上,您可以将其建模为包含媒体描述数组的会话描述。
媒体描述通常映射到单个媒体流。因此,如果您想描述具有三个视频流和两个音轨的呼叫,您将有五个媒体描述。
如何阅读SDP
会话描述中的每一行都将以单个字符开头,这是您的密钥。然后后跟一个等号。等号之后的所有内容都是值。值完成后,您将有一个换行符。
会话描述协议定义所有有效的密钥。您只能对协议中定义的密钥使用字母。这些键都具有重要意义,稍后将解释。
获取此会话描述摘录:
a=my-sdp-value
a=second-value
你有两条线。每个都有钥匙.第一行有值a
my-sdp-value
,第二行有值second-value
。
WebRTC只使用一些SDP密钥
并非会话描述协议定义的所有键值都由WebRTC使用。只有 RFC 8829 中定义的 JavaScript 会话建立协议 (JSEP) 中使用的密钥才重要。以下七个关键是您现在唯一需要了解的:
v
- 版本,应等于 。0
o
- 原点,包含对重新协商有用的唯一 ID。s
- 会话名称,应等于 。-
t
- 计时,应等于 。0 0
m
- 媒体描述(),下面详细描述。m=<media> <port> <proto> <fmt> ...
a
- 属性,一个自由文本字段。这是WebRTC中最常见的行。c
- 连接数据,应等于 。IN IP4 0.0.0.0
会话描述中的媒体描述
会话描述可以包含无限数量的媒体描述。
媒体描述定义包含格式列表。这些格式映射到 RTP 有效负载类型。然后,实际编解码器由具有媒体描述中的值的属性定义rtpmap
。 RTP 和 RTP 有效负载类型的重要性将在媒体章节的后面讨论。每个媒体描述可以包含无限数量的属性。
以以下会话描述摘录为例:
v=0
m=audio 4000 RTP/AVP 111
a=rtpmap:111 OPUS/48000/2
m=video 4000 RTP/AVP 96
a=rtpmap:96 VP8/90000
a=my-sdp-value
您有两个媒体描述,一个是带有 fmt 的音频类型,另一个是格式的视频类型。第一个媒体描述只有一个属性。此属性将有效负载类型映射到 Opus。 第二个媒体描述有两个属性。第一个属性将有效负载类型映射为 VP8,第二个属性只是 .111
96
111
96
my-sdp-value
完整示例
下面将我们讨论过的所有概念放在一起。这些是WebRTC使用的会话描述协议的所有功能。 如果你能读到这个,你可以读任何WebRTC会话描述!
v=0
o=- 0 0 IN IP4 127.0.0.1
s=-
c=IN IP4 127.0.0.1
t=0 0
m=audio 4000 RTP/AVP 111
a=rtpmap:111 OPUS/48000/2
m=video 4002 RTP/AVP 96
a=rtpmap:96 VP8/90000
v
、、、、 已定义,但它们不会影响 WebRTC 会话。o
s
c
t
- 您有两个媒体描述。一种类型,一种类型。
audio
video
- 其中每个都有一个属性。此属性配置 RTP 管道的详细信息,这将在“媒体通信”一章中讨论。
会话描述协议和WebRTC如何协同工作
难题的下一部分是理解WebRTC如何使用SDP会话描述协议。
什么是报价Offer和答案Answer?
WebRTC使用报价/答案模型。所有这一切都意味着一个WebRTC代理提出“报价”来开始呼叫,而另一个WebRTC代理“回答”,如果它愿意接受所提供的内容。
这使应答者有机会拒绝媒体描述中不受支持的编解码器。这就是两个对等方了解他们愿意交换什么格式的方式。
收发器用于发送和接收
收发器是一个特定于WebRTC的概念,您将在API中看到。它正在做的是将“媒体描述”暴露给JavaScript API。每个媒体描述都成为收发器。 每次创建收发器时,都会在本地会话描述中添加新的媒体描述。
WebRTC中的每个媒体描述都有一个方向属性。这允许WebRTC代理声明“我将向您发送此编解码器,但我不愿意接受任何回复”。有四个有效值:
send
recv
sendrecv
inactive
WebRTC使用的SDP值
这是您将在WebRTC代理的会话描述中看到的一些常见属性的列表。其中许多值控制着我们尚未讨论的子系统。
group:BUNDLE
捆绑是通过一个连接运行多种类型的流量的行为。一些WebRTC实现为每个媒体流使用专用连接。应首选捆绑。
fingerprint:sha-256
这是对等方用于 DTLS 的证书的哈希值。DTLS 握手完成后,将其与实际证书进行比较,以确认您正在与预期人员通信。
setup:
这将控制 DTLS 代理行为。这决定了它在 ICE 连接后是作为客户端还是服务器运行。可能的值为:
setup:active
- 以 DTLS 客户端身份运行。setup:passive
- 作为 DTLS 服务器运行。setup:actpass
- 要求其他WebRTC代理选择。
mid
“mid”属性用于标识会话描述中的媒体流。
ice-ufrag
这是 ICE 代理的用户片段值。用于 ICE 流量的身份验证。
ice-pwd
这是 ICE 代理的密码。用于对 ICE 流量进行身份验证。
rtpmap
此值用于将特定编解码器映射到 RTP 有效负载类型。有效负载类型不是静态的,因此对于每个呼叫,提供方决定每个编解码器的有效负载类型。
fmtp
为一种有效负载类型定义其他值。这对于传达特定的视频配置文件或编码器设置非常有用。
candidate
这是来自 ICE 代理的 ICE 候选项。这是WebRTC代理可用的一个可能的地址。这些将在下一章中充分解释。
ssrc
同步源 (SSRC) 定义单个媒体流跟踪。
label
是此单个流的 ID。 是容器的 ID,其中可以有多个流。mslabel
WebRTC 会话描述示例
以下是WebRTC客户端生成的完整会话描述:
v=0
o=- 3546004397921447048 1596742744 IN IP4 0.0.0.0
s=-
t=0 0
a=fingerprint:sha-256 0F:74:31:25:CB:A2:13:EC:28:6F:6D:2C:61:FF:5D:C2:BC:B9:DB:3D:98:14:8D:1A:BB:EA:33:0C:A4:60:A8:8E
a=group:BUNDLE 0 1
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=setup:active
a=mid:0
a=ice-ufrag:CsxzEWmoKpJyscFj
a=ice-pwd:mktpbhgREmjEwUFSIJyPINPUhgDqJlSd
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
a=ssrc:350842737 cname:yvKPspsHcYcwGFTw
a=ssrc:350842737 msid:yvKPspsHcYcwGFTw DfQnKjQQuwceLFdV
a=ssrc:350842737 mslabel:yvKPspsHcYcwGFTw
a=ssrc:350842737 label:DfQnKjQQuwceLFdV
a=msid:yvKPspsHcYcwGFTw DfQnKjQQuwceLFdV
a=sendrecv
a=candidate:foundation 1 udp 2130706431 192.168.1.1 53165 typ host generation 0
a=candidate:foundation 2 udp 2130706431 192.168.1.1 53165 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.2.3.4 57336 typ srflx raddr 0.0.0.0 rport 57336 generation 0
a=candidate:foundation 2 udp 1694498815 1.2.3.4 57336 typ srflx raddr 0.0.0.0 rport 57336 generation 0
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=setup:active
a=mid:1
a=ice-ufrag:CsxzEWmoKpJyscFj
a=ice-pwd:mktpbhgREmjEwUFSIJyPINPUhgDqJlSd
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=ssrc:2180035812 cname:XHbOTNRFnLtesHwJ
a=ssrc:2180035812 msid:XHbOTNRFnLtesHwJ JgtwEhBWNEiOnhuW
a=ssrc:2180035812 mslabel:XHbOTNRFnLtesHwJ
a=ssrc:2180035812 label:JgtwEhBWNEiOnhuW
a=msid:XHbOTNRFnLtesHwJ JgtwEhBWNEiOnhuW
a=sendrecv
这是我们从此消息中了解到的:
- 我们有两个媒体部分,一个音频和一个视频。
- 它们都是收发器。我们得到了两个流,我们可以发回两个。
sendrecv
- 我们有 ICE 候选项和身份验证详细信息,因此我们可以尝试连接。
- 我们有证书指纹,因此我们可以进行安全呼叫。