基本概念
通信协议 SDP(或Session Description Protocol
)用于协商两个设备或端点之间的实时通信会话的具体内容。WebRTC 使用 SDP 来协商会话的媒体参数并描述每个设备的媒体功能。换句话说,SDP 是 WebRTC 设备之间相互交流的语言。
它促进了具有不同功能或位于防火墙或 NAT 后面的设备之间的实时通信,使其成为 WebRTC 的重要组成部分。如果 WebRTC 设备无法协商通信会话的细节,实时通信就不可能实现。
SDP 在 WebRTC 中如何工作?
SDP 消息由一系列键值对构成,每对键值对代表会话的特定方面。SDP 消息通常作为 WebRTC 信令过程的一部分发送,用于在两个设备之间建立连接。SDP 协商过程通常涉及两个步骤:提供和回答。
在提供阶段,一个 WebRTC 客户端向另一个 WebRTC 客户端发送 SDP 消息,描述其媒体功能和进一步的会话详细信息。然后,另一个 WebRTC 客户端用自己的 SDP 消息作为答复,描述其功能和会话详细信息。然后,两个 WebRTC 客户端比较 SDP 消息并就两个客户端可接受的一组媒体参数达成一致。
一旦 SDP 协商过程完成,两个设备就可以开始使用商定的参数在它们之间传输媒体。
这个过程可能很复杂,尤其是在处理多个设备或网络时。然而,这对于建立成功的 WebRTC 通信会话至关重要。
常见的 SDP 属性
SDP 消息包含各种属性,用于描述 WebRTC 设备的媒体功能和其他会话详细信息。一些最常见的 SDP 属性包括:
- 版本:正在使用的 SDP 协议的版本
- Origin: SDP 消息的发起者,包括用户名、会话 ID 和网络地址
- 会话名称:会话的可读名称
- 媒体描述:提供或应答的媒体流的描述,包括媒体类型、编解码器和传输协议
- 连接数据:有关用于通信的网络地址和端口的信息
- 时间安排:有关会议时间安排的信息,包括开始和结束时间
- 加密:有关用于保护会话安全的任何加密机制的信息
会话描述
会话描述提供了多媒体会话的总体描述。它包括会话名称、会话时间和连接信息等信息,例如:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=-
c=IN IP4 127.0.0.1
t=0 0
其中各键含义如下:
- v=(协议版本)
- o=(发起者和会话标识符)
- s=(会话名称)
- c=*(连接信息——如果包含在所有媒体描述中则不需要)
- t=(会话活跃的时间)
媒体描述
媒体描述提供了会话期间将要交换的媒体的具体信息。它描述了媒体类型、使用的编解码器和使用的传输协议,例如:
m=audio 4000 RTP/AVP 111
a=rtpmap:111 OPUS/48000/2
m=video 4000 RTP/AVP 96
a=rtpmap:96 VP8/90000
- m=(媒体名称和传输地址)
- a= *(零个或多个媒体属性行)
属性
属性提供有关多媒体会话的其他信息。它们可以包括有关媒体带宽、使用的网络地址和端口以及媒体加密的信息。
以下是您将在 WebRTC 代理的会话描述中看到的一些典型特征的摘要。其中许多参数用于控制无法识别的子系统。
group:BUNDLE
此行后面跟着 SDP 中可用的多个媒体中间,用于通过单个 UDP/TCP 连接发送各种媒体。一般建议在 WebRTC 中使用捆绑。
fingerprint:sha-256
此行包含有关 DTLS 握手期间交换的证书哈希值的信息。
a=setup
控制 ICE 连接后的 DTLS 代理,该值决定 DTLS 是否应作为客户端或服务器运行。有三个可能的值:
setup:active
DTLS 代理将作为客户端运行setup:passive
DTLS 代理将作为服务器运行setup:actpass
DTLS 代理将让其他 WebRTC 对等方决定使用什么。
ice-ufrag
,ice-pwd
和ice-options
这些是与 ICE 相关的配置。ice-ufrag
定义用户名片段并ice-pwd
保存 ICE 身份验证的密码。同时ice-options
指示是否应滴答或重新提名 ICE 聚会。
extmap
这定义了在对等连接中分别在要约或答复中发送或接收的可用标头扩展。
msid
这只是为了告诉对方正在发送的流 ID 和轨道一。格式为$${streamid}$${trackid}
。
rtpmap
使用此值将特定编解码器映射到 RTP 有效负载类型。由于有效负载类型不固定,因此提供者会为每个呼叫选择每个编解码器的有效负载类型。
rtcp-fb
这存在于 SDP 的媒体部分中。它不应包含在 SDP 的会话部分中。rtcp-fb
声明应该对给定有效负载类型的媒体部分使用哪些RTCP反馈消息。
ssrc
同步源。它是一个 32 位随机值,表示在 RTP 连接中为特定源发送媒体。格式为a=ssrc:<ssrc-id> cname: <cname-id>
。
这些是重要的属性,它们告诉我们很多有关会话中协商和使用的媒体的信息。我希望您已经了解如何阅读 SDP 及其组件。
一个SDP内容的主要解释
//版本 v=0//<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address> o=- 3089712662142082488 2 IN IP4 127.0.0.1//会话名 s=- //会话的起始时间和结束时间,0代表没有限制 t=0 0//表示音频传输和data channel传输共用一个传输通道传输的媒体,通过id进行区分不同的流 a=group:BUNDLE audio data //WebRTC Media Stream a=msid-semantic: WMS //m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中现在一般不使用,如果设置为0,代表不传输音频 //使用UDP来传输RTP包,并使用TLS加密, SAVPF代表使用srtcp的反馈机制来控制通信过程 //111 103 104 9 0 8 106 105 13 110 112 113 126表示支持的编码,和后面的a=rtpmap对应 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126//表示你要用来接收或者发送音频使用的IP地址, webrtc使用ICE传输,不使用这个地址, 关于ICE是什么后面2.5节会讲到 c=IN IP4 0.0.0.0//用来传输rtcp的地址和端口,webrtc中不使用 a=rtcp:9 IN IP4 0.0.0.0//ICE协商过程中的安全验证信息 a=ice-ufrag:ubhd a=ice-pwd:l82NnsGm5i7pucQRchNdjA6B //支持trickle,即sdp里面只描述媒体信息, ICE候选项的信息另行通知 a=ice-options:trickle //dtls协商过程中需要的认证信息 a=fingerprint:sha-256 CA:83:D0:0F:3B:27:4C:8F:F4:DB:34:58:AC:A6:5D:36:01:07:9F:2B:1D:95:29:AD:0C:F8:08:68:34:D8:62:A7 a=setup:active //前面BUNDLE行中用到的媒体标识 a=mid:audio //指出要在rtp头部中加入音量信息 a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level //当前客户端只接受数据,不发送数据,recvonly,sendonly,inactive,sendrecv a=recvonly //rtp,rtcp包使用同一个端口来传输 a=rtcp-mux //下面都是对m=audio这一行的媒体编码补充说明,指出了编码采用的编号、采样率、声道等 a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc //对opus编码可选的补充说明,minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性 a=fmtp:111 minptime=10;useinbandfec=1 a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 a=rtpmap:9 G722/8000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:106 CN/32000 a=rtpmap:105 CN/16000 a=rtpmap:13 CN/8000 a=rtpmap:110 telephone-event/48000 a=rtpmap:112 telephone-event/32000 a=rtpmap:113 telephone-event/16000 a=rtpmap:126 telephone-event/8000//下面就是对Data Channel的描述,基本和上面的audio描述类似,使用DTLS加密,使用SCTP传输 m=application 9 DTLS/SCTP 5000 c=IN IP4 0.0.0.0//可以是CT或AS,CT方式是设置整个会议的带宽,AS是设置单个会话的带宽。默认带宽是kbps b=AS:30 a=ice-ufrag:ubhd a=ice-pwd:l82NnsGm5i7pucQRchNdjA6B a=ice-options:trickle a=fingerprint:sha-256 CA:83:D0:0F:3B:27:4C:8F:F4:DB:34:58:AC:A6:5D:36:01:07:9F:2B:1D:95:29:AD:0C:F8:08:68:34:D8:62:A7 a=setup:active //前面BUNDLE行中用到的媒体标识 a=mid:data //使用端口5000,一个消息的大小是1024比特 a=sctpmap:5000 webrtc-datachannel 1024 |
示例结构与说明
https://webrtchacks.com/sdp-anatomy/ 这个站点给我们展示了一个详细的 SDP 例子。左侧为 SDP 文本,可以明显看出 SDP 的格式与结构,右侧则对每一行描述进行了说明。如果你不想看冗长的规范文档,这个例子是一个不错的学习材料。
调试 SDP 问题
使用 SDP 时,拥有合适的工具来帮助您更有效地调试问题至关重要。虽然没有很多专门用于 SDP 的工具,但可以使用一些 SDP 解析器来使 SDP 字符串更具可读性。其中一些工具包括:
- SDP Transform:一个JavaScript 库,提供解析、修改和生成 SDP 字符串的功能。
- SDP Visualiser:一种允许您可视化和分析 SDP 文件的工具,使您更容易理解其结构和内容。
- SDP 解析器库:有多个适用于不同编程语言(例如 JavaScript 和 Go)的 SDP 解析器库。这些库可以帮助您以首选语言使用 SDP,从而更轻松地调试和解决问题。
总结
在 WebRTC 中的 SDP 相对于标准 SDP 规范中有点不一样,它对于 SDP 划分了更多部分,详情可以看下图:
WebRTC 按功能将 SDP 划分成了五部分,即会话元数据、网络描述、流描述、安全描述以及服务质量描述。WebRTCSDP 中的会话元数据(SessionMetadata)其实就是 SDP 标准规范中的会话层描述;流描述、网络描述与 SDP 标准规范中的媒体层描述是一致的;而安全描述与服务质量描述都是新增的一些属性描述。SDP 作为 WebRTC 的核心部分,是你深入学习 WebRTC 前所要必须掌握的基础内容。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6511