SIP - 提议/应答模型


SDP 与 SIP 的使用在 SDP 提供答案 RFC 3264 中给出。SIP 中的默认消息正文类型是application/sdp

  • 主叫方列出他们愿意在 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 希望使用初始 INVITE 中携带的 SDP 中的两种可能的音频编解码器和视频编解码器建立音频和视频呼叫 -

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 与先前的交换相同,或者可以加一,这表明必须解析新的 SDP。

  • 该报价必须包括所有现有的媒体线路,并且必须以相同的顺序发送。

  • 可以将附加媒体流添加到m=行列表的末尾。

  • 可以通过将端口号设置为 0 来删除现有媒体流。该媒体行必须保留在 SDP 以及该会话的所有未来提供/应答交换中。

呼叫保持

通话中的一方可以暂时保持另一方。这是通过发送 INVITE 来完成的,该 INVITE 具有与原始 INVITE 相同的 SDP,但存在= sendonly属性。

通过发送另一个带有a = sendrecv属性的INVITE 来再次激活呼叫。下图显示了呼叫保持的呼叫流程。

呼叫保持