跳到主要内容

14. 修改现有会话

14 修改现有会话

成功的INVITE请求(参见第13节)在两个用户代理之间建立了一个对话,并使用提供-应答模型建立了一个会话.第12节说明如何使用目标刷新请求修改现有对话(例如,更改对话的远程目标URI).本节介绍如何修改实际会话.此修改可能涉及更改地址或端口,添加媒体流,删除媒体流等.这是通过在建立会话的同一对话中发送新的INVITE请求来实现的.在现有对话中发送的INVITE request称为重新INVITE.

  请注意,一次重新INVITE可以同时修改对话和会话参数.

调用者或被调用者都可以修改现有会话.

UA在检测媒体故障时的行为取决于当地政策.但是,不建议自动生成重新INVITE或BYE,以避免出现拥塞时网络流量泛滥.在任何情况下,如果这些消息是自动发送的,则应在随机间隔后发送.

  请注意,上面的段落指的是自动生成的"是"和"重新INVITE".如果用户在媒体故障时挂断,UA将像往常一样发送BYE请求.

14.1 UAC行为

适用于INVITE中的会话描述(第13.2.1节)的相同报价-应答模型适用于重新INVITE.因此,例如,想要添加媒体流的UAC将创建包含该媒体流的新要约,并在INVITE request中将其发送给对等方.需要注意的是,发送的是会话的完整描述,而不仅仅是更改.这支持各种元素中的无状态会话处理,并支持故障切换和恢复功能.当然,UAC可以

发送不带会话描述的重新INVITE,在这种情况下,对重新INVITE的第一个可靠的无故障响应将包含报价(在本规范中,这是2xx响应).

如果会话描述格式具有版本号功能,则报价人应指出会话描述的版本已更改.

重新INVITE的To,From,Call-ID,CSeq和Request-URI的设置规则与现有对话中的常规请求相同,如第12节所述.

UAC可以选择不向重新INVITE添加警报信息头字段或内容处置为"警报"的正文,因为UAS通常不会在收到重新INVITE时向用户发出警报.

与INVITE不同,REINVITE可以分叉,REINVITE永远不会分叉,因此只生成一个最终响应.重新INVITE永远不会分叉的原因是,Request-URI将目标标识为它与之建立对话的UA实例,而不是标识用户的记录地址.

请注意,当另一个INVITE事务在任一方向上进行时,UAC不得在对话中启动新的INVITE事务.

  1. 如果有正在进行的INVITE客户端事务,则TU必须等到事务达到已完成或已终止状态后才能启动新的INVITE.

2. 如果存在正在进行的INVITE服务器事务,则TU必须等到事务达到已ACK或已终止状态,然后才能启动新的INVITE.

然而,UA可以在INVITE事务进行中启动常规事务.UA还可以在常规事务进行中启动INVITE事务.

如果UA收到对重新INVITE的非2xx最终响应,则会话参数必须保持不变,就像没有发出重新INVITE一样.请注意,如第12.2.1.2节所述,如果非2xx最终响应为481(呼叫/事务不存在)或408(请求超时),或者根本没有收到重新INVITE的响应(即,INVITE客户端事务返回超时),UAC将终止对话.

如果UAC接收到对重新INVITE的491响应,它应该启动一个定时器,其值T选择如下:

  1. 如果UAC是对话ID的Call-ID的所有者(意味着它生成了该值),则T有一个随机选择的值,以10毫秒为单位,介于2.1秒和4秒之间.

2. 如果UAC不是对话ID的Call-ID的所有者,则T有一个以10毫秒为单位的0到2秒之间的随机选择值.

当计时器触发时,如果UAC仍希望进行会话修改,则应再次尝试重新INVITE.例如,如果电话已挂断并伴有"BYE",则不会进行重新INVITE.

发送重新INVITE和为重新INVITE的2xx响应生成ACK的规则与初始INVITE的规则相同(第13.2.1节).

14.2 UAS行为

第13.3.1节描述了区分传入的重新INVITE和传入的初始INVITE以及处理现有对话的重新INVITE的程序.

在同一对话中,在向CSeq序列号较低的第一个INVITE发送最终响应之前接收到第二个INVITE的UAS必须向第二个INVITE返回500(服务器内部错误)响应,并且必须包含一个Retry After header字段,该字段的随机选择值介于0和10秒之间.

当UAS在对话上发送的INVITE正在进行时,在该对话上接收到INVITE的UAS必须对接收到的INVITE返回491(请求挂起)响应.

如果UA收到现有对话的重新INVITE,则必须检查会话描述中的任何版本标识符,如果没有版本标识符,则检查会话描述的内容,以查看其是否已更改.如果会话描述已更改,UAS必须相应地调整会话参数,可能是在请求用户ACK之后.

  会话描述的版本控制可用于适应新到会议的功能,添加或删除媒体,或从单播会议更改为多播会议.

如果新会话描述不可接受,UAS可以通过为重新INVITE返回488(此处不可接受)响应来拒绝它.此响应应包括警告头字段.

如果UAS生成2xx响应且从未收到ACK,则应生成BYE以终止对话.

UAS可以选择不为重新INVITE生成180(振铃)响应,因为UAC通常不会向用户呈现此信息.出于同样的原因,UAS可能会选择不使用警报信息头字段或内容处置为"警报"的正文来响应重新INVITE.

在2xx中提供报价的UAS(因为INVITE中不包含报价)应构建报价,就好像UAS正在进行全新呼叫一样,受发送更新现有会话的报价的约束,如SDP中[13]所述.具体而言,这意味着它应该包括UA愿意支持的尽可能多的媒体格式和媒体类型.UAS必须确保会话描述在媒体格式,传输或其他需要对等方支持的参数中与其先前的会话描述重叠.这是为了避免对等方拒绝会话描述.但是,如果UAC不能接受,UAC应生成带有有效会话描述的答案,然后发送BYE以终止会话.