1、引入

在松耦合会议中,会话参数完全由会议创建者来确定,参与者能做的仅仅是根据这些会话参数来加入会议(当然也可以选择不加入)。这种情况下,主要要做的就是会话描述,在这里SDP本身就足够了。

但是在更为普遍的两方会话的情况下,由于用户终端能力的差异,任何一方不能假设对方一定支持某种会话参数,所以必须双方协商来最终就会话的参数达成一致。显然,SDP能做到准确的描述会话的参数,但是它缺少双发如何根据各自提供的会话描述形成最终一致的会话描述的语义及操作上的细节。

IETF RFC3264定义了一个基于SDP的简单的提议/应答模型来实现这一点。

2、提议/应答操作概述

在提议/应答模型中,首先会话的一方(提议者)产生一个 SDP消息来描述它所期望的会话,这构成了一个提议(offer)。提议中主要包括提议者想使用的媒体流和codecs集,以及提议者用于接收媒体的IP地址和端口。

提议被传送到另一方,收到这个提议后这一方可能会接受,也可能会拒绝这个提议。在前一种情况下,本方(应答者)根据收到的提议和自身的能力产生一个SDP消息来描述它所能接受的会话,这称为应答(answer),应答中针对提议中的每个媒体流有一个匹配流,指示该媒体流是否被接受,同时伴随着要使用的codecs和应答者希望用于接收媒体的 IP 地址和端口。

在提议/应答的操作中需遵守以下原则:

  • 在任何时候,任何一方都可能产生一个新的提议来更新会话。然而,如果它收到了一个提议还没有应答或拒绝,则不能产生新的提议。
  • 提议/应答交换是不可分的,如果应答被拒绝,会话恢复到提议前的状态。
  • 提议 (和应答) 必须是RFC 2327 中所定义的有效SDP消息。尽管 SDP 规范允许将多个会话描述串接在一起形成一个大的SDP 消息,但是在提议/应答模型中使用的SDP消息必须恰好包含一个会话描述。

在提议/应答模型中交换假定存在一个高层协议(比如SIP),它能够完成SDP消息的交换,并能维持某种上下文关系,将一个提议及其应答,和创建和更新同一个会话的多个提议/应答对关联起来。

3、提议/应答交换例子

下面给出一个简单的提议/应答交换的例子。

假设主叫A发送一个提议给被叫B。提议中包含一个双向的音频流和两个双向的视频流,分别使用H.261 (净荷类型31) 和MPEG(净荷类型32)。

提议的SDP如下:

v=0

o=alice 2890844526 2890844526 IN IP4 host.anywhere.com

s=

c=IN IP4 host.anywhere.com

t=0 0

m=audio 49170 RTP/AVP 0

a=rtpmap:0 PCMU/8000

m=video 51372 RTP/AVP 31

a=rtpmap:31 H261/90000

m=video 53000 RTP/AVP 32

a=rtpmap:32 MPV/90000

被叫B不想发送和接收第一个视频流,所以返回以下SDP作为应答。(注意描述第一个视频流的"m="行中端口设为0,这表示拒绝这个媒体流)。

v=0

o=bob 2890844730 2890844730 IN IP4 host.example.com

s=

c=IN IP4 host.example.com

t=0 0

m=audio 49920 RTP/AVP 0

a=rtpmap:0 PCMU/8000

m=video 0 RTP/AVP 31

m=video 53000 RTP/AVP 32

a=rtpmap:32 MPV/90000

之后的某一时刻,B决定改变其接收音频流的端口(从49920 改为65422),同时,增加另一个“仅接收”的音频流(注意其属性为recvonly),使用 RTP 净荷类型 events 。

B提供了以下SDP作为提议:

v=0

o=bob 2890844730 2890844731 IN IP4 host.example.com

s=

c=IN IP4 host.example.com

t=0 0

m=audio 65422 RTP/AVP 0

a=rtpmap:0 PCMU/8000

m=video 0 RTP/AVP 31

m=video 53000 RTP/AVP 32

a=rtpmap:32 MPV/90000

m=audio 51434 RTP/AVP 110

a=rtpmap:110telephone-events/8000

a=recvonly

A接受这个新增的媒体流(注意在其属性为sendonly),所以产生以下的应答:

v=0

o=alice 2890844526 2890844527 IN IP4 host.anywhere.com

s=

c=IN IP4 host.anywhere.com

t=0 0

m=audio 49170 RTP/AVP 0

a=rtpmap:0 PCMU/8000

m=video 0 RTP/AVP 31

a=rtpmap:31 H261/90000

m=video 53000 RTP/AVP 32

a=rtpmap:32 MPV/90000

m=audio 53122 RTP/AVP 110

a=rtpmap:110telephone-events/8000

a=sendonly

4、后继

基于SDP的提议应答模型的实际实现需要依赖于某种呼叫信令协议,比如SIP、BICC等等,相比较而言,与提议应答模型这些协议的关系更为复杂。本博客将有后继博文介绍在SIP中应用SDP提议应答模型的情况。

基于SDP的提议/应答(offer/answer)模型简介的更多相关文章

  1. SIP中的SDP offer/answer交换初探

    1.引言 SDP的offer/answer模型本身独立与于利用它的高层协议.SIP是使用offer/answer模型的应用之一.RFC 3264 定义了offer/answer模型,但没有规定使用哪个 ...

  2. atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系

    atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...

  3. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型

    前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...

  4. 基于MATLAB System Generator 搭建Display Enhancement模型

    基于MATLAB System Generator 搭建Display Enhancement模型

  5. PyTorch专栏(八):微调基于torchvision 0.3的目标检测模型

    专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60分钟入门 PyTorch入门 PyTorch自动微分 PyTorch神经网络 P ...

  6. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  7. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  8. 概率主题模型简介 Introduction to Probabilistic Topic Models

    此文为David M. Blei所写的<Introduction to Probabilistic Topic Models>的译文,供大家参考. 摘要:概率主题模型是一系列旨在发现隐藏在 ...

  9. 转:概率主题模型简介 --- ---David M. Blei所写的《Introduction to Probabilistic Topic Models》的译文

    概率主题模型简介 Introduction to Probabilistic Topic Models      转:http://www.cnblogs.com/siegfang/archive/2 ...

随机推荐

  1. Linux 全盘搜索关键字

    grep  -Ern  -o  '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25 ...

  2. 14Flutter StatefulWidget有状态组件、页面上绑定数据、改变页面数据、实现计数器功能、动态列表

    /** * Flutter StatefulWidget有状态组件.页面上绑定数据.改变页面数据 * 在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/Stat ...

  3. Java 检查IPv6地址的合法性

    Java 检查IPv6地址的合法性 由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋. 一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段. 提前了解一些IPv6的知识,还是有必 ...

  4. PAT 甲级 1028 List Sorting (25 分)(排序,简单题)

    1028 List Sorting (25 分)   Excel can sort records according to any column. Now you are supposed to i ...

  5. 使用java NIO及高速缓冲区写入文件

    byte[] bytes = Files.readAllBytes(Paths.get("E:\\pdf\\aaa\\html\\text.txt").normalize()); ...

  6. Crontab的格式说明

    第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...

  7. (转)svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”

    今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrup ...

  8. webdriervAPI(控制浏览器及简单元素操作)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  9. 记录下关于RabbitMQ常用知识点(持续更新)

    1.端口及说明: 4369 -- erlang发现口 5672 --client端通信口 15672 -- 管理界面ui端口 25672 -- server间内部通信口 举例说明 我们访问Rabbit ...

  10. 基于c开发的全命令行音频播放器

    cmus是一个内置了音频播放器的强大的音乐文件管理器.用它的基于ncurses的命令行界面,你可以浏览你的音乐库,并从播放列表或队列中播放音乐,这一切都是在命令行下. Linux上安装cmus 首先, ...