1、SDP协议简介

SDP(Session Description Protocol)是为了描述多媒体会话而设计的,主要用来描述会话通告,会话邀请或者其他形式的多媒体会话初始化。为了初始化多媒体会话,需要对参与者提供媒体信息、传输地址以及其他与会话有的描述性的源数据,SDP为了描述这些信息提供了一个标准的形式。SDP只是一个单纯的会话描述的格式,他并不包括传输协议,在不同的场合SDP可以应用于不同的传输协议,如SIP,RTP等等;在网络流媒体中,常见于SIP和RTSP使用SDP描述。一般来说,SDP会话描述包含以下基本内容:

  • 会话名字和目的;
  • 会话持续的时间;
  • 会话的媒体类型;
  • 接受这些媒体数据所需的信息,包括地址、端口和格式等。

2、SDP协议会话描述

一个SDP会话描述是通过“application/sdp”来标识的,SDP会话采用UTF8编码,一个SDP会话描述一般包括如下若干行文本形式:
<type>=<value>
其中,type是一个区分大小写的字母的形式,value是一个结构化的文本,其形式取决于type,通常,value是由若干分隔符分开的字段组成,或者是一个字符串,其中“=”两边都不能有空格。一个SDP包含一个会话层部分,后续跟0个或者多个媒体层部分,会话起始于“v=”行,直到第一个媒体层部分。每个媒体层起始于“m=”行,直到下一个媒体层的开始或者直到SDP结束,通常,会话层的属性是全局的,除非媒体层被重写。
SDP会话某些行是必选的,某些行是可选的,但是出现的顺序必须如下所示,可以行用 * 标识。

  • 会话描述:
    v= (协议版本)
    o= (会话标识符)
    s= (会话名称)
    i=* (会话信息)
    u=* (URI标识)
    e=* (邮箱地址)
    p=* (电话号码)
    c=* (连接信息,)
    b=* (带宽信息)
    z=* (时域调整)
    k=* (加密秘钥)
    a=* (0个或者多个会话属性)

  • 时间描述:
    t= (会话有效时间)
    r=* (0个或者多个重复时间)

  • 媒体描述:
    m= (媒体名字和传输地址)
    i=* (媒体标题)
    c=* (连接信息)
    b=* (带宽信息)
    k=* (加密秘钥)
    a=* (媒体属性)

  • 注意:
    <type>的字母为小写字母并且不可扩展,SDP解析器如果碰到不认识的<type>,必须忽略它,属性机制(“a=”)是SDP扩展的主要手段。某些属性是已经被定义好的,而另外的则是在特定应用、媒体格式规范中才进行定义。SDP解析器必须忽略它不认识的属性。

3、关键SDP字段描述

下面对SDP协议各个字段详细介绍:

(1)协议版本(“v=”)

v=0
"v="字段给出了SDP的版本,当前规范的版本是0,这个版本没有小版本号。

(2)源(“o=”)

o=<用户名><会话ID><会话版本><网络类型><地址类型><单播地址>
"o="字段给出了当前会话的发起者,会话标志和版本号的信息。

  • <用户名>:是登陆源主机的用户的名字,如果不能提供,则用"-"表示,用户名不能包含空格。
  • <会话ID>:是一个数字字符串,<用户名><会话ID><网络类型>和<单播地址>这个组合形成了表示该会话的唯一标识,<会话ID>通常使用NTP格式的时间戳标识。
  • <会话版本>:是当前会话描述的版本号,如果当前会话的数据被修改时,这个版本号会递增,同样推荐使用NTP格式的时间戳。
  • <网络类型>:是一个文本字符串,标志当前网络的类型,最初"IN”标识"Internet",未来可能会定义其他的值。
  • <地址类型>:是一个文本字符串,标志当前地址的类型,最初只有"IP4"和"IP6"有定义,未来可能定义其他的值。
  • <单播地址>:是创建会话的主机的地址,可以是域名,也可以是"IP4"或"IP6"IP地址。域名是首先,除非域名不可获得。如果使用IP地址,则需要使用全球唯一的IP地址,不能使用本地IP地址。

(3)会话名字(“s=”)

s=<会话名字>
字段"s="是文本类型的会话名字,每个会话描述有且仅有一个"s="字段,"s="字段不能为空,并且应该为ISO 10646字体。如果一个会话没有有意义的名字,则此字段应该为一个空格。

(4)会话信息(“i=”)

i=<会话描述>
"i="字段提供会话的文本信息,在会话层和媒体层最多出现一次。

(5)统一资源描述(“u=”)

URI是统一资源描述符,用户www的客户端。URI标志的是有关会话信息的外部的一个指针。这个字段是可选的。但是如果一旦出现,就必须先于第一个媒体轨出现,并且不能多于一个。

(6)电子邮件和电话号码(“e=” “p=”)

e=<电子邮件地址>
p=<电话号码>
这两个字段描述了会议拥有者的联系信息。这个并不一定标识的是发起会话的那个人,这两个字段都是可选的,需要注意的是在前一个版本的规范中,这两个字段必须出现一个,但是现在这个版本中,这个限制去掉了。如果出现两个字段,则必须先于第一个媒体轨出现,这两个字段都可以出现多次。

(7)连接信息(“c=”)

c=<网络类型><地址类型><连接地址>
这个字段包含连接数据,一个会话描述必须在每个媒体层都包含"c="字段或者在会话层包含一个"c="字段。如果这两个层都出现的话,则媒体层出现的"c="会覆盖会话层出现的"c="字段的值。

  • <网络类型>:是一个文本字符串,标志当前网络的类型,最初"IN”标识"Internet",未来可能会定义其他的值。
  • <地址类型>:是一个文本字符串,标志当前地址的类型,最初只有"IP4"和"IP6"有定义,未来可能定义其他的值。
  • <连接地址>标志连接的地址,当<连接地址>为IP4或者IP6时,连接的定义如下:
    i)当回话是多播时,地址为多播地址;当会话是单播时,地址为单播地址,并且为媒体数据的原地址。
    ii)如果地址是IPv4,则还需要给出TTL的值,TTL标识包的生存时间,范围是0~255.

(8)带宽(“b=”)

b=<带宽类型>:<带宽值>
这个字段的意识是本会话或者媒体需要占用的带宽

  • <带宽类型>:本规范制定了两种带宽类型,分别如下:
    i)CT(Conference Total)表示多会话广播中会话或者媒体使用的最大带宽建议值,CT值相当于所有会话带宽值。
    ii)AS(Application-Specific)是指具体某个应用程序所占用的总带宽建议值,相当于最大应用程序带宽值,它仅值单媒体在单点所占用的带宽。
  • <带宽值>:单位是kbit/s。

(9)时间信息(“t=”)

t=<起始时间><结束时间>
"t=“子弹标志了会话的起始时间和结束时间,如果会话在不规则的多个时间段内有效,则可能会出现多个字段的"t=”。如果时间段是规则的,则应该使用"r="字段,后面将会介绍。

(10)重复时间(“r=”)

r=<重复的间隔><持续时长><相对起始时间的偏移链表>
字段"r="标志会话的重复时间。例如:一个会话的有效时间为每个星期一早上10点和星期二上午11点,每次持续一个小时,总共三个月。则字段"r="的<起始时间>为第一个星期一的早上10点,<重复间隔>为一个星期,<有效时长>为1个小时,<相对起始时间的偏移链表>为0和25。字段"t="的<结束时间>为三个月后。缺省情况下,单位都为s。
因此"r="和"t="字段如下:
t=3034423619 3042462419
r=604800 3600 0 90000
通常为了紧凑的表示,也可以使用天、小时、分钟为单位例如r=7d 1h 25h

(11)时域(“z=”)

为了在夏令时和标准时间之间转换,有必要知道对基准时间的偏移量。为了标识一个会话在夏天和冬天的一个时间,有必要指出是哪个时域的。"z="字段允许列举一系列基于基准时间的调准时刻及其偏移量。如:
z=2882844526 -1h 2898848070 0
这表示在时刻2882844526,基准时刻需要往前调1个小时;在时刻2898848070则不需要调准。

(12)加密秘钥(“k=”)

k=<方法>
k=<方法>:<秘钥>
如果在一个安全信道上进行传输,则可以通过SDP来传达秘钥,最简单的方式采用字段"k="来协商,不过这种方式已经是不推荐的了。
字段"k="可以在所有媒体轨之前,这表示应用于所有的媒体轨,或者单独用于某个媒体轨,本规范定义了如下几种方式:

  • k=clear:<秘钥>
  • k=base64:<编码后的秘钥>
  • k=uri:<URI,通过此来获得秘钥>

(13)属性(“a=”)

a=<属性>
a=<属性>:<值>
属性是扩展SDP的主要方式,有会话层属性和媒体层属性。会话层的属性应用于所有的媒体轨,媒体层的属性只应用于当前的媒体轨。
属性有两种方式:

  • 特性属性:以a=<特性>表示,比如:a=recvonly
  • 值属性:以a=<属性>:<值>表示,比如:a=orient:landscape
    属性的名字必须使用US-ASCII子集,属性的值是字符串,出了0x00,0x0a,0x0d这是哪个字符外。缺省情况下,会使用UTF-8字体集,这个字段是唯一不受"a=charset"影响的。

(14)媒体描述(“m=”)

m=<媒体类型><端口><协议><格式类型>
一个会话描述可能包括多个媒体描述。每个媒体描述都以"m="字段开始的,结束于下一个"m="或者整个会话结束。

  • <媒体类型>:本规范定义了视频、音频、文本、应用和消息这几种类型。
  • <端口>:被房媒体流的端口,这个字段的意义依赖于"c="字段和<协议>字段。如果不适用连续的端口或者没有按照偶数RTP端口,奇数RTCP端口,则必须使用"a=rtcp:"来标识RTCP的端口。应用程序被发送到一个端口,此端口是一个奇数端口,并且出现”a=rtcp:”行时,此媒体一定不能从RTP端口减一,应用程序必须发送RTP数据到指定的端口,并且发送RTCP到”a=rtcp”属性设定的端口。对于某些应用程序,它们的媒体流通过层级解码发送到单播地址时,它们有必要设定多个传输端口。使用语法和多播地址的方式类似: m= / …。这种场景中,使用的端口依赖于传输协议类型。一些读者可能明白,通常默情况下,RTP使用偶数端口传输数据,它的RTCP使用高一位数的奇数端口控制RTP会话。表示RTP会话数量。
  • <协议>:它是传输协议。这里的传输协议依赖于”c=”行定义的地址类型。目前支持的主要的几个类型包括:UDP,RTP/AVP,RTP/SAVP。这里专门针对媒体格式设定不同的传输协议是因为同一网络协议时,标准的媒体格式可以通过不同的传输协议来进行传输。这样的设定可以支持不同的网络传输和满足不同检测工具部署。
  • <格式类型>:它表示一种媒体格式描述。前面第四个子项或者其他后续子项都表示媒体格式。媒体格式描述的解析依赖于子项的值。如果 子项是”RTP/AVP”或者”RTP/SAVP,媒体格式描述会包含RTP payload 类型号码。当给定了一个payload类型列表时(静态方式,从96-127),这表示所有的媒体格式可以适用于此会话中,但是,通常列表中的第一个格式应该作为此会话默认支持格式。如果payload类型列表是动态的payload类型列表的话,SDP使用”a=rtpmap:”属性来执行一个映射(从RTP payload 类型号码到媒体解码名称),通过媒体类型号码到媒体解码名称的对应关系来确认payload格式。”a=fmtp:” 行可以用来设定具体的媒体格式参数。

3、SDP协议属性

除了我们前面介绍的会话描述和媒体描述说明以外,SDP以支持了特征属性的拓展,通过拓展的属性可以支持更多的属性参数。SDP属性支持了会话级和媒体级属性两种。会话级属性顾名思义,它是针对会话层级的属性,媒体级属性针对媒体属性设置所设置的属性。下面介绍几种常用的扩展属性。

  • a=ptime:包的时长
    这个属性给出了每个媒体包的时长,以毫秒为单位,者通常只用于音频数据,当然如果在其他情况下也有意义,也可以使用。对于解码来说,这不是一个必要的属性,它通常作为编码/打包的时长的建议,这是一个媒体层的属性,不依赖于字符集。
  • a=rtpmap: / [/] 媒体负载匹配属性
    这个属性是用来匹配RTP负载编号和编码负载格式。它也提供时钟频率和编码参数,这是一个媒体层的属性,不依赖于字符集。
  • a=recvonly 只接受模式
    这个属性标志工具应使用只接受模式。这个属性可能术语会话层,也可能属于媒体层,不依赖于字符集。注意,recvonly只用于媒体,不用于控制协议。
  • a=sendonly 只发送模式
    这个属性标志工具应使用只发送模式。在某些情况下,双方通信可能一方只发送,一方只接受,这个时候使用这个参数。这个属性可能术语会话层,也可能属于媒体层,不依赖于字符集。注意,sendonly只用于媒体,不用于控制协议。
    其他的扩展属性请参考RFC4566

4、应用举例

下面是GB28181使用sdp协议发送的数据格式,可以参考上述讲解进行分析:

v=0
o=34020000001320000001 0 0 IN IP4 172.16.10.22
s=Play
c=IN IP4 172.16.10.22
t=0 0
m=video 15062 RTP/AVP 96
a=setup:active
a=sendonly
a=rtpmap:96 PS/90000
a=username:34020000001320000001
a=password:12345678
a=filesize:0
y=0365961830

参考文档:
《RFC4566 https://datatracker.ietf.org/doc/html/rfc4566》

网络流媒体--SDP会话描述协议(RFC-4566)相关推荐

  1. SDP: 会话描述协议(Session Description Protocol)

    会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述. 会话目录用于协助多媒体会议的通告,并为会话参与者传送相关设置信息.SDP 即用于将这种信息传输到接收 ...

  2. 流媒体专家(3)rtsp内嵌的会话描述协议sdp

    文章目录 一 概述 二 sdp规格 三 各个字段的描述 1. Version(必选) 2.origion(必选) 3.Session Name(必选) 4.Connection Data(可选) 5. ...

  3. SDP: Session Description Protocol(会话描述协议) (RFC2327)

    SDP: SessionDescription Protocol(会话描述协议) (RFC2327) 1概述 SDP也是MMUSIC工作组的一个产品,在MBONE内容中用得很多.其目的就是在媒体会话中 ...

  4. 会话描述协议---SDP协议【详解】

    目录 一.SDP协议简介 二.SDP协议格式 三.会话描述参数 1.Version(必选) 2.origion(必选) 3.Session Name(必选) 4.Connection Data(可选) ...

  5. 【SIP教程】 SDP(Session Description Protocol)会话描述协议

    概述 SDP用来描述多媒体会话的应用层控制协议,为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述. 是一个基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛 ...

  6. 网络流媒体--RTP和RTCP协议

    1.RTP和RTCP协议简介 RTP全名是Real-time Transport Protocol(实时传输协议)提供带有实时特性的端对端数据传输服务,RTP 原先的设计是用来满足多参与者的多媒体会议 ...

  7. 会话初始协议SIP与SDP简介

    SIP(Session Initiation Protocol,会话初始协议)是一个控制发起.修改和终结交互式多媒体(音视频.聊天.游戏等)会话的信令协议(RFC 3261).SIP是一个基于文本的协 ...

  8. RTSP、HTTP、HTTPS、SDP四种协议详解

    RTSP.HTTP.HTTPS.SDP四种协议详解 从这篇开始我们将进入流媒体的环节,流媒体在android中有nuplayer来实现的,在开始讲解android流媒体前,我们先来讲讲流媒体传输协议, ...

  9. 会话初始协议---SIP协议【详解】

    目录 ​ 一.SIP协议简介 二.SIP消息的两种会话模式 1.Session Model 2.Pager Model 三.SIP消息体格式 1.请求行(request-line) 2.状态行(sta ...

最新文章

  1. 软件开发环境-工具集
  2. 纪念机器翻译概念的诞生:重新认识瓦伦·韦弗先生
  3. 嵌套 思维导图_工作小Tips:如何用思维导图来整理你的汇报
  4. 什么命令看服务器系统,查看linux系统版本可以使用什么命令_网站服务器运行维护...
  5. python错误代码提示手册_python学习手册笔记——33.异常编码细节
  6. AAAI 2022 | 北航提出基于特征纯化的视线估计算法,让机器更好地“看见”
  7. .NET UIAutomation实现Word文档加密暴力破解
  8. Sharepoint学习笔记—Ribbon系列-- 3.在Ribbon中找到正确的Location
  9. 《R与Hadoop大数据分析实战》一1.1 安装R
  10. vue选项卡切换,某个组件缓存数据keep-alive demo
  11. 2021-05-15 Nginx面试题
  12. 书籍新增类别下拉框上下架
  13. pythonlocust使用技巧_python locust 性能测试:HOOKS钩子方法
  14. 如何线上推广引流?百度知道实现精准引流
  15. consul - Go服务发现、配置管理中心服务
  16. vue element 确认弹框中显示图片(message里)
  17. mysql集群 solr_Solr单机部署和集群部署
  18. 利用 tesseract 自动识别图片中的文字
  19. 移植GRBL控制器到ESP32实现写字机器人
  20. 新年签通用php,C#开发微信门户及应用微信现金红包的封装及使用

热门文章

  1. 白中英计算机组成原理第五版视频,白中英《计算机组成原理》第5版考研教材及真题视频讲解...
  2. 云交易所已成资金盘、杀猪盘重灾区,曾被寄予厚望,如今罪恶丛生
  3. 油猴脚本、常用拓展的教程
  4. 解决安装VC6.0后出现MSDEV.EXE错误,无法用打开工程解决方法
  5. R语言查看版本 R包查看版本
  6. 【网络】访问控制列表 ACL
  7. python语言程序设计实践教程答案实验六_Python语言程序设计实验指导与习题--详细介绍...
  8. Proteus软件下载安装(包含win10安装proteus8.0+报错问题解决)
  9. MySQL sql语句获取当前日期|时间|时间戳
  10. Android物联网应用程序开发(智慧园区)—— 图片预览界面