在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. python2.7可以同时连接两个数据库吗
  2. ubuntu14.04安装完ros后常用的其他安装
  3. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  4. 第6天-css笔记 三大定位-定位 子绝父相 与精灵图
  5. Linux常用开发环境软件-Redis安装(docker环境下)
  6. C++11: final与override
  7. Java面试——Redis系列总结
  8. 微博:将对“宣扬仇恨”行为进行界定,并开展专项整顿
  9. windows 上安装 python3.7 和 pip 并配置虚拟环境
  10. socket与http的区别
  11. 维纶触摸屏程序实际项目,威纶通界面UI
  12. python人机交互界面
  13. UE4数据库 Mysql
  14. sql内外连接的区别
  15. 12款精品网盘资源搜索网站,只有你想不到没有它搜不到的
  16. 那些年,我追过的经典电视剧
  17. uniapp 图片模糊
  18. 《拆解 XLNet 模型设计,回顾语言表征学习的思想演进》
  19. EXTJS 6 - 日期控件 Date picker 只选年月
  20. React基础知识 [ 新手上路学这一篇就够了 ]

热门文章

  1. poj3348(凸包模板题)
  2. 2020届电子信息类专业保研经历分享
  3. Sql(Oracle)
  4. C指针进阶(2)(函数指针与指针函数,回调函数与转移表)
  5. 关于cms的遇到的部分问题
  6. ADW敏捷数据集市助力客户洞察
  7. nefuoj1249|洛谷P2345-树状数组推式子-你牛
  8. 基于Pytorch的深度学习 —— 安装与配置
  9. cadence隐藏管脚序号_如何隐藏元件管脚
  10. STP、RSTP与MSTP也不过就这些区别