SIP - 報價/應答模型



SDP 在 SIP 中的使用在 SDP 報價應答 RFC 3264 中給出。SIP 中預設的訊息正文型別為application/sdp

  • 呼叫方通常在 INVITE 或 ACK 中列出他們願意接收的媒體功能。

  • 被叫方在對 INVITE 的 200 OK 響應中列出其媒體功能。

SDP 在 SIP 中的典型使用包括以下欄位:版本、來源、主題、時間、連線以及一個或多個媒體和屬性。

  • SIP 不使用主題和時間欄位,但為了相容性而包含這些欄位。

  • 在 SDP 標準中,主題欄位是必需欄位,必須包含至少一個字元,建議如果沒有主題則設定為 s=-。

  • 時間欄位通常設定為 t = 00。SIP 使用連線、媒體和屬性欄位在 UA 之間建立會話。

  • 來源欄位在 SIP 中的使用有限。

  • 會話 ID 通常在整個 SIP 會話中保持不變。

  • 每次更改 SDP 時,版本都會遞增。如果傳送的 SDP 與之前傳送的 SDP 相同,則版本保持不變。

  • 由於媒體會話和要使用的編解碼器的型別是連線協商的一部分,因此 SIP 可以使用 SDP 指定多種替代媒體型別並有選擇地接受或拒絕這些媒體型別。

報價/應答規範 RFC 3264 建議為每個媒體欄位使用包含 a = rtpmap: 的屬性。透過將 SDP 響應中相應媒體欄位的埠號設定為零來拒絕媒體流。

示例

在下面的示例中,呼叫方 Tesla 想要使用 SDP 中包含的初始 INVITE 建立具有兩種可能的音訊編解碼器和一種影片編解碼器的音訊和影片呼叫:

v = 0 
o = John 0844526 2890844526 IN IP4 172.22.1.102  
s = - 
c = IN IP4 172.22.1.102 
t = 0 0 
m = audio 6000 RTP/AVP 97 98 
a = rtpmap:97 AMR/16000/1 
a = rtpmap:98 AMR-WB/8000/1 
m = video 49172 RTP/AVP 32 
a = rtpmap:32 MPV/90000 

編解碼器透過 RTP/AVP 配置檔案編號 97、98 引用。

被叫方 Marry 接聽電話,為第一個媒體欄位選擇第二個編解碼器,並拒絕第二個媒體欄位,只希望 AMR 會話。

v = 0 
o = Marry 2890844526 2890844526 IN IP4 172.22.1.110 
s = - 
c = IN IP4 200.201.202.203 
t = 0 0 
m = audio 60000 RTP/AVP 8 
a = rtpmap:97 AMR/16000 
m = video 0 RTP/AVP 32 

如果此僅音訊呼叫不可接受,則 Tom 將傳送 ACK,然後傳送 BYE 以取消呼叫。否則,將建立音訊會話並交換 RTP 資料包。

如本例所示,除非維護媒體欄位的數量和順序,否則呼叫方無法確定被叫方接受和拒絕哪些媒體會話。

報價/應答規則在以下部分中總結。

生成報價的規則

SDP 報價必須包含所有必需的 SDP 欄位(包括 v=、o=、s=、c= 和 t=)。這些是 SDP 中的必填欄位。

它通常包含媒體欄位(m=),但並非必須包含。媒體行包含按優先順序順序列出的所有編解碼器。唯一的例外是,如果端點支援大量編解碼器,則應列出最有可能被接受或最優選的編解碼器。不同的媒體型別包括音訊、影片、文字、MSRP、BFCP 等。

生成應答的規則

對報價的 SDP 應答必須根據以下規則構建:

  • 應答必須具有與應答相同數量的m=行,並且順序相同。

  • 可以透過將埠號設定為 0 來拒絕單個媒體流。

  • 透過傳送非零埠號來接受流。

  • 每個媒體型別列出的有效負載必須是報價中列出的有效負載的子集。

  • 對於動態有效負載,不需要在每個方向使用相同的動態有效負載編號。通常只選擇單個有效負載。

修改會話的規則

任一方都可以啟動另一個報價/應答交換以修改會話。修改會話時,必須遵循以下規則:

  • 來源 (o=) 行版本號必須與上次傳送的版本號相同(表示此 SDP 與之前的交換相同),或者可以遞增 1(表示必須解析新的 SDP)。

  • 報價必須包含所有現有的媒體行,並且必須按相同的順序傳送。

  • 可以將附加媒體流新增到 m= 行列表的末尾。

  • 可以透過將埠號設定為 0 來刪除現有媒體流。此媒體行必須保留在 SDP 中以及此會話的所有未來報價/應答交換中。

呼叫保持

呼叫中的一方可以暫時將另一方置於保持狀態。這是透過傳送具有與原始 INVITE 相同的 SDP 的 INVITE 來完成的,但帶有a = sendonly屬性。

透過傳送帶有a = sendrecv屬性的另一個 INVITE 來重新啟用呼叫。下圖顯示了呼叫保持的呼叫流程。

Call Hold
廣告