Session Description Protocol(會話描述協議)
RFC定義SDP的協議有兩個:
- RFC3264: An Offer/Answer Model with the session Description Protocol(SDP),用來概述一個請求/響應模型
- RFC2327: SDP:Session Description Protocol,描述數據格式.
1.RFC2327
1.1.概述
SDP 完全是一種會話描述格式 ― 它不屬於傳輸協議 ― 它只使用不同的適當的傳輸協議,包括會話通知協議(SAP)、會話初始協議(SIP)、實時流協議(RTSP)、MIME 擴展協議的電子郵件以及超文本傳輸協議(HTTP)。SDP協議是也是基於文本的協議,這樣就能保證協議的可擴展性比較強,這樣就使其具有廣泛的應用範圍。SDP 不支持會話內容或媒體編碼的協商,所以在流媒體中只用來描述媒體信息。媒體協商這一塊要用RTSP來實現.
SDP包括以下一些方面:
- 會話的名稱和目的
- 會話存活時間
-
包含在會話中的媒體信息,包括:
- 媒體類型(video, audio, etc)
- 傳輸協議(RTP/UDP/IP, H.320, etc)
- 媒體格式(H.261 video, MPEG video, etc)
- 多播或遠端(單播)地址和端口
- 為接收媒體而需的信息(addresses, ports, formats and so on)
- 使用的帶寬信息
- 可信賴的接洽信息(Contact information)
1.2.SDP協議格式
SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個字母,<值>是結構化的文本串,其格式依<類型>而定。
<type>=<value>[CRLF]
1.2.1.fields分類
- Seeesion Description
- v(Protocol Version),mnd,The current protocol version.Always "0" using RFC4566
- o(Origin),Mnd,The session originator's name and session identifiers.
- s(Session Name), Mnd,The textural session Name
- i(Session Information), opt,Textural information about the session
- u(Uri),opt, A pointer to supplemental session Information
- e(Email Address), opt, Email contract information for the person responsible.
- P(phone Address),opt,Phone contract information for the person responsible
- c(Connection Data),C,The connection type and Address
- b(Bandwidth),opt,Proposed bandwidth limits.
- z(Time Zones), opt, Accounts for daylight saving information
- k(Encryption Keys),opt,A simple mechanism for exchanging keys, Rarely used.
- Timing Description
- t(Timing),mnd, start and end times.
- r(Repeat Times),opt, Specified the duration and intervals for any session repeats.
- Media Description
- m(Media Description),mnd, Media definitions including media type(e.g."audio"),transport details and formats.
- i(Session Information),opt
- c(Connection Data),c
- b(Bandwidth):opt
- k( Encryption keys),opt
- a(Attributes),opt
1.2.2.典型格式
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)
帶"*"號的是可選的,其餘的是必須的。一般順序也按照上面的順序來排列。
1.2.3.各type對應值的結構化文本串
- v=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任務創建計算機的地址。
整個這個屬性,是唯一表示一個任務。 e=123@126.com或 p=+1 616 555-6011
對於一個任務只能兩者之中的一個,表示會議控制者的聯繫方式。郵件地址可以是[email]j.doe@example.com[/email] (Jane Doe)形式,括號裏面的是描述聯繫人的名稱,或者Jane Doe <[email]j.doe@example.com[/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,則會話被認為是永久的。 - 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> ...- 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。1.3.SDP協議例子
1.3.1.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"1.3.2.Webrtc SDP示例
v=0 o=- 0 0 IN IP4 127.0.0.1 s=WX-RTC-SERVER t=0 0 a=group:BUNDLE audio video a=msid-semantic: WMS ryODEhTpFz m=audio 1 UDP/TLS/RTP/SAVPF 0 126 c=IN IP4 0.0.0.0 a=rtcp:1 IN IP4 0.0.0.0 a=candidate:1 1 udp 2013266431 192.168.0.68 42739 typ host generation 0 a=ice-ufrag:T+0c a=ice-pwd:FzV1T/5PiBI78s630cwSb6 a=fingerprint:sha-256 2D:38:ED:09:73:36:F9:18:A6:CB:BC:ED:FB:C5:60:B3:F1:6C:FC:BD:97:57:AD:A6:38:11:9D:D4:8F:77:D6:C3 a=setup:active a=recvonly a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level a=mid:audio a=rtcp-mux a=rtpmap:0 PCMU/8000 a=rtpmap:126 telephone-event/8000 m=video 1 UDP/TLS/RTP/SAVPF 124 125 96 c=IN IP4 0.0.0.0 a=rtcp:1 IN IP4 0.0.0.0 a=candidate:1 1 udp 2013266431 192.168.0.68 42739 typ host generation 0 a=ice-ufrag:T+0c a=ice-pwd:FzV1T/5PiBI78s630cwSb6 a=extmap:2 urn:ietf:params:rtp-hdrext:toffset a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time a=extmap:4 urn:3gpp:video-orientation a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay a=fingerprint:sha-256 2D:38:ED:09:73:36:F9:18:A6:CB:BC:ED:FB:C5:60:B3:F1:6C:FC:BD:97:57:AD:A6:38:11:9D:D4:8F:77:D6:C3 a=setup:active a=recvonly a=mid:video a=rtcp-mux a=rtpmap:124 H264/90000 a=rtcp-fb:124 ccm fir a=rtcp-fb:124 nack a=rtcp-fb:124 nack pli a=rtcp-fb:124 goog-remb a=fmtp:124 x-google-max-bitrate=800;x-google-min-bitrate=150;x-google-start-bitrate=300 a=rtpmap:125 H264/90000 a=rtcp-fb:125 ccm fir a=rtcp-fb:125 nack a=rtcp-fb:125 nack pli a=rtcp-fb:125 goog-remb a=fmtp:125 x-google-max-bitrate=800;x-google-min-bitrate=150;x-google-start-bitrate=300 a=rtpmap:96 VP8/90000 a=rtcp-fb:96 ccm fir a=rtcp-fb:96 nack a=rtcp-fb:96 nack pli a=rtcp-fb:96 goog-remb2.RFC3264
An Offer/Answer Model with the Session Description Protocol (SDP)
2.1情態動詞
定義在RFC2119:
- "MUST",必須、一定要;
- "MUST NOT",禁止;
- "REQUIRED",需要;
- "SHALL"、"SHOULD",應該;
- "SHALL NOT"、"SHOULD NOT",不應該;
- "RECOMMENDED",推薦;
-
"MAY",可以
2.2術語
- 媒體流(Media Stream),或稱為媒體類型(Media Type),即我們通常所説的音頻流、視頻流等,所有通信實體要進行媒體交互之前都必須進行媒體注的協商
- 媒體格式(Media Format),每種媒體流都有不同的編碼格式,像音頻有G711、G712編碼,視頻有H261、H264等,像現在所謂的高清視頻採用是720P、1070P等。
- 單一會話(Unitcast Session)
- 多會話(Multicast Sessions)
- 單一媒體流(Unitcast Streams)
-
多媒體流(Multicast Streams)
2.3offer/answer
rfc3264協議[1]主要概述一個請求/響應模型(offer/answer,以下敍述採用英文),包括請求/響應的實體和不同階段的操作行為,如初始協商過程和重協商過程,並簡單介紹消息中各種參數的含義。具體各個參數的詳細説明見rfc2327協議[2]
![[8.Attachments/image/a5176ce3d80586e017f4de08f5e03140_MD5.png]]2.3.1.實體,消息
Offer/Answer模型包括兩個實體,一個是請求主體Offerer,另外一個是響應實體Answerer,兩個實體只是在邏輯上進行區分,在一定條件可以轉換。例如,手機A發起媒體協商請求,那麼A就是Offerer,反之如果A為接收請求則為Offerer。
Offerer發給Answerer的請求消息稱為請求offer,內容包括媒體流類型、各個媒體流使用的編碼集,以及將要用於接收媒體流的IP和端口。
Answerer收到offer之後,回覆給Offerer的消息稱為響應,內容包括要使用的媒體編碼,是否接收該媒體流以及告訴Offerer其用於接收媒體流的IP和端口。2.3.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
2.3.3.實體行為、操作過程
2.3.3.1.初始協商的Offer請求
實體A <-> 實體B,實體首先發起Offer請求,內容如2節所示,對於作何一個媒體流/媒體通道,這時實體A必須:
- 如果媒體流方向標為recvonly/sendrecv,即a=recvonly或a=sendrecv,則A必須(MUST)準備好在這個IP和端口上接收實體B發來的媒體流;
-
如果媒體流方向標為sendonly/inactive,即a=recvonly或a=sendrecv,則A不需要進行準備。
2.3.3.1.Answer響應
實體B收到A的請求offer後,根據自身支持的媒體類型和編碼策略,回覆響應。
- 如果實體B回覆的響應中的媒體流數量和順序必須(MUST)和請求offer一致,以便實體A進行甄別和決策。即m行的數量和順序必須一致,B不能(MUST NOT)擅自增加或刪除媒體流。如果B不支持某個媒體流,可以在對應的端口置0,但不能不帶這個m行描述。
- 對於某種媒體,實體B必須(MUST)從請求offer中選出A支持且自己也支持的該媒體的編碼標識集,並且可以(MAY)附帶自己支持的其它類型編碼。
-
對於響應消息中各個媒體的方向:
- 如果請求某媒體流的方向為sendonly,那麼響應中對應媒體的方向必須為recvonly;
- 如果請求某媒體流的方向為recvonly,那麼響應中對應媒體的方向必須為sendonly;
- 如果請求某媒體流的方向為sendrecv,那麼響應中對應媒體的方向可以為sendrecv/sendonly/recvonly/inactive中的一種;
- 如果請求某媒體流的方向為inactive,那麼響應中對應媒體的方向必須為inactive;
- 響應answer裏提供IP和端口,指示Offerer本端期望用於接收媒體流的IP和端口,一旦響應發出之後,Offerer必須(MUST)準備好在這個IP和端口上接收實體A發來的媒體流。
- 如果請求offer中帶了ptime(媒體流打包間隔)的a行或帶寬的a行,則響應answer也應該(SHOULD)相應的攜帶。
-
實體B Offerer應該(SHOULD)使用實體A比較期望的編碼生成媒體流發送。一般來説對於m行,如m=video 0 RTP/AVP 31 34,排充越靠前的編碼表示該實體越希望以這個編碼作為載體,這裏示例31(H261),34(H263)中H261為A更期望使用的編碼類型。同理,當實體A收到響應answer後也是這樣理解的。
2.3.3.2.實體收到響應後的處理
當實體A收到B回覆的響應後,可以(MAY)開始發送媒體流,如果媒體流方向為sendonly/sendrecv,
- 必須(MUST)使用answer列舉的媒體類型/編碼生成媒體發送;
- 應該(SHOULD)使用answer中的ptime和bandwidth來打包發送媒體流;
- 可以(MAY)立即停止監聽端口,該端口為offer支持answer不支持的媒體所使用的端口。
2.3.4.修改媒體流(會話)
修改媒體流的offer-answer操作必須基於之前協商的媒體形式(音頻、視頻等),不能(MUST NOT)對已有媒體流進行刪減。
2.3.4.1.刪除媒體流
如果實體認定新的會話不支持之前媒商的某個媒體,新的offer只須對這種媒體所在m行的端口置0,但不能不描述這種媒體,即不帶對應m行。當answerer收到響應之後,處理同初始協商一樣。
2.3.4.2.增加媒體流
如果實體打算新增媒體流,在offer裏只須加上描述即可或者佔用之前端口被置0的媒體流,即用新的媒體描述m行替換舊的。當answerer收到offer請求後,發現有新增媒體描述,或者過於端口被置0的媒體行被新的媒體描述替換,即知道當前為新增媒體流,處理同初始協商。
2.3.4.3.修改媒體流
修改媒體注主要是針對初始協商結果,如果有變更即進入修改流程處理,可能的變更包括IP地址、端口,媒體格式(編碼),媒體類型(音、視頻),媒體屬性(ptime,bandwidth,媒體流方向變更等)。