通信人家园
标题:
VoLTE:别把Cancel与BYE搞混了!
[查看完整版帖子]
[打印本页]
时间:
2016-8-12 11:21
作者:
mzzw
标题:
VoLTE:别把Cancel与BYE搞混了!
在VOLTE通信流程的SIP会话中经常会遇到CANCEL消息,它与结束通话中的BYE有什么区别呢?
首先,我们来回顾一下SIP的基本呼叫流程;Andrew给Jennifer打电话,通话若干分钟后Jennifer挂机结束通话,这是一个典型的通话过程(图1)。本次通话从INVITE开始,由BYE结束(收到最终响应200 OK)。
2016-8-12 11:20 上传
下载附件
(38.71 KB)
Figure 1 VOLTE通话主要流程
在另一个场景Andrew呼叫Jennifer时,Jennifer正在忙着做饭不能接听电话;Andrew本可等待一段时间,呼叫转移到语音邮箱,但他又不愿意留下任何留言,而只是简单的挂断了电话。
2016-8-12 11:20 上传
下载附件
(39.8 KB)
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--临时响应的区别)。
在VOLTE通话中有一种呼叫分叉(Call Forking),它是指当一个用户注册了多个终端;如果该用户做被叫,注册的多个终端将同时振铃,俗称“一号双(多)响”。虽然多个终端同时振铃,但只有一个终端会应答,而其他响铃的终端呼叫必须要释放。
2016-8-12 11:20 上传
下载附件
(59.07 KB)
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来完成。
附件:
1.webp (2).jpg
(2016-8-12 11:20, 38.71 KB) / 下载次数 0
https://www.txrjy.com/forum.php?mod=attachment&aid=Mjk0ODcyfDlmZDhjODQyfDE3MzI3ODI2MjJ8MHww
附件:
2.webp (1).jpg
(2016-8-12 11:20, 39.8 KB) / 下载次数 0
https://www.txrjy.com/forum.php?mod=attachment&aid=Mjk0ODczfDE0NmRjYWJifDE3MzI3ODI2MjJ8MHww
附件:
3.webp (1).jpg
(2016-8-12 11:20, 59.07 KB) / 下载次数 0
https://www.txrjy.com/forum.php?mod=attachment&aid=Mjk0ODc0fDYyNWEzZGExfDE3MzI3ODI2MjJ8MHww
时间:
2016-8-12 12:48
作者:
xiaopang1008
CANCEL一般都是由主叫发出的吗?被叫会不会发?
时间:
2016-8-12 13:09
作者:
cloverforce
xiaopang1008 发表于 2016-8-12 12:48
CANCEL一般都是由主叫发出的吗?被叫会不会发?
被叫不会发cancel,或者说不需要发。被叫如果拒接的话,直接答复异常响应码,比如486或者603。
通信人家园 (https://www.txrjy.com/)
Powered by C114