1. 程式人生 > >SDP協議總結

SDP協議總結

一、基本要求

1、SDP的表示

SDP(Session Description Portocol)會話描述協議,通常通過內容型別為"application/sdp"的MIME來表示。

2、媒體和傳送資訊

SDP可包括以下媒體資訊:

  • 媒體型別(音訊、視訊等);
  • 傳送協議(RTP/UDP/IP, H.320等);
  • 媒體格式(H264視訊,AAC音訊等);
  • 傳輸地址和埠;

二、語法內容

1、SDP編碼

SDP完全是文字形式的,取樣UTF-8(RFC 2044)編碼的ISO 10646字符集。選用文字形式,是為了提高便攜性和傳送方式的多樣性。由於宣告會通過不可靠的方式來傳送,或是被中間快取伺服器損壞,所以編碼在設計時,就具有非常嚴格的順序和格式規則,這樣,即使存在會導致宣告的格式異常的錯誤,也能輕易的檢測出來並將其丟棄。

2、SDP語法結構

一個SDP會話描述由多個形式為<type>=<value>的文字行組成。
<type>是一個大小寫敏感的字元。
<value>是一個結構化的文字串,它的格式由<type>決定,也是大小寫敏感,除非有特定的欄位另作定語。
=兩邊不能有白空格,一般是多個由單空格字元分割的欄位,或者是一個任意格式的字串。
一個會話描述包含一個會話級描述(應用於整個會話和所有媒體流)和多個可選的媒體級描述(僅應用於單個媒體流)。
一個宣告包含一個會話級部分,並尾隨零個或多個媒體級部分。會話級部分以v=行開頭,緊跟著第一個媒體級部分。媒體級描述以m=

開頭,後跟下一個媒體描述,或者整個會話的結尾。會話級的值對所有的媒體來說是預設的,除非媒體級部分定義了相同的欄位值。

會話級描述(1個,以"v="行開頭)
媒體級描述(0個或多個,以"m="行開頭)

3、會話描述的文字行

每一個描述,有些行是必須的,而有些是可選的。但所有行必須嚴格按照表1、表2、表3中指定的順序給出。固定順序可以增強檢錯能力和降低解碼要求。
在這裡插入圖片描述
如果宣告中含有SDP解析器不能理解的type型別,SDP解析必須完全忽略這個宣告。
屬性機制a=是擴充套件SDP的基本途徑。有些屬性有特定的含義,會話必須忽略任何它不認識的屬性。

3.1 協議版本(必選)

v=0
v=

欄位給出了SDP協議的版本。最小版本是0。

3.2 會話發起者(必選)

"會話發起者"行的語法格式如下:
o=<username> <sess-id> <serr-version> <nettype> <addrtype> <unicast-address>
共6個部分,每部分以單空格區分。
<username>始發主機使用者名稱,如果始發主機不支援使用者標識的概念,則該欄位填“—”<username>中不能包含空格。
<sess-id>是一個數字串。建議使用時間戳以保證唯一性。
<sess-version>當前會話描述的版本號。如果會話資料做了修改,則這個會話的版本號要增加,具體做法取決於開發工具。建議但不強制要求使用時間戳。
<nettype>描述網路型別。目前先定義"IN",它表示網際網路,其他值待定。
<addrtype>描述網路地址型別,這裡先定義兩種取值:"IP4""IP6"
<unicast-address>描述建立會話的主機地址。
總之,o=給出了這個版本會話描述的全球唯一標識。

3.3會話名(必選)

s=<session name>
s=欄位描述會話名稱,是基於文字的。每個會話描述中有且僅有一個s=欄位,且不能為空。如果一個會話沒有實際意義,可以這樣表述:s=(通過一個空格來表示會話名稱)。

3.4連線資料(可選)

c=<nettype> <addrtype> <connection-address>
一個會話描述必須在每個媒體描述中包含一個c=欄位,或者必須包含一個會話級的c=欄位。也可以是包含一個會話級的c=欄位並在每個媒體描述中包含一個附加的c=欄位,這種請求,對於相關的媒體,優先使用媒體描述中的取值。
<nettype> 網路型別,用"IN"表示網際網路,將來也可能會定義其他值。
<addrtype>地址型別,目前只定義了"IP4""IP6"
<connection-address>IP地址

3.5時間設定(必選,至少1個)

t=<start-time> <stop-time>
t=欄位明確了一個會話的開始時間和結束時間。
如果停止時間設成0,則會話是無下限的,但在會話開始前不會被啟用;如果開始時間也是0,則認為會話永遠存活。

3.6屬性(可選,0個或多個)

a=<attribute>
a=<attribute>:<value>
屬性是擴充套件SDP的基本方式。屬性可以被定義為會話級,或者是媒體級,或者兩者都有。
屬性欄位有兩種形式:

  • 特定屬性:它的格式為a=<flag>。這種屬性表示會話的一個特寫,如a=recvonly
  • 帶值屬性:它的格式為a=<attribute>:<value>,可以是自定義的屬性。
    對屬性的解析取決於所使用的媒體工具,收到一個不認識的屬性,接收方可以忽略它。
3.7媒體描述(可選,0個或多個)

m=<media> <port> <proto> <fmt> ... 如果包含媒體描述,則必須包含該行。
<media> 媒體型別。目前定義的媒體型別有:audiovideoapplicationtextmessage,這個列表可能會擴充套件。
<port>媒體流傳輸埠。傳送埠取決於c=欄位中指明的網路及<proto>中指明的傳輸協議。其他媒體應用所使用的埠(如:RTCP埠,見RFC3605)可通過一定的演算法推匯出來,或者在一個單獨的屬性中規定(如:RFC
3605中定義的a=rtcp:)。一般RTP使用偶數埠,RTCP使用奇數埠(RTP埠+1),如果使用非連續埠,或者不按照奇偶規則來實現,則必須使用a=rtcp:屬性描述。

4、SDP屬性

下面列一些SDP屬性。程式設計人員可以根據需要新增新的屬性,所以下面列出來的並不是全部。僅列出常見的屬性。
4.1 a=framerate:<frame rate>
它給出最大視訊幀率,單位幀/秒。允許使用十進位制帶小數的值。它是媒體級的屬性,只對視訊媒體有意義。
4.2 a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
該屬性用來將一個RTP淨荷型別編號(在m=行使用的)對映到一個表示淨荷格式的編碼名稱。此外,它還提供時鐘頻率和編碼引數的資訊。
雖然能夠靜態給出淨荷格式分配淨荷型別編號,但更多是通過a=rtpmap:進行動態分配。例如:取樣16bit執行緒編碼、取樣率為16KHz的立體聲是一種動態淨荷型別,如果我們想用動態RTP/AVP淨荷型別98來表示這種流,則為了對其編碼,還需提高的附加資訊如下:
m=audio 59935 RTP/AVP 98
a=rtpmap:98 L16/16000/2
對於音訊流,<encoding parameters>表示音訊通道的數量,如果通道數量為1且不需要附加的引數,則這個引數可以省略。
對於視訊流,目前還沒有規定編碼引數。
4.3 a=fmtp:<format> <format specific parameters>
這個屬性允許特定的格式引數能在SDP不能識別它們的前提下依然能夠傳遞。這種格式必須是媒體定義的格式中的一種。

三、示例

下圖是RTSP抓包中的SDP描述
RTSP抓包