VoLTE:别把Cancel与BYE搞混了

在VOLTE通信流程的SIP会话中经常会遇到CANCEL消息,它与结束通话中的BYE有什么区别呢?

首先,我们来回顾一下SIP的基本呼叫流程;Andrew给Jennifer打电话,通话若干分钟后Jennifer挂机结束通话,这是一个典型的通话过程(图1)。本次通话从INVITE开始,由BYE结束(收到最终响应200 OK)。

Figure 1 VOLTE通话主要流程

在另一个场景Andrew呼叫Jennifer时,Jennifer正在忙着做饭不能接听电话;Andrew本可等待一段时间,呼叫转移到语音邮箱,但他又不愿意留下任何留言,而只是简单的挂断了电话。

Figure 2 通话Cancel流程

通过上图可看出,本次通话没有建立而是由主叫Andrew挂掉了,这就是CANCEL。

与BYE消息不同,CANCEL用于关闭一个还未收到最终响应的会话。

注意:图表3呼叫流程中的“200 OK”不是针对本次呼叫流程中INVITE消息的,它只是对CANCEL完成的确认,表示Jennifer已经收到了CANCEL并已经开始拆除这个会话,并返回487 Request Terminated响应给Andrew。

本次487(Request Terminated)是针对INVITE的最终响应。该消息将促使Andrew返回一个ACK请求消息,释放这个会话(ACK是对最终响应确认,这是与1xx--临时响应的区别)。

扫描二维码关注公众号,回复: 11900498 查看本文章

在VOLTE通话中有一种呼叫分叉(Call Forking),它是指当一个用户注册了多个终端;如果该用户做被叫,注册的多个终端将同时振铃,俗称“一号双(多)响”。虽然多个终端同时振铃,但只有一个终端会应答,而其他响铃的终端呼叫必须要释放。

Figure 3 Forking中的Cancel

不同于之前Andrew释放Jennifer未接听电话的场景,Andrew(UA1)并不发送CANCEL。本次Jennifer绑定了多个终端,如手机(UA2)和固定电话(UA3)同时振铃,而实际上Andrew(UA1)甚至并不知道有哪些终端会同时振铃,因为呼叫分叉操作是由SIP代理完成的。Andrew仅仅知道他发起了一次呼叫,有振铃音,并且呼叫被接听了;通过SIP代理将在Jennifer接听电话之后(假设是用UA2),发送CANCEL消息给所有剩余的振铃终端(UA3)。

BYE不是CANCEL,CANCEL也不是BYE;但他们都是执行释放会话的工作。做为通信工程师,幸运的是用户不需要关心这么多,仅仅只是挂掉电话,剩下的事情由SIP来完成。

猜你喜欢

转载自blog.csdn.net/ZhongGuoRenMei/article/details/108200192