🚥SDP协议理解
2023-6-7
| 2023-7-4
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
😀
前言: 本文是系列文章中的一篇,主要是记录在分析WebRTC建立连接过程里所应用的技术背景的理解,希望在对这个过程做解构之后,可以更进一步的理解WebRTC,从而有能力对其中的源码做出修剪,不止于WebRTC,在其他音视频领域都可以用到这其中的知识与技巧。
 

📝 WebRTC理解之SDP协议

 
SDP(Session Description Protocol)是一种通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明、会话邀请、会话初始化等。
 
WebRTC主要在连接建立阶段用到SDP,连接双方通过信令服务交换会话信息,包括音视频编解码器(codec)、主机候选地址、网络传输协议等。
 
下面先简单介绍下SDP的格式、常用属性,然后通过WebRTC连接建立过程生成的SDP实例进行进一步讲解。
|Field| Type | Opt/Mind| Description|
Session description
Time description
Media description, if present

协议格式说明

协议格式

  • <type>:大小写敏感的一个字符,代表特定的属性,比如v代表版本;
  • <value>:结构化文本,格式与属性类型有关,UTF8编码;
  • =两边不允许存在空格;
  • 表示是可选的;

常见属性

以下面的SDP为例子:

协议版本号 v= -- Protocol Version

格式如下,没有子版本号

会话发起者: o= -- Origin

格式如下,其中,username、session-id、nettype、addrtype、unicast-address 一起,唯一标识一个会话。
各字段含义如下:
username:发起者的用户名,不允许存在空格,如果应用不支持用户名,则为-。 sess-id:会话id,由应用自行定义,规范的建议是NTP(Network Time Protocol)时间戳。 sess-version:会话版本,用途由应用自行定义,只要会话数据发生变化时(比如编码),sess-version随着递增就行。同样的,规范的建议是NTP时间戳。 nettype:网络类型,比如IN表示Internet。 addrtype:地址类型,比如IP4IV6unicast-address:域名,或者IP地址。

会话名 s=

必选,有且仅有一个s=字段,且不能为空。如果实在没有有意义的会话名,可以赋一个空格,即s=

连接数据:c=

格式如下:
每个SDP至少需要包含一个会话级别的c=字段,或者在每个媒体描述后面各包含一个c=字段。(媒体描述后的c=会覆盖会话级别的c=
  • nettype:网络类型,比如IN,表示 Internet。
  • addrtype:地址类型,比如IP4、IP6。
  • connection-address:如果是广播,则为广播地址组;如果是单播,则为单播地址;
举例01:
举例02:

媒体描述:m=

SDP可能同时包含多个媒体描述。格式如下:
其中: media:媒体类型。包括 videoaudiotextapplicationmessage等。 port:传输媒体流的端口,具体含义取决于使用的网络类型(在c=中声明)和使用的协议(proto,在m=中声明)。 proto:传输协议,具体含义取决于c=中定义的地址类型,比如c=IP4,那么这里的传输协议运行在IP4之上。比如: UDP:传输层协议是UDP。 RTP/AVP:针对视频、音频的RTP协议,跑在UDP之上。 RTP/SAVP:针对视频、音频的SRTP协议,跑在UDP之上。
fmt:媒体格式的描述,可能有多个。根据 proto 的不同,fmt 的含义也不同。比如 protoRTP/SAVP 时,fmt 表示 RTP payload 的类型。如果有多个,表示在这次会话中,多种payload类型可能会用到,且第一个为默认的payload类型。 举例,下面表示媒体类型是视频,采用SRTP传输流媒体数据,且RTP包的类型可能是122、102...119,默认是122。
对于RTP/SAVP,需要注意的是,payload type 又分两种类型:
静态类型:参考 RTP/AVP audio and video payload types。 动态类型:在a=fmtp:里进行定义。(a=为附加属性,见后面小节) 举例,下面的SDP中:
对于audio,111 是动态类型,表示opus/48000/2。 对于video,122 是动态类型,表示H264/90000

附加属性:a=

作用:用于扩展SDP。
有两种作用范围:会话级别(session-level)、媒体级别(media-level)。
媒体级别:媒体描述(m=)后面可以跟任意数量的 a= 字段,对媒体描述进行扩展。 会话级别:在第一个媒体字段(media field)前,添加的a=字段是会话级别的。 有如下两种格式:
格式1举例:
格式2举例:

时间:t=

作用:声明会话的开始、结束时间。
格式如下:
如果<stop-time>是0,表示会话没有结束的边界,但是需要在<start-time>之后会话才是活跃(active)的。如果<start-time>是0,表示会话是永久的。
举例:

WebRTC实例

下面例子来自腾讯云WebRTC服务的远端offer。

后记

SDP协议格式本身很简单,难点一般在于应用层在不同场景下扩展出来的属性,以及不同扩展属性对应的含义。比如上面举的例子,扩展属性、属性值的说明分散在数十个RFC里。
  • m line 里会指明传输协议,例如 UDP/TLS/RTP/SAVPF,最后的 SAVPF 还有其他几种值:AVP, SAVP, AVPF, SAVPF AVP 意为 AV profile
    • S 意为 secure
    • F 意为 feedback
  • rtpmap 是描述 codec 的,但有特殊的 rtx codec,其实不是 codec,例如 rtx;
  • fmtp 补充描述 codec 的参数,format parameters
    • max-fr: maximum framerate
    • profile-level-id: H.264 的 profile level id
  • rtx 描述重传策略,由 rtpmap 指明,它的参数由 fmtp 描述
    • apt: associated payload type,指明所描述的 stream;
    • rtx-time: rtp 包在缓冲区保留时间;
  • rtcp-fb: RTCP 反馈机制
    • offer 里面列出一些反馈机制,answer 里应移除不理解、不支持的机制,但不能修改;
    • ack rpsi/app
    • nack pli/sli/rpsi/app
    • rpsi: reference picture selection indication
    • app: app 层反馈机制
    • pli: picture loss indication,表明收流端丢失了一幅图像的一些数据,发送端可能会发送一个 I 帧(类似于 FIR),但要考虑拥塞控制
    • sli: slice loss indication
    • ccm fir: codec control message, full intra refresh
  • fec 类似于 rtx,也由 rtpmap 指明,它的参数由 fmtp 指明;

附件 常见负载类型

Schulzrinne & Casner Standards Track [Page 33]
 
RFC 3551 RTP A/V Profile July 2003
 
 
技术分享
  • WebRTC
  • 协议分析
  • WebRTC封装静态库Win11+ VS2022编译 FFmpeg6.0 静态库
    • Twikoo
    • Giscus
    目录