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
广告