会话描述协议(SDP)协议解析

SDP协议是对SIP协议细节上的描述,如RTP负载类型、地址和端口。SDP在RFC2327中有详细描述。

1.SDP的结构

SDP仅仅提供了描述从会话信息到可能的会话参与者的格式。一个会话基本上有许多媒体流组成,因此,会话描述包含了许多与每个媒体流相关的参数说明,此外还包括与会话整体相关的通用信息。所以,SDP消息中既包含了会话级参数又包括了媒体级参数。会话级参数包括如下信息,如会话名称、会话发起者以及会话活动时间。媒体级参数包括媒体类型、端口号、传输协议以及媒体格式。下图描述了SDP消息的基本结构。

图片

SDP仅仅提供了对会话的描述,没有提供将会话和可能的参与者联系起来的方法,所以必须把SDP与其他协议(如SIP协议)联系起来使用。SDP协议同SIP协议一样基于文本的协议,需要使用特定的编码集。字段名称只能使用US-ASCII字符集,文本信息可以使用任何语言。由于SDP的ASCII编码比二进制编码占用带宽多,所以SDP采用紧凑格式提高带宽利用率。如v=version,s=session name等等。

SDP采用多文本行传递会话信息,每行使用“字段名=字段值”的格式。字段名只用一个字符表示(大小写敏感),字段值可以有多个信息块组成,用分号隔开,“=”左右不能有空格。

2. SDP语法

会话级别字段必须放在前面,然后才是媒体级参数,会话数据与媒体数据之间的界限就是第一个媒体描述字段(m=)的出现,之后的每个媒体描述字段的出现标志着这个会话中又一个媒体流数据的开始。

SDP字段包括必必需字段与可选字段。

2.1 必需字段

  • v=(协议版本号),一个会话描述的开始,前一个会话结束标志。


  • o=(会话源或者会话生成者,以及会话标识符)


  • s=(会话名称)这个字段是个文本字符串,可以显示给会话参与者。


  • t=(会话时间)这个字段指明会话开始时间与结束时间。


  • m=(媒体)该字段用来指明媒体类型、数据应该发送到的传输端口,传输协议(例如RTP)以及媒体格式(例如RTP负载格式)


2.2 可选字段

SDP可选字段中,一些只能应用于会话级,一些只能应用于媒体级,还有一些可以应用于两种级别。对于应用于两种级别的字段,在某个具体媒体上,应用于媒体级的字段会覆盖应用于会话级的字段值。例如,某个字段其会话级的字段值为X,媒体1的该字段值为Y,那么值X应用于会话中除媒体类型1之外的所有媒体,而媒体1应用值Y.

可选字段如下:

  • i=(会话信息)对字段的文本描述,提供了比会话名称更多的信息。该字段既可以用于会话级也可以用于媒体级。


  • u=(描述的URI地址)URI信息,通过这个地址可以获取更多会话相关信息。例如,一个会议可能公布在WEB页面上,所以需要该WEB的URI。每个会话只能提供一个URI


  • E=(E-mail地址)负责会话个体的E-mail地址,可以有多个。只能用于会话级别。


  • p=(电话号码)同email一样,多个,会话级别。


  • c=(连接信息)该字段提供连接数据,包括连接类型、网络类型和连接地址。可应用于会话级也可以用于媒体级。


  • b=(带宽信息)指明带宽需求,单位kbit/s, 可用于两个级别


  • r=(重复次数)如果是有规律的日程安排活动,这个字段用来指明会话重复频次和时间。


  • z=(时区调整)用于按日程安排的有规律活动会话。会话可能会夸时区,避免时区变更造成的混乱。


  • k=(加密密钥)为了对媒体加密、解密,该字段提供了一个加密密钥或者规定了一个获取密钥的机制。可用于两个级别。


  • a=(属性)用于描述会话或者某个媒体的额外属性。


可选字段中,连接信息字段是特别与条件相关的。因为该字段定义了数据应发送到的网络地址,所以必须被包含进会话描述中的某个地方。

2.3 字段顺序

因为有些字段既可以应用于会话级又可以用于媒体级,所以字段顺序对于避免含义模糊特别重要。SDP所要求的字段顺序如下:

会话级

协议版本号(v)

会话源(o)

会话名称(s)

会话信息(i)(可选)

URI(u)(可选)

E-mail地址(e)(可选)

电话号码(p)(可选)

连接信息(c)(可选)

带宽信息(b)

时间描述(t)

重复信息(r)(可选)

时区调整(z)(可选)

加密密钥(k)(可选)

属性(a)(可选)

媒体级

媒体描述(m)

媒体信息(i)(可选)

连接信息(c)(会话级进行了规定,这里可选)

带宽信息(b)(可选)

加密密钥(k)(可选)

属性(a)(可选)

2.4 子字段

在SDP中许多字段采用多个子字段的形式,此时,这些字段值由多个以空格符间隔的多个值组成。格式如下:

字段 名称=<子字段1的值> <子字段2的值> <子字段3的值>

下面举例说明比较重要的字段

  • 会话源(o) 


有6个子字段:用户名、会话ID、版本、网络类型、地址类型、地址。

  • 连接信息


连接数据有3个子字段:网络类型、地址类型和连接地址。同会话源中含义不同,他们表示需要接收媒体数据的网络和地址,而不是生成会话的网络和地址。


  • 媒体信息


媒体信息(m)有四个子字段:媒体类型、端口、传输协议、格式。

媒体类型可以是音频、视频、应用程序、数据或控制,如果是语音,媒体类型就是音频。

端口指明媒体要发送到的端口号,端口号与所有的连接类型和传输协议有关。例如VoIP,媒体通常在UDP传输协议上采用RTP承载,这样端口号将是1024和65535之间的一个偶数值。相应奇数对应RTCP端口号。

格式子字段列出了所支持的所有不同类型的媒体格式。优先使用靠前的格式。

如某个系统准备在端口45678接收语音,并且只能处理G.711 u编码的语音,那么RTP负载类型为0,媒体信息如下:

如果某个系统准备在端口45678可以处理几种编码的语音:G.728编码格式(负载类型为15)、GSM编码格式(负载类型为3)、G.711 u编码格式(负载类型为0),而且系统优先采用G.728格式,则相应的媒体信息如下所示:

  • 属性(a)


属性可以描述额外信息,可应用于会话级,也可用于媒体级或者两者兼有。

属性有两种形式,第一种是特征属性,第二种属于值属性。SDP描述了多个建议属性。

表明会话描述的发送者只希望发送数据而不打算接收数据,端口号无意义,可以置为0。

表明这个会话描述的发送者只想接收数据而不打算发送数据。

orient值属性,用于一个共享白板会话,指出这个白板是面向portrait(人物肖像)的还是面向landscape(风景)的。

例如a=rtpmp:<负载类型><编码名称>/<时钟速率>[<编码参数>]

rtpmap属性提供了一个在VoIP应用中的重要属性使用方法,该属性可用于媒体流,在媒体格式不是静态的RTP负载类型时特别有用。

严格来说,“rtpmap”只在使用动态负载类型情况下才是必须的,例如标准的G.711语音是静态RTP负载类型,采用如下方法就可以对它完整描述:

而对动态负载来说需要指定更多信息才能使远端完全识别到媒体编码,例如16位线性编码16kHz取样的立体声音就是一个动态RTP负载类型,如果我们采用动态负载类型98表示这个媒体流,那么SDP格式如下:

SIP建议无论是静态负载还是动态负载,尽量都要采用该属性。

参考链接:

sdp协议介绍

https://www.cnblogs.com/idignew/p/7249056.html

sdp协议

https://www.jianshu.com/p/94b118b8fd97

SDP协议详细总结

https://blog.csdn.net/jobbofhe/article/details/78477407

 干货.学习.交流

欢迎扫码关注

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/93806.html

(0)
联系我们
联系我们
分享本页
返回顶部