结束一个会话

来源:互联网 发布:python 爬虫 抓取文字 编辑:程序博客网 时间:2024/05/02 02:57

本节描述了结束由SIP建立的会话的步骤。会话的状态和对话的状态是密切相关的。当一个会话由INVITE建立的时候,每一个由不同UAS的1xx或者2xx的应答创建一个对话,并且当完成了会话描述的请求/应答(offer/answer)交互之后,它也就创建了一个会话。这就是说,每一个会话都和单个对话“相关”-会话是对话所创建的。如果初始化的INVITE产生了非2xx的终结应答,它也终结了由本次请求创建的任何会话(如果有的话),并且终结了所有的本次请求创建的对话(如果有的话)。由于事务完整性的保证,一个非2xx的终结应答同样也防止了本次INVITE以后可能创建的会话。BYE请求用于终结指定的会话或者尝试建立的会话。在这里,特定的会话是一个和与之相对的对话的对方UA。当在对话中接收到了一个BYE,任何与该对话相关的会话都应当终止。UA禁止在对话外发送BYE请求。请求方UA可以在已经建立好的对话或者早期对话中发起BYE请求;被叫方只能在建立好的对话中发起BYE请求,不能在早期对话中发起BYE请求。

不过,在一个建立好的对话中,被叫方的UA不能在接收到对应2xx应答的ACK请求前发送BYE请求,或者不能在服务器事务超时前发送BYE请求。如果没有SIP扩展定义了和这个对话相关的其他应用层状态,这个BYE请求同样结束了对话。

 

在对话和会话中,给INVITE的非2xx的终结应答,使得使用CANCEL比较有吸引力。CANCEL是尝试强制给INVITE请求一个非2xx应答(比如,487应答)。因此,如果UAS希望放弃整个呼叫,它可以发送一个CANCEL。如果INVITE会有2xx终结应答,这个意味着UAS在CANCEL正在处理的时候,接收到一个邀请。UAC可以继续用这个2xx应答建立会话,也可以用BYE终结这个会话。(这个意思是说,一般情况下,如果UAC希望cancel 这个INVITE请求,那么就会发出CANCEL请求,如果接收到了非2xx的终结应答,就意味着CANCEL掉了,但是如果接收到的还是2xx应答,就说明没有CANCEL掉,没有CANCEL掉呢,就可以选择继续建立会话,或者说发送一个BYE来终结会话)

 

在SIP中,并没有一个很好的“hangin up”(挂机中)定义。它属于一个用户界面的普通常见的细节。通常,当用户挂机,它意味着结束建立会话的尝试,并且终止所有已经建立的会话。对于呼叫方的UA来说,如果没有收到初始INVITE请求的终结应答,这个可能是产生对初始INVITE请求的一个CANCEL请求,并且收到终结应答之后给每一个建立好的对话发出一个BYE。对于被叫方的UA,就是很普通的BYE;粗略来说,当用户(因为响应振铃)摘机,就会产生一个2xx应答,于是挂机会在收到ACK请求之后发送一个BYE。这不是说在收到ACK之前用户不能挂机,这只是表达在用户的电话中的软件,需要保持一小会儿状态,来正确释放状态。如果某个UI(用户界面)允许用户在不摘机的情况下拒绝呼叫,可以用403(Forbidden)来作为INVITE的应答,在这样的情况下,BYE就不能发送。

 

1.使用BYE请求终止一个会话

1.1.UAC行为

BYE请求就像其他在对话内的请求一样的构造。

当BYE请求创建好了之后,UAC核心处理部分创建一个新的非-INVITE客户端事务,并且用它来处理BYE请求。UAC必须认为当BYE请求一发送到客户端事务,会话就结束了(因此也就停止发送或者接收媒体流)。如果BYE请求的应答是481(Call/Transaction Does NotExists)或者408(Request Timeout)或者BYE请求压根没有应答(就是说客户端事务返回一个超时),UAC必须认为会话和对话都已经结束。

1.2.UAS行为

UAS首先按照通用的UAS接收到请求的处理步骤进行BYE请求的处理。UAS核心处理部分接收到BYE请求以后,首先检查它是否和现存的对话匹配。如果BYE并不匹配现存的任何一个对话,那么UAS应当产生一个481(Call / Transaction DoesNot Exists )应答,并且传送给服务器事务。

这个规则意味着如果UAC发送没有带tag标志的BYE请求会被拒绝。这个是一个对RFC2543的改动,RFC2543允许BYE不带tag标志。

UAS核心处理部分接收到BYE请求,并且发现和现存的对话匹配,那么它必须遵循上节的步骤来处理请求。一旦处理完成,UAS应当终止这个会话(因此停止发送和接收媒体流)。唯一一个可以选择不终止的情况是多方会话,在多方会话中参与者允许对话中的其他参与方终止他们自己的会话。不管是否终止会话中的参与方,UAS核心处理都必须给BYE产生2xx的应答,并且必须由服务器的通讯层进行传输。

UAS必须依旧响应在这个对话中接收到的未决的请求。我们建议用487(请求终止)来给这些未决的请求以应答。

0 0