天天看點

SDP協定分析

一、SDP協定介紹

SDP 完全是一種會話描述格式 ― 它不屬于傳輸協定 ― 它隻使用不同的适當的傳輸協定,包括會話通知協定(SAP)、會話初始協定(SIP)、​​實時流協定(RTSP)、​​MIME 擴充協定的電子郵件以及超文本傳輸協定(HTTP)。SDP協定是也是基于文本的協定,這樣就能保證協定的可擴充性比較強,這樣就使其具有廣泛的應用範圍。SDP 不支援會話内容或媒體編碼的協商,是以在流媒體中隻用來描述媒體資訊。媒體協商這一塊要用​​RTSP​​來實作.

二、SDP協定格式

SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個字母,<值>是結構化的文本串,其格式依<類型>而定。

<type>=<value>[CRLF]

常見的fields有:

​​

SDP協定分析

​​

​​

SDP協定分析

​​

​​

SDP協定分析

​​

三、SDP協定例子:

下面是一個helix 流媒體伺服器的RTSP協定中的SDP協定:

v=0 //SDP version

// o field定義的源的一些資訊。其格式為:o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=<No title>

i=<No author> <No copyright>  //session的資訊

c=IN IP4 0.0.0.0 //connect 的資訊,分别描述了:網絡協定,位址的類型,連接配接位址。

c=IN IP4 0.0.0.0

t=0 0 //時間資訊,分别表示開始的時間和結束的時間,一般在流媒體的直播的時移中見的比較多。

a=SdpplinVersion:1610641560 //描述性的資訊

a=StreamCount:integer;2 //用來描述媒體流的資訊,表示有兩個媒體流。integer表示資訊的格式為整數。

a=control:*

a=DefaultLicenseValue:integer;0 //License資訊

a=FileType:string;"MPEG4" 用來描述媒體流的資訊說明目前協商的檔案是mpeg4格式的檔案

a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled"

a=range:npt=0-72.080000  //用來表示媒體流的長度

m=audio 0 ​​RTP​​/AVP 96 //做為媒體描述資訊的重要組成部分描述了媒體資訊的詳細内容:表示session的audio是通過​​RTP​​來格式傳送的,其payload值為96傳送的端口還沒有定。

b=as:24 //audio 的bitrate

b=RR:1800

b=RS:600

a=control:streamid=1  //通過媒體流1來發送音頻

a=range:npt=0-72.080000 //說明媒體流的長度。

a=length:npt=72.080000

a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的資訊,表示音頻為AAC的其sample為32000

a=fmtp:96 profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210 //config為AAC的詳細格式資訊

a=mimetype:string;"audio/MPEG4-GENERIC"

a=Helix-Adaptation-Support:1

a=AvgBitRate:integer;48000

a=HasOutOfOrderTS:integer;1

a=MaxBitRate:integer;48000

a=Preroll:integer;1000

a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC"

a=StreamName:string;"Audio Track"

下面是video的資訊基本和audio的資訊相對稱,這裡就不再說了。

m=video 0 ​​RTP​​/AVP 97

b=as:150

b=RR:11250

b=RS:3750

a=control:streamid=2

a=range:npt=0-72.080000

a=length:npt=72.080000

a=rtpmap:97 MP4V-ES/2500

a=fmtp:97 profile-level-id=1;

a=mimetype:string;"video/MP4V-ES"

a=Helix-Adaptation-Support:1

a=AvgBitRate:integer;300000

a=HasOutOfOrderTS:integer;1

a=Height:integer;240 //影片的長度

a=MaxBitRate:integer;300000

a=MaxPacketSize:integer;1400

a=Preroll:integer;1000

a=Width:integer;320  //影片的寬度

a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC"

a=StreamName:string;"Video Track"

SDP協定學習筆記

在SIP協定的包含的内容是SDP時,應該把Content-Type設定成application/sdp。

SDP:Session Description Protocol

SDP格式:

      Session description

         v=  (protocol version)

         o=  (owner/creator and session identifier)

         s=  (session name)

         i=* (session information)

         u=* (URI of description)

         e=* (email address)

         p=* (phone number)

         c=* (connection information - not required if included in all media)

         b=* (zero or more bandwidth information lines)

         One or more time descriptions ("t=" and "r=" lines, see below)

         z=* (time zone adjustments)

         k=* (encryption key)

         a=* (zero or more session attribute lines)

         Zero or more media descriptions

      Time description

         t=  (time the session is active)

         r=* (zero or more repeat times)

      Media description, if present

         m=  (media name and transport address)

         i=* (media title)

         c=* (connection information - optional if included at

              session-level)

         b=* (zero or more bandwidth information lines)

         k=* (encryption key)

         a=* (zero or more media attribute lines)

以上帶"*"号的是可選的,其餘的是必須的。一般順序也按照上面的順序來排列。

a=*是sdp協定擴充屬性定義,除上面以外的,分解時其它的都可以扔掉。

a=charset屬性指定協定使用的字元集。一般的是ISO-10646。

示例:

v=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

   其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任務建立計算機的位址。

   整個這個屬性,是唯一表示一個任務。

​​[email protected]​​ 或 p=+1 616 555-6011

對于一個任務隻能兩者之中的一個,表示會議控制者的聯系方式。郵件位址可以是[email][email protected][/email] (Jane Doe)形式,括号裡面的是描述聯系人的名稱,或者Jane Doe <[email][email protected][/email]>,前面的是聯系人的名稱。

c=<nettype> <addrtype> <connection-address>

這個連接配接資料,可以是傳話級别的連接配接資料,或者是單獨一個媒體資料的連接配接資料。在是多點傳播時,connection-address就該是一個多點傳播組位址,當是單點傳播時,connection-address就該是一個單點傳播位址。對于addrtype是IP4的情況下,connection-address不僅包含IP位址,并且還要包含a time to live value(TTL 0-255),如:c=IN IP4 224.2.36.42/128,IP6沒有這個TTL值。還允許象這樣的<base multicast address>[/<ttl>]/<number of addresses>格式的connection-address。如:c=IN IP4 224.2.1.1/127/3等同于包含c=IN IP4 224.2.1.1/127, c=IN IP4 224.2.1.2/127, c=IN IP4 224.2.1.3/127三行内容。

b=<bwtype>:<bandwidth> bwtype可以是CT或AS,CT方式是設定整個會議的帶寬,AS是設定單個會話的帶寬。預設帶寬是千比特每秒。

t=<start-time> <stop-time>,這個可以有行,指定多個不規則時間段,如果是規則的時間段,則r=屬性可以使用。start-time和stop- time都遵從NTP(Network Time Protocol),是以秒為機關,自從1900以來的時間。要轉換為UNIX時間,減去2208988800。如果stop-time設定為0,則會話沒有時間限制。如果start-time也設定為0,則會話被認為是永久的。

r=<repeat-interval> <active duration> <offsets from start-time>重複次數在時間表示裡面可以如下表示:

      d - days (86400 seconds)

      h - hours (3600 seconds)

      m - minutes (60 seconds)

      s - seconds (allowed for completeness)

z=<adjustment time> <offset> <adjustment time> <offset> ....

k=<method>

k=<method>:<encryption key>

a=<attribute>

a=<attribute>:<value>

m=<media> <port> <proto> <fmt> ...

m=<media> <port>/<number of ports> <proto> <fmt> ...

其中:<media>可以是,"audio","video", "text", "application" and "message"。<port>是媒體傳送的端口号,它依賴于c=和<proto>。<proto> 可以是,udp,RTP/AVP和RTP/SAVP。

a=cat:<category>分類,根據分類接收者隔離相應的會話

a=keywds:<keywords>關鍵字,根據關鍵字隔離相應的會話

a=tool:<name and version of tool>建立任務描述的工具的名稱及版本号

a=ptime:<packet time>在一個包裡面的以毫秒為機關的媒體長度

a=maxptime:<maximum packet time>以毫秒為機關,能夠壓縮進一個包的媒體量。

a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding   parameters>]

a=recvonly

a=sendrecv

a=sendonly

a=inactive,

a=orient:<orientation>其可能的值,"portrait", "landscape" and "seascape" 。

a=type:<conference type>,建議值是,"broadcast", "meeting", "moderated", "test" and "H332"。

a=charset:<character set>

a=sdplang:<language tag>指定會話或者是媒體級别使用的語言

a=framerate:<frame rate>設定最大視訊幀速率

a=quality:<quality>值是0-10

a=fmtp:<format> <format specific parameters>

在SIP協定的包含的内容是SDP時,應該把Content-Type設定成application/sdp。

SDP(Session Description Protocol)模型介紹

如果有哪裡描述有誤,或不準确,歡迎各位網友指正,可以及時讨論并修正。

情态動詞術語解釋:

"MUST",必須、一定要;

"MUST NOT",禁止;

"REQUIRED",需要;

"SHALL"、"SHOULD",應該;

"SHALL NOT"、"SHOULD NOT",不應該;

"RECOMMENDED",推薦;

"MAY",可以

以上情态動詞術語可參考RFC2119[3],這些動詞要求我們在産品實作時,需要遵守或靈活變更限制。

術語

媒體流(Media Stream),或稱為媒體類型(Media Type),即我們通常所說的音頻流、視訊流等,所有通信實體要進行媒體互動之前都必須進行媒體注的協商

媒體格式(Media Format),每種媒體流都有不同的編碼格式,像音頻有G711、G712編碼,視訊有H261、H264等,像現在所謂的高清視訊采用是720P、1070P等。

單一會話(Unitcast Session)

多會話(Multicast Sessions)

單一媒體流(Unitcast Streams)

多媒體流(Multicast Streams)

SDP(Session Description Protocol)

SDP(會話描述協定),用于兩個會話實體之間的媒體協商,并達成一緻,屬信令語言族,采用文本(字元)描述形式。rfc3264協定[1]主要概述一個請求/響應模型(offer/answer,以下叙述采用英文),包括請求/響應的實體和不同階段的操作行為,如初始協商過程和重協商過程,并簡單介紹消息中各種參數的含義。具體各個參數的詳細說明見rfc2327協定[2]。本文主要參照3264協定,大部分為直譯,附加自己經驗和了解。

圖1 SDP模型組網圖

1實體、消息

Offer/Answer模型包括兩個實體,一個是請求主體Offerer,另外一個是響應實體Answerer,兩個實體隻是在邏輯上進行區分,在一定條件可以轉換。例如,手機A發起媒體協商請求,那麼A就是Offerer,反之如果A為接收請求則為Offerer。

Offerer發給Answerer的請求消息稱為請求offer,内容包括媒體流類型、各個媒體流使用的編碼集,以及将要用于接收媒體流的IP和端口。

Answerer收到offer之後,回複給Offerer的消息稱為響應,内容包括要使用的媒體編碼,是否接收該媒體流以及告訴Offerer其用于接收媒體流的IP和端口。

2 SDP各個參數簡單介紹

下面示例摘自3264協定[1]

v=0                                                                              

o=carol 28908764872 28908764872 IN IP4 100.3.6.6        //會話ID号和版本

s=-                                     //用于傳遞會話主題

t=0 0                                   //會話時間,一般由其它信令消息控制,是以填0

c=IN IP4 192.0.2.4              //描述本端将用于傳輸媒體流的IP

m=audio 0 RTP/AVP 0 1 3     //媒體類型 端口号 本端媒體使用的編碼辨別(Payload)集

a=rtpmap:0 PCMU/8000 //rtpmap映射表,各種編碼較長的描述參數,包括使用帶寬(bandwidth)

a=rtpmap:1 1016/8000

a=rtpmap:3 GSM/8000

a=sendonly     //說明本端媒體流的方向,取值包括sendonly/recvonly/sendrecv/inactive

a=ptime:20                           //說明媒體流打包時長

m=video 0 RTP/AVP 31 34

a=rtpmap:31 H261/90000

a=rtpmap:34 H263/90000

3 實體行為、操作過程

3.1 初始協商的Offer請求

實體A <-> 實體B,實體首先發起Offer請求,内容如2節所示,對于作何一個媒體流/媒體通道,這時實體A必須:

a.       如果媒體流方向标為recvonly/sendrecv,即a=recvonly或a=sendrecv,則A必須(MUST)準備好在這個IP和端口上接收實體B發來的媒體流;

b.       如果媒體流方向标為sendonly/inactive,即a=recvonly或a=sendrecv,則A不需要進行準備。

3.2 Answer響應

實體B收到A的請求offer後,根據自身支援的媒體類型和編碼政策,回複響應。

a. 如果實體B回複的響應中的媒體流數量和順序必須(MUST)和請求offer一緻,以便實體A進行甄别和決策。即m行的數量和順序必須一緻,B不能(MUST NOT)擅自增加或删除媒體流。如果B不支援某個媒體流,可以在對應的端口置0,但不能不帶這個m行描述。

b. 對于某種媒體,實體B必須(MUST)從請求offer中選出A支援且自己也支援的該媒體的編碼辨別集,并且可以(MAY)附帶自己支援的其它類型編碼。

c. 對于響應消息中各個媒體的方向:

如果請求某媒體流的方向為sendonly,那麼響應中對應媒體的方向必須為recvonly;

如果請求某媒體流的方向為recvonly,那麼響應中對應媒體的方向必須為sendonly;

如果請求某媒體流的方向為sendrecv,那麼響應中對應媒體的方向可以為sendrecv/sendonly/recvonly/inactive中的一種;

如果請求某媒體流的方向為inactive,那麼響應中對應媒體的方向必須為inactive;

d.       響應answer裡提供IP和端口,訓示Offerer本端期望用于接收媒體流的IP和端口,一旦響應發出之後,Offerer必須(MUST)準備好在這個IP和端口上接收實體A發來的媒體流。

e.       如果請求offer中帶了ptime(媒體流打包廂隔)的a行或帶寬的a行,則響應answer也應該(SHOULD)相應的攜帶。

f.        實體B Offerer應該(SHOULD)使用實體A比較期望的編碼生成媒體流發送。一般來說對于m行,如m=video 0 RTP/AVP 31 34,排充越靠前的編碼表示該實體越希望以這個編碼作為載體,這裡示例31(H261),34(H263)中H261為A更期望使用的編碼類型。同理,當實體A收到響應answer後也是這樣了解的。

3.3 實體收到響應後的處理

當實體A收到B回複的響應後,可以(MAY)開始發送媒體流,如果媒體流方向為sendonly/sendrecv,

a.       必須(MUST)使用answer列舉的媒體類型/編碼生成媒體發送;

b.       應該(SHOULD)使用answer中的ptime和bandwidth來打包發送媒體流;

c.       可以(MAY)立即停止監聽端口,該端口為offer支援answer不支援的媒體所使用的端口。

4 修改媒體流(會話)

修改媒體流的offer-answer操作必須基于之前協商的媒體形式(音頻、視訊等),不能(MUST NOT)對已有媒體流進行删減。

4.1 删除媒體流

如果實體認定新的會話不支援之前媒商的某個媒體,新的offer隻須對這種媒體所在m行的端口置0,但不能不描述這種媒體,即不帶對應m行。當answerer收到響應之後,處理同初始協商一樣。

4.2 增加媒體流

如果實體打算新增媒體流,在offer裡隻須加上描述即可或者占用之前端口被置0的媒體流,即用新的媒體描述m行替換舊的。當answerer收到offer請求後,發現有新增媒體描述,或者過于端口被置0的媒體行被新的媒體描述替換,即知道目前為新增媒體流,處理同初始協商。

4.3 修改媒體流

修改媒體注主要是針對初始協商結果,如果有變更即進入修改流程處理,可能的變更包括IP位址、端口,媒體格式(編碼),媒體類型(音、視訊),媒體屬性(ptime,bandwidth,媒體流方向變更等)。

參考文檔

[1] RFC3264,An Offer/Answer Model with the Session Description Protocol (SDP)

[2] RFC2327,SDP: Session Description Protocol

[3] RFC2119,Key words for use in RFCs to Indicate Requirement Levels

SDP: Session Description Protocol(會話描述協定)

(RFC2327)

1. 概述

SDP也是MMUSIC工作組的一個産品,在MBONE内容中用得很多。其目的就是在媒體會話中,傳遞媒體流資訊,允許會話描述的接收者去參與會話。 SDP基本上在internet上工作。他定義了繪畫描述的統一格式,但并不定義多點傳播位址的配置設定和SDP消息的傳輸,也不支援媒體編碼方案的協商,這些功能均由下層傳送協定完成.典型的會話傳送協定包括:SAP(Session Announcement Protocol 會話公告協定),SIP,RTSP,HTTP,和使用MIME的E-Mail.(注意:對SAP隻能包含一個會話描述,其它會話傳誦協定的SDP可包含多個繪畫描述)

SDP包括以下一些方面:

1) 會話的名稱和目的

2) 會話存活時間

3) 包含在會話中的媒體資訊,包括:

媒體類型(video, audio, etc)

傳輸協定(RTP/UDP/IP, H.320, etc)

媒體格式(H.261 video, MPEG video, etc)

多點傳播或遠端(單點傳播)位址和端口

4) 為接收媒體而需的資訊(addresses, ports, formats and so on)

5) 使用的帶寬資訊

6) 可信賴的接洽資訊(Contact information)

2. 協定

Session description //格式及舉例

v=   (protocol version) //v=0

       o=   (owner/creator and session identifier). //o=<使用者名><會話id><版本><網絡類

//型><位址類型><位址>

//o=sname 1234567890 0987654321 IN

//IP4 126.15.64.3

       s=   (session name) //會話名

       i=* (session information) //會話資訊

       u=* (URI of description) //u=http://www.zte.com.cn/staff/sdp.ps

       e=* (email address) //[email protected](general text如:王生)

//或e=Mr. Wang<[email][email protected][/email]>

       p=* (phone number) //p=+86-0755-26773000-7110(wang)

//or p=+1 617 253 6011

       c=* (connection information -如已經包含在所有媒體中則該行不需要)

//c=<網絡類型><位址資訊><連接配接位址>

//多點會議包括TTL

//連接配接位址: <base multicast

//address>/<ttl>/<number of addresses>

//c=IN IP4 224.2.13.23/127

//c=IN IP4 224.2.1.1/127/3

       b=* (bandwidth information) //b=<修改量(CT Conference Total

//IAS Application-specific Max)>:<帶寬

//值(kb/s)>

//b=CT:120

One or more time descriptions (see below)

       z=* (time zone adjustments) //時區調整

       k=* (encryption key) //k=<方法>:<密鑰>或k=<方法>

       a=* (zero or more session attribute lines) //a=<屬性>   或a=<屬性>:<值>

Zero or more media descriptions (see below)

各行嚴格按順序,其中:

時間描述:

       t=   (time the session is active) //<開始時間><結束時間>,機關秒,十

//進制NTP

//t=2873397468 2873404969

       r=* (zero or more repeat times) //<重複時間><活動持續時間

//以開始時刻為參考的偏移清單>機關秒

//r=604800 3666 90000 或寫成

//r=7d 1h 0 25h

媒體描述:

       m=   (media name and transport address) //m=<媒體><端口><傳送><格式清單>

//m=audio 49170 RTP/AVP 0 3

//協定為RTP,剖面為AVP

//參考rtp-parameters.txt

       i=* (media title媒體稱呼) //

       c=* (connection information – 如已經包含在會話級描述則為可選)

       b=* (bandwidth information) //同c

       k=* (encryption key) //會話級為摸認值,同c

       a=* (zero or more media attribute lines) //兩種形式:(也同c)(見後說明)

//a=<attribute>如:

// a=recvonly

//a=<attribute>:<value>

注:v,o,s,t,m為必須的,其他項為可選。

如果SDP文法分析器不能識别某一類型(Type),則整個描述丢失;

如果”a=”的某屬性值不了解,則予以丢失

整個協定區分大小寫

“=”兩側不允許有空格

會話級的描述就是媒體級描述的預設值

所有均格式為<type>=<value>

3. SDP在IP電話中的使用

SDP用于建構INVITE和200 OK響應消息的消息體,供主\被叫使用者交換媒體資訊.

1. 媒體流的配置

1) 主被叫的媒體描述必須完全對應:主被叫的第n個媒體流(“m=”)對應,都包含”a=rtpmap”.這樣的目的是易于适應靜态淨荷類型到動态淨荷類型的轉換.

2) 如被叫不想接收主叫提出的某個媒體流則在響應中設定該媒體流的端口号為0.并且,必須傳回對應的媒體流行.

2. 單點傳播SDP值的設定

1) 對于隻發媒體流,端口号無意義,應設為0.

2) 每個媒體流的淨載荷類型例表應傳送兩個資訊:能接受/發送的編譯碼,和用以辨別這些編譯碼的RTP淨載荷類型号.

3) 如對于某一媒體流,主/被叫沒有公共的媒體格式,被叫仍然要求傳回媒體流的”m=”行,端口好為0,同時,不列淨載荷類型.

4) 如果所有媒體流均無公共的媒體格式,則被叫回送400響應(壞請求),并加入304警告頭字段(無媒體類型)

3. 多點傳播操作

1) 接受和發送的多點傳播位址是相同的

2) 被叫不允許改變媒體流的隻發,隻收,或收/發特性

3) 如果被叫不支援多點傳播,則回送400響應和330警告(多點傳播不可用)

4. 延時媒體流

由于主叫可能實際上是一個和其他協定(如H.323)互同的協定的網關,與S其互同的協定要求呼叫建立後進行媒體協商.這樣,主叫可以先發不帶SDP的INVITE,呼叫建立後可以通過ACK或重新發一個INVITE請求修改被叫的會話描述(SDP).

5. 媒體流保持

如果要求對方進入HOLD,即暫時停止發送一個或多個媒體流,這可以用Re-INVITE,其會話描述和原來的請求或響應中的描述相同,隻是,”c=”行中的保持媒體流的位址置為”0.0.0.0”,還有就是Re_INVITE中的Cseq得遞增.

6. 對應于SIP中有3個實體字段:

1) Content-Type: 指明消息體類型,有兩種:

i. Application/sdp:表示是SDP會話描述

ii. Text/html:表示是普通文本或HTML格式的描述

2) Content-Encoding:補充說明消息體類型,使使用者可以采用壓縮編碼編輯消息體

3) Content-Length:給出消息體的位元組數

7. SDP各type的詳細解釋:

協定版本 v = SDP版本目前為0,沒有子版本

會話源 o = <使用者名>使用者在發起主機上登入名,如果主機不支援使用者辨別的概念,則為”-”

<會話id>一般為數字串,其配置設定由建立工具決定,建議用網絡時間協定(NTP)時

戳,以確定唯一性.

<版本>該會話公告的版本,供公告代理伺服器檢測同一會話的若幹個公告哪個

是最新公告.基本要求是會話資料修改後該版本值遞增,建議用NTP時戳

<網絡類型>為文本串”IN”

<位址類型>”IP4”(可為域名或點分十進制)/”IP6”(域名或壓縮文本位址形式)

<位址>

會話名 s= ISO 10646字元表示的會話名

會話資訊   v= ISO 10646字元表示的會話資訊

URI    u= 能提供會議進一步資訊的URI位址

E妹位址   e= 給出會議負責人的聯系資訊,他不一定是建立會議公告的人

電話号碼   p= 給出會議負責人的聯系資訊,他不一定是建立會議公告的人(國際通用形式)

連接配接資料   c=媒體連接配接資料,會話級為媒體級的摸認值

帶寬    b= 給出會話或媒體所用帶寬,機關為kbit/s.修飾語:CT(會議總帶寬,表示所有

地點所有媒體的總帶寬),AS(應用特定最大帶寬,表示一個地點單一媒體帶寬)

時間描述   t= 見上

   r= 見上

時區調整   z= 見上

加密密鑰    k=已定義的方法有

      k=clear:<加密密鑰>密鑰沒有變換

k=base64:<編碼密鑰>已編碼,因為它含有SDP禁用的字元

k=uri:<獲得密鑰的URI>

k=prompt。SDP沒有提供密鑰但該會話或媒體流是要求加密的。

屬性    a=一個m=行可有多個a=行,SDP建議擴充如下:(具體見[1].Page419)

會話級: a=cat:<類别>//給出點分層次式會話分類号,供接收方篩選會話

a=keywds:<關鍵詞>//供接收方篩選會話

a=tool:<工具名和版本号>//建立會話描述的工具名和版本号

a=recvonly/sendrecv/sendonly//收發模式

a=type:<會議類型>//有:廣播,聚會,主席主持,測試,H.323

a=charset:<字元集>//顯示會話名和資訊資料的字元集

a=sdplang:<語言标記>//描述所有語言

a=lang:<語言标記>//會話描述的預設語言或媒體描述的語言

a=framerate:<幀速率>//機關:幀/秒

a=quality:<品質>//視訊的建議品質(10/5/0)

a=fmtp:<格式>< 格式特定參數>//定義指定格式的附加參數

媒體級:a=ptime:<分組時間>//媒體分組的時長(機關:秒)

a=recvonly/sendrecv/sendonly//收發模式

a=orient:<白闆方向>//指明白闆在屏莫上的方向

a=sdplang:<語言标記>//描述所有語言

a=lang:<語言标記>//會話描述的預設語言或媒體描述的語言

媒體描述     m= <媒體>有5種類型:音頻/視訊/應用(如白闆資訊)/資料(不向使用者顯示的)/控制

<端口>媒體流發往傳輸層的端口。取決于c=行規定的網絡類型和接下來的傳

送層協定:對UDP為1024-65535;對分層編碼應用(c=行沒有多點傳播位址),

要給出多點傳播端口數,如:m=video 49170/2 RTP/AVP 31(表示:端口49170

和49171為第一對RTP/RTCP端口,49172和49173為第二對的端口)。

<傳送層協定>與c=行的位址類型有關。對大多的媒體在RTP/UDP上傳送,定

義2種:RTP/AVP:IETF RTP協定,音/視訊應用文檔。在UDP上傳誦。

Udp:UDP協定。

<格式清單>對音/視訊,就是音/視訊應用文檔中規定媒體淨荷類型。清單中都

有可能用,但第一個為預設值,分為靜态綁定和動态綁定:靜态綁定即使媒體編碼方式有淨荷類型号完全确定,動态綁定則媒體編碼方式如時鐘頻率,音頻信道數等)沒有完全确定,需要進一步的屬性說明。分别舉例如下:

Alaw的PCM編碼單信道Audio,其淨荷類型号為8,把它發往UDP端口49232,則:m=audio 49232 RTP/AVP 8

16bit線性編碼,雙聲道立體聲,抽樣速率16kHz,其動态淨荷類型号98,則:m=audio 49232 RTP/AVP 98

a=rtpmap:98 L16/16000/2

說明:1)a=rtpmap:<淨荷類型号><編碼名>/<時鐘速率>[/<編碼參數>]

    對音頻,編碼參數為音頻信道數;對視訊沒有定義

2)SDP允許rtpmap規定實驗性編碼格式,但編碼名必須以X-起,

表示此格式還沒正式登記。

4. SDP Grammar

announcement =        proto-version

                     origin-field

                     session-name-field

                     information-field

                     uri-field

                     email-fields

                     phone-fields

                     connection-field

                     bandwidth-fields

                     time-fields

                     key-field

                     attribute-fields

                     media-descriptions

proto-version =    "v=" 1*DIGIT CRLF

                     ;this memo describes version 0

origin-field =        "o=" username space

                     sess-id space sess-version space

                     nettype space addrtype space

                     addr CRLF

session-name-field =   "s=" text CRLF

information-field = ["i=" text CRLF]

uri-field =           ["u=" uri CRLF]

email-fields =        *("e=" email-address CRLF)

phone-fields =        *("p=" phone-number CRLF)

connection-field = ["c=" nettype space addrtype space

                     connection-address CRLF]

                     ;a connection field must be present

                     ;in every media description or at the

                     ;session-level

bandwidth-fields = *("b=" bwtype ":" bandwidth CRLF)

time-fields =       1*( "t=" start-time space stop-time

                     *(CRLF repeat-fields) CRLF)

                     [zone-adjustments CRLF]

repeat-fields =    "r=" repeat-interval space typed-time

                     1*(space typed-time)

zone-adjustments = time space ["-"] typed-time

                     *(space time space ["-"] typed-time)

key-field =           ["k=" key-type CRLF]

key-type =          "prompt" |

                     "clear:" key-data |

                     "base64:" key-data |

                     "uri:" uri

key-data =          email-safe | "~" | "

attribute-fields = *("a=" attribute CRLF)

media-descriptions =   *( media-field

                     information-field

                     *(connection-field)

                     bandwidth-fields

                     key-field

                     attribute-fields )

media-field =       "m=" media space port ["/" integer]

                     space proto 1*(space fmt) CRLF

media =             1*(alpha-numeric)

                     ;typically "audio", "video", "application"

                     ;or "data"

fmt =                 1*(alpha-numeric)

                     ;typically an RTP payload type for audio

                     ;and video media

proto =             1*(alpha-numeric)

                     ;typically "RTP/AVP" or "udp" for IP4

port =             1*(DIGIT)

                     ;should in the range "1024" to "65535" inclusive

                     ;for UDP based media

attribute =           (att-field ":" att-value) | att-field

att-field =           1*(alpha-numeric)

att-value =           byte-string

sess-id =          1*(DIGIT)

                     ;should be unique for this originating username/host

sess-version =        1*(DIGIT)

                     ;0 is a new session

connection-address =   multicast-address

                     | addr

multicast-address = 3*(decimal-uchar ".") decimal-uchar "/" ttl

[ "/" integer ]

                     ;multicast addresses may be in the range

                     ;224.0.0.0 to 239.255.255.255

ttl =                 decimal-uchar

start-time =       time | "0"

stop-time =           time | "0"

time =             POS-DIGIT 9*(DIGIT)

                     ;sufficient for 2 more centuries

repeat-interval =     typed-time

typed-time =       1*(DIGIT) [fixed-len-time-unit]

fixed-len-time-unit = "d" | "h" | "m" | "s"

bwtype =              1*(alpha-numeric)

bandwidth =           1*(DIGIT)

username =          safe

                     ;pretty wide definition, but doesn't include space

email-address =    email | email "(" email-safe ")" |

                     email-safe "<" email ">"

email =             ;defined in RFC822

uri=                ;defined in RFC1630

phone-number =        phone | phone "(" email-safe ")" |

                     email-safe "<" phone ">"

phone =             "+" POS-DIGIT 1*(space | "-" | DIGIT)

                     ;there must be a space or hyphen between the

                     ;international code and the rest of the number.

nettype =          "IN"

                     ;list to be extended

addrtype =          "IP4" | "IP6"

                     ;list to be extended

addr =             FQDN | unicast-address

FQDN =             4*(alpha-numeric|"-"|".")

                     ;fully qualified domain name as specified in RFC1035

unicast-address =     IP4-address | IP6-address

IP4-address =       b1 "." decimal-uchar "." decimal-uchar "." b4

b1 =                decimal-uchar

                     ;less than "224"; not "0" or "127"

b4 =                decimal-uchar

                     ;not "0"

IP6-address =       ;to be defined

text =             byte-string

                     ;default is to interpret this as IS0-10646 UTF8

                     ;ISO 8859-1 requires a "a=charset:ISO-8859-1"

                     ;session-level attribute to be used

byte-string =       1*(0x01..0x09|0x0b|0x0c|0x0e..0xff)

                     ;any byte except NUL, CR or LF

decimal-uchar =    DIGIT

                     | POS-DIGIT DIGIT

                     | ("1" 2*(DIGIT))

                     | ("2" ("0"|"1"|"2"|"3"|"4") DIGIT)

                     | ("2" "5" ("0"|"1"|"2"|"3"|"4"|"5"))

integer =          POS-DIGIT *(DIGIT)

alpha-numeric =    ALPHA | DIGIT

DIGIT =             "0" | POS-DIGIT

POS-DIGIT =           "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"

ALPHA =             "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|

                     "l"|"m"|"n"|"o "|"p"|"q"|"r"|"s"|"t"|"u"|"v"|

                     "w"|"x"|"y"|"z"|"A"|"B"|"C "|"D"|"E"|"F"|"G"|

                     "H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|" Q"|"R"|

                     "S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"

email-safe =       safe | space | tab

safe =             alpha-numeric |

                     "'" | "'" | "-" | "." | "/" | ":" | "?" | """ |

                     "#" | "$" | "&" | "*" | ";" | "=" | "@" | "[" |

                     "]" | "^" | "_" | "`" | "{" | "|" | "}" | "+" |

                     "~" | "

space =             %d32

tab =                 %d9

CRLF =             %d13.10

常見的如下:

a=rtpmap:103 ISAC/16000

a=rtpmap:102 iLBC/8000

a=rtpmap:3 GSM/8000

a=rtpmap:106 telephone-event/8000

a=rtpmap:13 CN/8000

a=rtpmap:117 red/8000

a=rtpmap:18 G729a/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:2 G726-32/8000

a=rtpmap:4 G723/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:96 G726-40/8000

a=rtpmap:97 G726-24/8000

a=rtpmap:98 G726-16/8000

a=rtpmap:100 NSE/8000

a=rtpmap:101 telephone-event/8000

a=rtpmap:0 pcmu/8000

a=rtpmap:8 pcma/8000

a=rtpmap:3 gsm/8000

a=rtpmap:18 G729/8000

a=rtpmap:98 iLBC/8000

a=rtpmap:97 speex/8000

a=rtpmap:101 telephone-event/8000

一、SDP協定介紹

SDP 完全是一種會話描述格式 ― 它不屬于傳輸協定 ― 它隻使用不同的适當的傳輸協定,包括會話通知協定(SAP)、會話初始協定(SIP)、​​實時流協定(RTSP)、​​MIME 擴充協定的電子郵件以及超文本傳輸協定(HTTP)。SDP協定是也是基于文本的協定,這樣就能保證協定的可擴充性比較強,這樣就使其具有廣泛的應用範圍。SDP 不支援會話内容或媒體編碼的協商,是以在流媒體中隻用來描述媒體資訊。媒體協商這一塊要用​​RTSP​​來實作.

二、SDP協定格式

SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個字母,<值>是結構化的文本串,其格式依<類型>而定。

<type>=<value>[CRLF]

常見的fields有:

​​

SDP協定分析

​​

​​

SDP協定分析

​​

​​

SDP協定分析

​​

三、SDP協定例子:

下面是一個helix 流媒體伺服器的RTSP協定中的SDP協定:

v=0 //SDP version

// o field定義的源的一些資訊。其格式為:o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=<No title>

i=<No author> <No copyright>  //session的資訊

c=IN IP4 0.0.0.0 //connect 的資訊,分别描述了:網絡協定,位址的類型,連接配接位址。

c=IN IP4 0.0.0.0

t=0 0 //時間資訊,分别表示開始的時間和結束的時間,一般在流媒體的直播的時移中見的比較多。

a=SdpplinVersion:1610641560 //描述性的資訊

a=StreamCount:integer;2 //用來描述媒體流的資訊,表示有兩個媒體流。integer表示資訊的格式為整數。

a=control:*

a=DefaultLicenseValue:integer;0 //License資訊

a=FileType:string;"MPEG4" 用來描述媒體流的資訊說明目前協商的檔案是mpeg4格式的檔案

a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled"

a=range:npt=0-72.080000  //用來表示媒體流的長度

m=audio 0 ​​RTP​​/AVP 96 //做為媒體描述資訊的重要組成部分描述了媒體資訊的詳細内容:表示session的audio是通過​​RTP​​來格式傳送的,其payload值為96傳送的端口還沒有定。

b=as:24 //audio 的bitrate

b=RR:1800

b=RS:600

a=control:streamid=1  //通過媒體流1來發送音頻

a=range:npt=0-72.080000 //說明媒體流的長度。

a=length:npt=72.080000

a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的資訊,表示音頻為AAC的其sample為32000

a=fmtp:96 profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210 //config為AAC的詳細格式資訊

a=mimetype:string;"audio/MPEG4-GENERIC"

a=Helix-Adaptation-Support:1

a=AvgBitRate:integer;48000

a=HasOutOfOrderTS:integer;1

a=MaxBitRate:integer;48000

a=Preroll:integer;1000

a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC"

a=StreamName:string;"Audio Track"

下面是video的資訊基本和audio的資訊相對稱,這裡就不再說了。

m=video 0 ​​RTP​​/AVP 97

b=as:150

b=RR:11250

b=RS:3750

a=control:streamid=2

a=range:npt=0-72.080000

a=length:npt=72.080000

a=rtpmap:97 MP4V-ES/2500

a=fmtp:97 profile-level-id=1;

a=mimetype:string;"video/MP4V-ES"

a=Helix-Adaptation-Support:1

a=AvgBitRate:integer;300000

a=HasOutOfOrderTS:integer;1

a=Height:integer;240 //影片的長度

a=MaxBitRate:integer;300000

a=MaxPacketSize:integer;1400

a=Preroll:integer;1000

a=Width:integer;320  //影片的寬度

a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC"

a=StreamName:string;"Video Track"

SDP協定學習筆記

在SIP協定的包含的内容是SDP時,應該把Content-Type設定成application/sdp。

SDP:Session Description Protocol

SDP格式:

      Session description

         v=  (protocol version)

         o=  (owner/creator and session identifier)

         s=  (session name)

         i=* (session information)

         u=* (URI of description)

         e=* (email address)

         p=* (phone number)

         c=* (connection information - not required if included in all media)

         b=* (zero or more bandwidth information lines)

         One or more time descriptions ("t=" and "r=" lines, see below)

         z=* (time zone adjustments)

         k=* (encryption key)

         a=* (zero or more session attribute lines)

         Zero or more media descriptions

      Time description

         t=  (time the session is active)

         r=* (zero or more repeat times)

      Media description, if present

         m=  (media name and transport address)

         i=* (media title)

         c=* (connection information - optional if included at

              session-level)

         b=* (zero or more bandwidth information lines)

         k=* (encryption key)

         a=* (zero or more media attribute lines)

以上帶"*"号的是可選的,其餘的是必須的。一般順序也按照上面的順序來排列。

a=*是sdp協定擴充屬性定義,除上面以外的,分解時其它的都可以扔掉。

a=charset屬性指定協定使用的字元集。一般的是ISO-10646。

示例:

v=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

   其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任務建立計算機的位址。

   整個這個屬性,是唯一表示一個任務。

​​[email protected]​​ 或 p=+1 616 555-6011

對于一個任務隻能兩者之中的一個,表示會議控制者的聯系方式。郵件位址可以是[email][email protected][/email] (Jane Doe)形式,括号裡面的是描述聯系人的名稱,或者Jane Doe <[email][email protected][/email]>,前面的是聯系人的名稱。

c=<nettype> <addrtype> <connection-address>

這個連接配接資料,可以是傳話級别的連接配接資料,或者是單獨一個媒體資料的連接配接資料。在是多點傳播時,connection-address就該是一個多點傳播組位址,當是單點傳播時,connection-address就該是一個單點傳播位址。對于addrtype是IP4的情況下,connection-address不僅包含IP位址,并且還要包含a time to live value(TTL 0-255),如:c=IN IP4 224.2.36.42/128,IP6沒有這個TTL值。還允許象這樣的<base multicast address>[/<ttl>]/<number of addresses>格式的connection-address。如:c=IN IP4 224.2.1.1/127/3等同于包含c=IN IP4 224.2.1.1/127, c=IN IP4 224.2.1.2/127, c=IN IP4 224.2.1.3/127三行内容。

b=<bwtype>:<bandwidth> bwtype可以是CT或AS,CT方式是設定整個會議的帶寬,AS是設定單個會話的帶寬。預設帶寬是千比特每秒。

t=<start-time> <stop-time>,這個可以有行,指定多個不規則時間段,如果是規則的時間段,則r=屬性可以使用。start-time和stop- time都遵從NTP(Network Time Protocol),是以秒為機關,自從1900以來的時間。要轉換為UNIX時間,減去2208988800。如果stop-time設定為0,則會話沒有時間限制。如果start-time也設定為0,則會話被認為是永久的。

r=<repeat-interval> <active duration> <offsets from start-time>重複次數在時間表示裡面可以如下表示:

      d - days (86400 seconds)

      h - hours (3600 seconds)

      m - minutes (60 seconds)

      s - seconds (allowed for completeness)

z=<adjustment time> <offset> <adjustment time> <offset> ....

k=<method>

k=<method>:<encryption key>

a=<attribute>

a=<attribute>:<value>

m=<media> <port> <proto> <fmt> ...

m=<media> <port>/<number of ports> <proto> <fmt> ...

其中:<media>可以是,"audio","video", "text", "application" and "message"。<port>是媒體傳送的端口号,它依賴于c=和<proto>。<proto> 可以是,udp,RTP/AVP和RTP/SAVP。

a=cat:<category>分類,根據分類接收者隔離相應的會話

a=keywds:<keywords>關鍵字,根據關鍵字隔離相應的會話

a=tool:<name and version of tool>建立任務描述的工具的名稱及版本号

a=ptime:<packet time>在一個包裡面的以毫秒為機關的媒體長度

a=maxptime:<maximum packet time>以毫秒為機關,能夠壓縮進一個包的媒體量。

a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding   parameters>]

a=recvonly

a=sendrecv

a=sendonly

a=inactive,

a=orient:<orientation>其可能的值,"portrait", "landscape" and "seascape" 。

a=type:<conference type>,建議值是,"broadcast", "meeting", "moderated", "test" and "H332"。

a=charset:<character set>

a=sdplang:<language tag>指定會話或者是媒體級别使用的語言

a=framerate:<frame rate>設定最大視訊幀速率

a=quality:<quality>值是0-10

a=fmtp:<format> <format specific parameters>

在SIP協定的包含的内容是SDP時,應該把Content-Type設定成application/sdp。

SDP(Session Description Protocol)模型介紹

如果有哪裡描述有誤,或不準确,歡迎各位網友指正,可以及時讨論并修正。

情态動詞術語解釋:

"MUST",必須、一定要;

"MUST NOT",禁止;

"REQUIRED",需要;

"SHALL"、"SHOULD",應該;

"SHALL NOT"、"SHOULD NOT",不應該;

"RECOMMENDED",推薦;

"MAY",可以

以上情态動詞術語可參考RFC2119[3],這些動詞要求我們在産品實作時,需要遵守或靈活變更限制。

術語

媒體流(Media Stream),或稱為媒體類型(Media Type),即我們通常所說的音頻流、視訊流等,所有通信實體要進行媒體互動之前都必須進行媒體注的協商

媒體格式(Media Format),每種媒體流都有不同的編碼格式,像音頻有G711、G712編碼,視訊有H261、H264等,像現在所謂的高清視訊采用是720P、1070P等。

單一會話(Unitcast Session)

多會話(Multicast Sessions)

單一媒體流(Unitcast Streams)

多媒體流(Multicast Streams)

SDP(Session Description Protocol)

SDP(會話描述協定),用于兩個會話實體之間的媒體協商,并達成一緻,屬信令語言族,采用文本(字元)描述形式。rfc3264協定[1]主要概述一個請求/響應模型(offer/answer,以下叙述采用英文),包括請求/響應的實體和不同階段的操作行為,如初始協商過程和重協商過程,并簡單介紹消息中各種參數的含義。具體各個參數的詳細說明見rfc2327協定[2]。本文主要參照3264協定,大部分為直譯,附加自己經驗和了解。

圖1 SDP模型組網圖

1實體、消息

Offer/Answer模型包括兩個實體,一個是請求主體Offerer,另外一個是響應實體Answerer,兩個實體隻是在邏輯上進行區分,在一定條件可以轉換。例如,手機A發起媒體協商請求,那麼A就是Offerer,反之如果A為接收請求則為Offerer。

Offerer發給Answerer的請求消息稱為請求offer,内容包括媒體流類型、各個媒體流使用的編碼集,以及将要用于接收媒體流的IP和端口。

Answerer收到offer之後,回複給Offerer的消息稱為響應,内容包括要使用的媒體編碼,是否接收該媒體流以及告訴Offerer其用于接收媒體流的IP和端口。

2 SDP各個參數簡單介紹

下面示例摘自3264協定[1]

v=0                                                                              

o=carol 28908764872 28908764872 IN IP4 100.3.6.6        //會話ID号和版本

s=-                                     //用于傳遞會話主題

t=0 0                                   //會話時間,一般由其它信令消息控制,是以填0

c=IN IP4 192.0.2.4              //描述本端将用于傳輸媒體流的IP

m=audio 0 RTP/AVP 0 1 3     //媒體類型 端口号 本端媒體使用的編碼辨別(Payload)集

a=rtpmap:0 PCMU/8000 //rtpmap映射表,各種編碼較長的描述參數,包括使用帶寬(bandwidth)

a=rtpmap:1 1016/8000

a=rtpmap:3 GSM/8000

a=sendonly     //說明本端媒體流的方向,取值包括sendonly/recvonly/sendrecv/inactive

a=ptime:20                           //說明媒體流打包時長

m=video 0 RTP/AVP 31 34

a=rtpmap:31 H261/90000

a=rtpmap:34 H263/90000

3 實體行為、操作過程

3.1 初始協商的Offer請求

實體A <-> 實體B,實體首先發起Offer請求,内容如2節所示,對于作何一個媒體流/媒體通道,這時實體A必須:

a.       如果媒體流方向标為recvonly/sendrecv,即a=recvonly或a=sendrecv,則A必須(MUST)準備好在這個IP和端口上接收實體B發來的媒體流;

b.       如果媒體流方向标為sendonly/inactive,即a=recvonly或a=sendrecv,則A不需要進行準備。

3.2 Answer響應

實體B收到A的請求offer後,根據自身支援的媒體類型和編碼政策,回複響應。

a. 如果實體B回複的響應中的媒體流數量和順序必須(MUST)和請求offer一緻,以便實體A進行甄别和決策。即m行的數量和順序必須一緻,B不能(MUST NOT)擅自增加或删除媒體流。如果B不支援某個媒體流,可以在對應的端口置0,但不能不帶這個m行描述。

b. 對于某種媒體,實體B必須(MUST)從請求offer中選出A支援且自己也支援的該媒體的編碼辨別集,并且可以(MAY)附帶自己支援的其它類型編碼。

c. 對于響應消息中各個媒體的方向:

如果請求某媒體流的方向為sendonly,那麼響應中對應媒體的方向必須為recvonly;

如果請求某媒體流的方向為recvonly,那麼響應中對應媒體的方向必須為sendonly;

如果請求某媒體流的方向為sendrecv,那麼響應中對應媒體的方向可以為sendrecv/sendonly/recvonly/inactive中的一種;

如果請求某媒體流的方向為inactive,那麼響應中對應媒體的方向必須為inactive;

d.       響應answer裡提供IP和端口,訓示Offerer本端期望用于接收媒體流的IP和端口,一旦響應發出之後,Offerer必須(MUST)準備好在這個IP和端口上接收實體A發來的媒體流。

e.       如果請求offer中帶了ptime(媒體流打包廂隔)的a行或帶寬的a行,則響應answer也應該(SHOULD)相應的攜帶。

f.        實體B Offerer應該(SHOULD)使用實體A比較期望的編碼生成媒體流發送。一般來說對于m行,如m=video 0 RTP/AVP 31 34,排充越靠前的編碼表示該實體越希望以這個編碼作為載體,這裡示例31(H261),34(H263)中H261為A更期望使用的編碼類型。同理,當實體A收到響應answer後也是這樣了解的。

3.3 實體收到響應後的處理

當實體A收到B回複的響應後,可以(MAY)開始發送媒體流,如果媒體流方向為sendonly/sendrecv,

a.       必須(MUST)使用answer列舉的媒體類型/編碼生成媒體發送;

b.       應該(SHOULD)使用answer中的ptime和bandwidth來打包發送媒體流;

c.       可以(MAY)立即停止監聽端口,該端口為offer支援answer不支援的媒體所使用的端口。

4 修改媒體流(會話)

修改媒體流的offer-answer操作必須基于之前協商的媒體形式(音頻、視訊等),不能(MUST NOT)對已有媒體流進行删減。

4.1 删除媒體流

如果實體認定新的會話不支援之前媒商的某個媒體,新的offer隻須對這種媒體所在m行的端口置0,但不能不描述這種媒體,即不帶對應m行。當answerer收到響應之後,處理同初始協商一樣。

4.2 增加媒體流

如果實體打算新增媒體流,在offer裡隻須加上描述即可或者占用之前端口被置0的媒體流,即用新的媒體描述m行替換舊的。當answerer收到offer請求後,發現有新增媒體描述,或者過于端口被置0的媒體行被新的媒體描述替換,即知道目前為新增媒體流,處理同初始協商。

4.3 修改媒體流

修改媒體注主要是針對初始協商結果,如果有變更即進入修改流程處理,可能的變更包括IP位址、端口,媒體格式(編碼),媒體類型(音、視訊),媒體屬性(ptime,bandwidth,媒體流方向變更等)。

參考文檔

[1] RFC3264,An Offer/Answer Model with the Session Description Protocol (SDP)

[2] RFC2327,SDP: Session Description Protocol

[3] RFC2119,Key words for use in RFCs to Indicate Requirement Levels

SDP: Session Description Protocol(會話描述協定)

(RFC2327)

1. 概述

SDP也是MMUSIC工作組的一個産品,在MBONE内容中用得很多。其目的就是在媒體會話中,傳遞媒體流資訊,允許會話描述的接收者去參與會話。 SDP基本上在internet上工作。他定義了繪畫描述的統一格式,但并不定義多點傳播位址的配置設定和SDP消息的傳輸,也不支援媒體編碼方案的協商,這些功能均由下層傳送協定完成.典型的會話傳送協定包括:SAP(Session Announcement Protocol 會話公告協定),SIP,RTSP,HTTP,和使用MIME的E-Mail.(注意:對SAP隻能包含一個會話描述,其它會話傳誦協定的SDP可包含多個繪畫描述)

SDP包括以下一些方面:

1) 會話的名稱和目的

2) 會話存活時間

3) 包含在會話中的媒體資訊,包括:

媒體類型(video, audio, etc)

傳輸協定(RTP/UDP/IP, H.320, etc)

媒體格式(H.261 video, MPEG video, etc)

多點傳播或遠端(單點傳播)位址和端口

4) 為接收媒體而需的資訊(addresses, ports, formats and so on)

5) 使用的帶寬資訊

6) 可信賴的接洽資訊(Contact information)

2. 協定

Session description //格式及舉例

v=   (protocol version) //v=0

       o=   (owner/creator and session identifier). //o=<使用者名><會話id><版本><網絡類

//型><位址類型><位址>

//o=sname 1234567890 0987654321 IN

//IP4 126.15.64.3

       s=   (session name) //會話名

       i=* (session information) //會話資訊

       u=* (URI of description) //u=http://www.zte.com.cn/staff/sdp.ps

       e=* (email address) //[email protected](general text如:王生)

//或e=Mr. Wang<[email][email protected][/email]>

       p=* (phone number) //p=+86-0755-26773000-7110(wang)

//or p=+1 617 253 6011

       c=* (connection information -如已經包含在所有媒體中則該行不需要)

//c=<網絡類型><位址資訊><連接配接位址>

//多點會議包括TTL

//連接配接位址: <base multicast

//address>/<ttl>/<number of addresses>

//c=IN IP4 224.2.13.23/127

//c=IN IP4 224.2.1.1/127/3

       b=* (bandwidth information) //b=<修改量(CT Conference Total

//IAS Application-specific Max)>:<帶寬

//值(kb/s)>

//b=CT:120

One or more time descriptions (see below)

       z=* (time zone adjustments) //時區調整

       k=* (encryption key) //k=<方法>:<密鑰>或k=<方法>

       a=* (zero or more session attribute lines) //a=<屬性>   或a=<屬性>:<值>

Zero or more media descriptions (see below)

各行嚴格按順序,其中:

時間描述:

       t=   (time the session is active) //<開始時間><結束時間>,機關秒,十

//進制NTP

//t=2873397468 2873404969

       r=* (zero or more repeat times) //<重複時間><活動持續時間

//以開始時刻為參考的偏移清單>機關秒

//r=604800 3666 90000 或寫成

//r=7d 1h 0 25h

媒體描述:

       m=   (media name and transport address) //m=<媒體><端口><傳送><格式清單>

//m=audio 49170 RTP/AVP 0 3

//協定為RTP,剖面為AVP

//參考rtp-parameters.txt

       i=* (media title媒體稱呼) //

       c=* (connection information – 如已經包含在會話級描述則為可選)

       b=* (bandwidth information) //同c

       k=* (encryption key) //會話級為摸認值,同c

       a=* (zero or more media attribute lines) //兩種形式:(也同c)(見後說明)

//a=<attribute>如:

// a=recvonly

//a=<attribute>:<value>

注:v,o,s,t,m為必須的,其他項為可選。

如果SDP文法分析器不能識别某一類型(Type),則整個描述丢失;

如果”a=”的某屬性值不了解,則予以丢失

整個協定區分大小寫

“=”兩側不允許有空格

會話級的描述就是媒體級描述的預設值

所有均格式為<type>=<value>

3. SDP在IP電話中的使用

SDP用于建構INVITE和200 OK響應消息的消息體,供主\被叫使用者交換媒體資訊.

1. 媒體流的配置

1) 主被叫的媒體描述必須完全對應:主被叫的第n個媒體流(“m=”)對應,都包含”a=rtpmap”.這樣的目的是易于适應靜态淨荷類型到動态淨荷類型的轉換.

2) 如被叫不想接收主叫提出的某個媒體流則在響應中設定該媒體流的端口号為0.并且,必須傳回對應的媒體流行.

2. 單點傳播SDP值的設定

1) 對于隻發媒體流,端口号無意義,應設為0.

2) 每個媒體流的淨載荷類型例表應傳送兩個資訊:能接受/發送的編譯碼,和用以辨別這些編譯碼的RTP淨載荷類型号.

3) 如對于某一媒體流,主/被叫沒有公共的媒體格式,被叫仍然要求傳回媒體流的”m=”行,端口好為0,同時,不列淨載荷類型.

4) 如果所有媒體流均無公共的媒體格式,則被叫回送400響應(壞請求),并加入304警告頭字段(無媒體類型)

3. 多點傳播操作

1) 接受和發送的多點傳播位址是相同的

2) 被叫不允許改變媒體流的隻發,隻收,或收/發特性

3) 如果被叫不支援多點傳播,則回送400響應和330警告(多點傳播不可用)

4. 延時媒體流

由于主叫可能實際上是一個和其他協定(如H.323)互同的協定的網關,與S其互同的協定要求呼叫建立後進行媒體協商.這樣,主叫可以先發不帶SDP的INVITE,呼叫建立後可以通過ACK或重新發一個INVITE請求修改被叫的會話描述(SDP).

5. 媒體流保持

如果要求對方進入HOLD,即暫時停止發送一個或多個媒體流,這可以用Re-INVITE,其會話描述和原來的請求或響應中的描述相同,隻是,”c=”行中的保持媒體流的位址置為”0.0.0.0”,還有就是Re_INVITE中的Cseq得遞增.

6. 對應于SIP中有3個實體字段:

1) Content-Type: 指明消息體類型,有兩種:

i. Application/sdp:表示是SDP會話描述

ii. Text/html:表示是普通文本或HTML格式的描述

2) Content-Encoding:補充說明消息體類型,使使用者可以采用壓縮編碼編輯消息體

3) Content-Length:給出消息體的位元組數

7. SDP各type的詳細解釋:

協定版本 v = SDP版本目前為0,沒有子版本

會話源 o = <使用者名>使用者在發起主機上登入名,如果主機不支援使用者辨別的概念,則為”-”

<會話id>一般為數字串,其配置設定由建立工具決定,建議用網絡時間協定(NTP)時

戳,以確定唯一性.

<版本>該會話公告的版本,供公告代理伺服器檢測同一會話的若幹個公告哪個

是最新公告.基本要求是會話資料修改後該版本值遞增,建議用NTP時戳

<網絡類型>為文本串”IN”

<位址類型>”IP4”(可為域名或點分十進制)/”IP6”(域名或壓縮文本位址形式)

<位址>

會話名 s= ISO 10646字元表示的會話名

會話資訊   v= ISO 10646字元表示的會話資訊

URI    u= 能提供會議進一步資訊的URI位址

E妹位址   e= 給出會議負責人的聯系資訊,他不一定是建立會議公告的人

電話号碼   p= 給出會議負責人的聯系資訊,他不一定是建立會議公告的人(國際通用形式)

連接配接資料   c=媒體連接配接資料,會話級為媒體級的摸認值

帶寬    b= 給出會話或媒體所用帶寬,機關為kbit/s.修飾語:CT(會議總帶寬,表示所有

地點所有媒體的總帶寬),AS(應用特定最大帶寬,表示一個地點單一媒體帶寬)

時間描述   t= 見上

   r= 見上

時區調整   z= 見上

加密密鑰    k=已定義的方法有

      k=clear:<加密密鑰>密鑰沒有變換

k=base64:<編碼密鑰>已編碼,因為它含有SDP禁用的字元

k=uri:<獲得密鑰的URI>

k=prompt。SDP沒有提供密鑰但該會話或媒體流是要求加密的。

屬性    a=一個m=行可有多個a=行,SDP建議擴充如下:(具體見[1].Page419)

會話級: a=cat:<類别>//給出點分層次式會話分類号,供接收方篩選會話

a=keywds:<關鍵詞>//供接收方篩選會話

a=tool:<工具名和版本号>//建立會話描述的工具名和版本号

a=recvonly/sendrecv/sendonly//收發模式

a=type:<會議類型>//有:廣播,聚會,主席主持,測試,H.323

a=charset:<字元集>//顯示會話名和資訊資料的字元集

a=sdplang:<語言标記>//描述所有語言

a=lang:<語言标記>//會話描述的預設語言或媒體描述的語言

a=framerate:<幀速率>//機關:幀/秒

a=quality:<品質>//視訊的建議品質(10/5/0)

a=fmtp:<格式>< 格式特定參數>//定義指定格式的附加參數

媒體級:a=ptime:<分組時間>//媒體分組的時長(機關:秒)

a=recvonly/sendrecv/sendonly//收發模式

a=orient:<白闆方向>//指明白闆在屏莫上的方向

a=sdplang:<語言标記>//描述所有語言

a=lang:<語言标記>//會話描述的預設語言或媒體描述的語言

媒體描述     m= <媒體>有5種類型:音頻/視訊/應用(如白闆資訊)/資料(不向使用者顯示的)/控制

<端口>媒體流發往傳輸層的端口。取決于c=行規定的網絡類型和接下來的傳

送層協定:對UDP為1024-65535;對分層編碼應用(c=行沒有多點傳播位址),

要給出多點傳播端口數,如:m=video 49170/2 RTP/AVP 31(表示:端口49170

和49171為第一對RTP/RTCP端口,49172和49173為第二對的端口)。

<傳送層協定>與c=行的位址類型有關。對大多的媒體在RTP/UDP上傳送,定

義2種:RTP/AVP:IETF RTP協定,音/視訊應用文檔。在UDP上傳誦。

Udp:UDP協定。

<格式清單>對音/視訊,就是音/視訊應用文檔中規定媒體淨荷類型。清單中都

有可能用,但第一個為預設值,分為靜态綁定和動态綁定:靜态綁定即使媒體編碼方式有淨荷類型号完全确定,動态綁定則媒體編碼方式如時鐘頻率,音頻信道數等)沒有完全确定,需要進一步的屬性說明。分别舉例如下:

Alaw的PCM編碼單信道Audio,其淨荷類型号為8,把它發往UDP端口49232,則:m=audio 49232 RTP/AVP 8

16bit線性編碼,雙聲道立體聲,抽樣速率16kHz,其動态淨荷類型号98,則:m=audio 49232 RTP/AVP 98

a=rtpmap:98 L16/16000/2

說明:1)a=rtpmap:<淨荷類型号><編碼名>/<時鐘速率>[/<編碼參數>]

    對音頻,編碼參數為音頻信道數;對視訊沒有定義

2)SDP允許rtpmap規定實驗性編碼格式,但編碼名必須以X-起,

表示此格式還沒正式登記。

4. SDP Grammar

announcement =        proto-version

                     origin-field

                     session-name-field

                     information-field

                     uri-field

                     email-fields

                     phone-fields

                     connection-field

                     bandwidth-fields

                     time-fields

                     key-field

                     attribute-fields

                     media-descriptions

proto-version =    "v=" 1*DIGIT CRLF

                     ;this memo describes version 0

origin-field =        "o=" username space

                     sess-id space sess-version space

                     nettype space addrtype space

                     addr CRLF

session-name-field =   "s=" text CRLF

information-field = ["i=" text CRLF]

uri-field =           ["u=" uri CRLF]

email-fields =        *("e=" email-address CRLF)

phone-fields =        *("p=" phone-number CRLF)

connection-field = ["c=" nettype space addrtype space

                     connection-address CRLF]

                     ;a connection field must be present

                     ;in every media description or at the

                     ;session-level

bandwidth-fields = *("b=" bwtype ":" bandwidth CRLF)

time-fields =       1*( "t=" start-time space stop-time

                     *(CRLF repeat-fields) CRLF)

                     [zone-adjustments CRLF]

repeat-fields =    "r=" repeat-interval space typed-time

                     1*(space typed-time)

zone-adjustments = time space ["-"] typed-time

                     *(space time space ["-"] typed-time)

key-field =           ["k=" key-type CRLF]

key-type =          "prompt" |

                     "clear:" key-data |

                     "base64:" key-data |

                     "uri:" uri

key-data =          email-safe | "~" | "

attribute-fields = *("a=" attribute CRLF)

media-descriptions =   *( media-field

                     information-field

                     *(connection-field)

                     bandwidth-fields

                     key-field

                     attribute-fields )

media-field =       "m=" media space port ["/" integer]

                     space proto 1*(space fmt) CRLF

media =             1*(alpha-numeric)

                     ;typically "audio", "video", "application"

                     ;or "data"

fmt =                 1*(alpha-numeric)

                     ;typically an RTP payload type for audio

                     ;and video media

proto =             1*(alpha-numeric)

                     ;typically "RTP/AVP" or "udp" for IP4

port =             1*(DIGIT)

                     ;should in the range "1024" to "65535" inclusive

                     ;for UDP based media

attribute =           (att-field ":" att-value) | att-field

att-field =           1*(alpha-numeric)

att-value =           byte-string

sess-id =          1*(DIGIT)

                     ;should be unique for this originating username/host

sess-version =        1*(DIGIT)

                     ;0 is a new session

connection-address =   multicast-address

                     | addr

multicast-address = 3*(decimal-uchar ".") decimal-uchar "/" ttl