15. 终止会话
15 终止会话
本节描述终止SIP建立的会话的过程.会话的状态和对话的状态密切相关.当使用INVITE启动会话时,来自不同UAS的每个1x或2xx响应都会创建一个对话,如果该响应完成要约/应答交换,则还会创建一个会话.因此,每个会话都与一个单独的对话"关联",即创建会话的对话.如果初始INVITE生成非2xx最终响应,则终止通过响应请求创建的所有会话(如果有)和所有对话(如果有).通过完成事务,非2xx最终响应还可以防止由于INVITE而创建更多会话.BYE请求用于终止特定会话或尝试的会话.在这种情况下,特定会话是对等UA位于对话另一侧的会话.当在对话上收到BYE时,与该对话关联的任何会话都应终止.UA不得在对话之外发送BYE.呼叫者的UA可以发送ACK或提前对话的BYE,被呼叫者的UA可以发送ACK对话的BYE,但不得发送提前对话的BYE.
但是,被呼叫方的UA在收到2xx响应的ACK或服务器事务超时之前,不得在ACK对话上发送BYE.如果没有SIP扩展定义与该对话关联的其他应用程序层状态,则BYE也会终止该对话.
对INVITE的非2xx最终响应对对话和会话的影响使得CANCEL的使用具有吸引力.CANCEL尝试强制对INVITE进行非2xx响应(尤其是487).因此,如果UAC希望完全放弃呼叫尝试,它可以发送CANCEL.如果INVITE导致对INVITE的2xx最终响应,这意味着UAS在CANCEL过程中接受了INVITE.UAC可以继续使用任何2xx响应建立的会话,也可以通过BYE终止会话.
SIP中没有很好地定义"挂断"的概念.它是特定于一个特定的(尽管是通用的)用户界面的.通常,当用户挂断时,表示希望终止建立会话的尝试,并终止已创建的任何会话.对于呼叫者的UA,如果初始INVITE没有生成最终响应,这将意味着CANCEL request,并在最终响应后向所有已ACK的对话说BYE.对于被叫方的UA,它通常意味着BYE;据推测,当用户拿起电话时,会生成一个2xx,因此在收到ACK后挂断电话会导致"BYE".这并不意味着用户在收到ACK之前不能挂断,它只是意味着他的手机中的软件需要保持一段时间的状态,以便正确地清理.如果特定的用户界面允许用户在接听来电之前拒绝来电,那么403(禁止)是一个很好的表达方式.根据上述规则,无法发送BYE.
15.1 使用BYE请求终止会话
15.1.1 UAC行为
BYE请求的构造与对话中的任何其他请求一样,如第12节所述.
构建BYE后,UAC核心将创建一个新的非INVITE客户端事务,并将BYE请求传递给它.一旦将BYE request传递给客户端事务,UAC必须考虑终止会话(因此停止发送或收听媒体).如果BYE的响应为481(呼叫/事务不存在)或408(请求超时)或否
接收到的响应为BYE(即,由客户端事务返回超时),UAC必须考虑会话并终止对话.
15.1.2 UAS行为
UAS首先根据第8.2节中描述的一般UAS处理来处理BYE请求.接收BYE请求的UAS核心将检查其是否与现有对话匹配.如果BYE与现有对话不匹配,UAS核心应生成481(调用/事务不存在)响应,并将其传递给服务器事务.
此规则意味着UAC发送的没有标签的BYE将被拒绝.这是对RFC 2543的更改,它允许BYE不带标记.
收到现有对话BYE请求的UAS核心必须遵循第12.2.2节的程序来处理该请求.完成后,UAS应终止会话(因此停止发送和侦听媒体).唯一可以选择不参与的情况是多播会话,即使对话中的其他参与者已终止参与会话,也可以参与.无论是否结束其对会话的参与,UAS核心必须生成对BYE的2xx响应,并且必须将该响应传递给服务器事务进行传输.
UAS仍必须响应针对该对话收到的任何未决请求.建议对这些未决请求生成487(请求终止)响应.