📜  SIP-要约/答案模型

📅  最后修改于: 2020-10-29 03:50:10             🧑  作者: Mango


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

  • 主叫方通常在INVITE或ACK中列出他们愿意在SDP中接收的媒体功能。

  • 被叫方在对INVITE的200 OK响应中列出了其媒体功能。

SDP的典型SIP用法包括以下字段:版本,来源,主题,时间,连接以及一个或多个媒体和属性。

  • SIP不会使用“主题”和“时间”字段,但出于兼容性考虑,将其包括在内。

  • 在SDP标准中,主题字段是必填字段,并且必须至少包含一个字符,如果没有主题,则建议为s =-。

  • 通常将时间字段设置为t =00。SIP使用连接,媒体和属性字段在UA之间建立会话。

  • 原始字段在SIP中的使用受到限制。

  • 在整个SIP会话中,会话ID通常保持不变。

  • 每次更改SDP时版本都会增加。如果正在发送的SDP与以前发送的SDP相同,则版本保持不变。

  • 由于要使用的媒体会话和编解码器的类型是连接协商的一部分,因此SIP可以使用SDP来指定多种备用媒体类型,并有选择地接受或拒绝这些媒体类型。

要约/答案规范RFC 3264建议将包含= 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引用。

被叫方“结婚”接听电话,为第一个媒体字段选择第二个编解码器,并拒绝第二个媒体字段,只需要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但具有= sendonly属性的INVITE来完成。

通过发送另一个具有a = sendrecv属性的INVITE再次使该呼叫变为活动状态。下图显示了呼叫保持的呼叫流程。

通话保持