在SIP中,re-invite和update都是用来修改变session参数的。不同的是,update对dialog的状态没有影响,而re-invite会改变对话的状态。所以update可以在第一个invite被应答之前发送(即收到invite的200ok之前)。也就是说,update可以被用来控制早期媒体。而re-invite只能在第一个invite杯应答之后发送(即在通话已经建立之后)。

一般来说,在通话建立以后用update和re-invite改变session参数都可以。但是此时多用re-invite。因为update要立即被响应。这样,如果session参数的修改需要用户参与的话,用update就不合适了。大多数时候,呼叫建立起来之后再修改session参数的话,都需要用户的参与,比如点一个同意对话框,所以用re-invite就更普遍一些。

以下是RFC3261的中文翻译,详细的讲解了SIP reINVITE消息的使用方法:

RFC3261:http://tools.ietf.org/html/rfc3261#section-14

一个成功的INVITE请求(13节)既会创建一个基于两个用户之间的对话,也会基于请求/应答模式(offer-answer)创建一个会话。

12节讲述了如何通过target refresh 请求来修改一个现存的会话(比如,修改对话的remote target URI)。本节描述如何修改实际的会话(session)。

这个修改可以包括修改地址或者埠、增加媒体流、删除媒体流等等。这是通过发起新的INVITE请求来完成的,并且这个新的INVITE请求是基于建立会话所相同的对话的。在一个现存对话中发出INVITE请求就是re-INVITE。

注意,单个的re-INVITE请求可以同时更改对话和会话的参数。
呼叫方或者被叫方都可以更改现存的会话。

在本协议中,UA检测本地媒体有效性是基于自身的策略的。但是,我们并不建议自动产生re-INVITE或者BYE请求,因为这样可能会导致网路上的阻塞。在任何情况下,如果某些消息将被自动发送,那麽他们应当等待一个随机的时间间隔。 
注意,上边的这些描述是特指自动产生的BYE和re-INVITE。如果用户由于媒体不兼容而挂机,UA应当正常发出BYE请求,而不视为自动产生的BYE。

UAC行为 
与INVITE相同的会话描述磋商offer-answer模式(13.2.1节)在re-INVITE中也一样採用。假设UAS希望增进一个媒体流,那么UAC将会创建一个新的offer包含这个媒体流,并且发送INVITE请求给他的对方。特别需要注意的是,这个会话的全描述,而不是变化部分需要传送。这个支持无状态的会话处理,并且支持错误恢复机制。当然,UAC可以发送一个re-INVITE请求而不包含会话描述,在这样的情况下,就是在这个re-INVITE的第一个可靠的非失败的应答中将会包含这个会话描述offer(在这个规范中,就是2xx应答)。

如果会话描述格式具有版本号码,那么这个磋商的offer应当标志这个变化了的媒体描述版本。 
re-INVITE请求中的To,From,Call-ID,Cseq,Request-URI头域应当和正常的在对话中的请求构造方法一样(12节)。 
在re-INVITE请求中,UAC可以选择不增加一个Alert-Infor头域或者具有Content-Disposition=」alert」的消息体。因为UAS通常不会要求提示操作者来响应这个re-INVITE请求。

和INVITE不同的是,INVITE可以分支(分岔成为多份INVITE),re-INVITE是不会分支的,所以,只会由一个单个的终结应答。re-INVITE不会分支的原因是因为Request-URI标志的是建立对话的UA的目标地址,而不是用户的address-of-record地址。 
需要注意的是,在相同的对话中,UAC不能在上一个INVITE请求完成前(无论是那一方发起的INVITE)再次发起一个新的INVITE。

1、      如果有正在处理的INVITE客户事务,TU必须等待这个事务终结或者完成,才能初始化一个新的INVITE。 
2、      如果有正在处理的INVITE服务事务,TU必须等待这个事务确认或者终结,才能开始处理一个新的INVITE。

不过,UA可以在INVITE事务正在处理的同时,处理一个普通的事务。也可以在一个普通事务正在处理的同时来初始化一个INVITE事务。如果UA接收到一个针对re-INVITE的非2xx终结应答,则会话参数不能改变,应当就像没有收到过这个re-INVITE请求一样。注意,就像在12.2.1.2节一开始讲的那样,如果非2xx终结应答是一个481(Call/Transaction Does Not Exists),或者一个408(Request Timeout),或者完全没有re-INVITE请求的应答(也就是说从INVITE客户事务端返回一个超时),UAC会终止这个对话。

如果UAC收到一个re-INVITE的491应答,他应当启动一个值为T的时钟,这个T的取值如下: 
1、  如果UAC是这个dialog ID的Call-ID的拥有者。(也就是说是UAC产生的Call-ID),那麽T取值为一个2.1到4秒的随机数,单位是10毫秒。 
2、  如果UAC并非是dialog ID的Call-ID的拥有者,T应当取值是0到2秒的随机数,单位是10毫秒。 
当这个时钟到了,如果UAC还希望再次尝试更改会话参数,UAC应当再次尝试re-INVITE请求一次。这个意思是说,如果这个呼叫已经被BYE所挂掉了,那么re-INVITE请求就没有再发的必要。 
发送re-INVITE请求的规则,以及针对re-INVITE请求产生的2xx应答而产生的ACK请求的发送规则,等同于初始的INVITE请求(13.2.1节)。

UAS行为

13.3.1节描述了区分初始的INVITE请求和re-INVITE请求的方法,以及处理对现存的对话中处理re-INVITE请求的步骤。 
UAS在发送第一个INVITE的终结应答之前,收到第二个INVITE请求,并且这个请求的Cseq序列号大于第一个INVITE请求,那麽就应当给第二个INVITE请求返回一个500(伺服器内部错误)应答,并且必须包含一个Retry-After头域,这个头域中应当包含一个0-10秒的随机数。

如果UAS正在处理一个INVITE请求的时候又收到了一个在同一个对话上的INVITE请求必须返回一个491(Request Pending)应答给接收到的INVITE。

如果UA接收到一个对现存的对话的re-INVITE请求,那么就必须检查有关会话描述(session description)的版本标志(version identifiers),或者,如果没有版本标志,那么就需要检查会话描述的正文看看有没有变化。如果会话描述改变了,UAS必须由此调整会话参数,在调整参数的时候可能会要求用户确认。

会话描述的版本可以用来提供给会议的新近加入者,增加或者删除媒体,或者由单点会议更改成为多方会议。 
如果新的会话描述是不能被UA接受的,UAS可以用返回一个488(Not Acceptable Here)来拒绝这个re-INVITE请求。这个响应应当包含一个Warning头域(用来提供给请求方,提供这个拒绝的原因)。如果UAS产生一个2xx应答,但是没有收到ACK,它应当产生一个BYE来结束这个对话。

UAS可以不产生180(Ringing)应答给re-INVITE,因为UAC一般不展示这个信息给用户。同样的,UAS可以增加一个Alert-Info头域或者一个由Content-Disposition「alert」的消息体来应答给re-INVITE来让UAC展示这个信息。

如果UAS在2xx应答中提供了一个媒体协商offer(因为INVITE没有包含一个offer),那么它当作新呼叫一样的构造这个offer,就像在[13]中SDP描述一样,遵循发送更改现有的会话的offer的限制。特别需要注意的是,这个意味著它应当包含全部的UA支持的媒体类型和媒体格式。UAS必须确保会话描述在媒体格式,通讯方式,或者其他要求对方支持的参数上,新的会话描述和旧的会话描述一样。这个可以避免对方拒绝这个会话描述。如果,UAC任然是不能接受这个会话描述,UAC应当产生一个它能够接受的会话描述应答,并且发送一个BYE来结束这个会话。

SIP的re-invite和update的区别相关推荐

  1. OpenSIPS-NAT穿越,SIP注册,INVITE及RTPProxy配置

    OpenSIPS-NAT穿越,SIP注册,INVITE及RTPProxy配置 在SIP语音语音网络中,NAT traversal(NAT穿越)是非常常见的一个问题,因为NAT问题导致的单通,无语音等很 ...

  2. Linux中升级更新命令yum upgrade和yum update的区别

    这篇文章主要介绍了Linux中升级更新命令yum upgrade和yum update的区别,Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的,本文 ...

  3. linux更新命令yum,Linux中升级更新命令yum upgrade和yum update的区别

    Linux中升级更新命令yum upgrade和yum update的区别 更新时间:2019-10-31 17:21 最满意答案 Linux升级命令有两个分别是yum upgrade和yum upd ...

  4. 升级Upgrade与更新Update的区别

    升级Upgrade 与 更新Update的区别 参考: https://support.apple.com/en-us/HT201564 https://support.apple.com/zh-cn ...

  5. 五 SIP中一个INVITE消息的发起过程

    SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...

  6. Linux升级命令yum upgrade和yum update的区别

    Linux升级命令yum upgrade和yum update的区别 yum -y update 升级所有包同时也升级软件和系统内核 yum -y upgrade 只升级所有包,不升级软件和系统内核 ...

  7. ORCLE中ALTER、MODIFY和UPDATE的区别

    ORCLE中ALTER.MODIFY和UPDATE的区别 1.modify是修改字段类型和长度的(即修改字段的属性). 2.alter是修改表的数据结构(modify是alter的一种用法). sql ...

  8. yum update upgrade 区别_CentOS与RedHat的区别

    RedHat在发行的时候,有两种方式:二进制和源代码的发行方式.无论是哪一种发行方式,你都可以免费获得(例如从网上下载),并再次发布.但如果你使用了他们的在线升级(包括补丁)或咨询服务,就必须要付费. ...

  9. upgrade和update的区别

    最近在写程序时总会用到upgrade这个词,今天突发奇想,update也有"更新"的意思,那么这两个词到底有什么区别呢? 忍不住好奇心,停下coding,放狗一搜,还真找到了区别. ...

最新文章

  1. python使用正则表达式抽取文件中的IP地址
  2. Android Input系统之触摸屏
  3. Flex很可能会消失
  4. Design Pattern: Observer Pattern
  5. onclick实现超链接_给超链接加onclick事件
  6. C#深入.NET平台的软件系统分层开发
  7. LeetCode 2177. 找到和为给定整数的三个连续整数
  8. bootstrap table 怎么实现前两列固定冻结?
  9. vb 关于窗口样式的API以及处理文本的API参考
  10. centOS下mongodb的安装
  11. 一个Maven工程中,不同的模块需要不同的JDK进行编译的解决方案
  12. Javascript对象数组排序
  13. 高通平台SPI驱动框架分析
  14. cad 打开硬件加速卡_CAD:“你的图纸缺少shx字体!”不知道该怎么办?不存在的!...
  15. duilib 添加自定义list一例
  16. flutter安装教程与XD教程
  17. 计算机音乐研,武汉音乐学院2017年硕士研究生《计算机音乐作曲》考试大纲及参考书目...
  18. 计算机efs加密,2分钟让你学会电脑EFS文件加密
  19. 第二章 VB的界面设计
  20. html5火苗特效代码,视频添加火焰特效 视频画面中加动态的火苗效果

热门文章

  1. 软件工程开课第一周博客
  2. ubuntu 下咪咕音乐不能播放音乐的解决方法
  3. 第二章 表格和样式入门
  4. 两化融合贯标申报条件-制造
  5. 基于SSM的毕业论文答辩系统
  6. mac软件如何实现微信双开
  7. 面试一直失败,面试经验总结
  8. 2019ICPC南昌网络赛 - I. Yukino With Subinterval
  9. 心思电闪之下,杨辰灵机一动,忽然扭转矛头,直冲向下方的北冰洋!
  10. 纯CSS实现左右拖拽改变布局大小 使用CSS3中resize属性 水平,垂直拖动元素,改变大小