SIP呼叫流程
注册注销过程
SIP为用户定义了注册和注销过程,其目的是可以动态建立用户的逻辑地址和其当前联系地址之间的对应关系,以便实现呼叫路由和对用户移动性的支持。逻辑地址和联系地址的分离也方便了用户,它不论在何处、使用何种设备,都可以通过惟一的逻辑地址进行通信。
注册/注销过程是通过REGISTER消息和200成功响应来实现的。在注册/注销时,用户将其逻辑地址和当前联系地址通过REFGISTER消息发送给其注册服务器,注册服务器对该请求消息进行处理,并以200成功响应消息通知用户注册注销成功。
呼叫过程
SIP IP电话系统中的呼叫是通过INVITE邀请请求、成功响应和ACK确认请求的三次握手来实现的,即当主叫用户代理要发起呼叫时,它构造一个INVITE消息,并发送给被叫。被叫收到邀请后决定接受该呼叫,就回送一个成功响应(状态码为200)。主叫方收到成功响应后,向对方发送ACK请求。被叫收到ACK请求后,呼叫成功建立。
呼叫的终止通过BYE请求消息来实现。当参与呼叫的任一方要终止呼叫时,它就构造一个BYE请求消息,并发送给对方。对方收到BYE请求后,释放与此呼叫相关的资源,回送一个成功响应,表示呼叫已经终止。
当主、被叫双方已建立呼叫,如果任一方想要修改当前的通信参数(通信类型、编码等),可以通过发送一个对话内的INVITE请求消息(称为re-INVITE)来实现。
重定向过程
当重定向服务器(其功能可包含在代理服务器和用户终端中)收到主叫用户代理的INVITE邀请消息,它通过查找定位服务器发现该呼叫应该被重新定向(重定向的原因有多种,如用户位置改变、实现负荷分担等),就构造一个重定向响应消息(状态码为3xx),将新的目标地址回送给主叫用户代理。主叫用户代理收到重定向响应消息后,将逐一向新的目标地址发送INVITE邀请,直至收到成功响应并建立呼叫。如果尝试了所有的新目标都无法建立呼叫,则本次呼叫失败。
SIP呼叫流程
下面结合具体场景介绍一下SIP呼叫的详细过程,具体字段解析见下一节。
注册注销
SIP注册流程
1. SIP用户向其所属的注册服务器发起REGISTER注册请求。在该请求消息中,Request-URI表明了注册服务器的域名地址,To头域包含了注册所准备生成.查询或修改的地址记录,Contact头域表明该注册用户在此次注册中欲绑定的地址,Contact头域中的Expires参数或者Expires头域表示了绑定在多长时间内有效。
2. 注册服务器返回401响应,要求用户进行鉴权。
3. SIP用户发送带有鉴权信息的注册请求。
4. 注册成功。
SIP用户的注销和注册更新流程基本与注册流程一致,只是在注销时Contact头域中的Expires参数或Expires头域值为0。
代理方式呼叫流程
1. 用户A向其所属的出域代理服务器(软交换)PROXY1发起INVITE请求消息,在该消息中的消息体中带有用户A的媒体属性SDP描述;
2. PROXY1返回407响应,要求鉴权;
3. 用户A发送ACK确认消息;
4. 用户A重新发送带有鉴权信息的INVITE请求;
5. 经过路有分析,PROXY1将请求转发到PROXY2;
6. PROXY1向用户A发送确认消息”100 TRYING”,表示正在对收到的请求进行处理;
代理方式的SIP正常呼叫流程
7. PROXY2将INVITE请求转发到用户B;
8. PROXY2向PROXY1发送确认消息”100 TRYING”
9. 终端B振铃,向其归属的代理服务器(软交换)PROXY2返回”180 RINGING”响应。
10. PROXY2向PROXY1转发” 180 RINGING”;
11. PROXY1向用户A转发” 180 RINGING”,用户A所属的终端播放回铃音;
12. 用户B摘机,终端B向其归属的代理服务器(软交换)PROXY2返回对INVITE请求的”200 OK”响应,在该消息中的消息体中带有用户B的媒体属性SDP描述;
13. PROXY2向PROXY1转发”200 OK”;
14. PROXY1向用户A转发”200 OK”;
15. 用户A发送针对200响应的ACK确认请求消息;
16. PROXY1向PROXY2转发ACK请求消息;
17. PROXY2向用户B转发ACK请求消息,用户A与B之间建立双向RTP媒体流;
18. 用户B挂机,用户B向归属的代理服务器(软交换)PROXY2发送BYE请求消息;
19. PROXY2向PROXY1转发BYE请求消息;
20. PROXY1向用户A转发BYE请求消息;
21. 用户A返回对BYE请求的200 OK响应消息;
22. PROXY1向PROXY2转发200 OK请求消息;
23. PROXY2向用户B转发200 OK响应消息,通话结束。
重定向方式呼叫流程
重定向方式呼叫流程
1. 用户A向重定向服务器发送INVITE请求消息,该消息不带SDP;
2. 重定向服务器返回”302 Moved temporarily响应”,该响应的Contact头域包含用户B当前更为精确的SIP地址;
3. 用户A向重定向服务器发送确认302响应响应受到的ACK消息;
4. 用户A向重定向代理服务器PROXY2发送INVITE请求消息,该消息不带SDP;
5. PROXY2向用户B转发INVITE请求;
6. PROXY2向用户A发送确认消息"100 TRYING",表示正在对收到的请求进行处理;
7. 终端B振铃,向其归属的代理服务器(软交换)PROXY2返回”180 RINGING”响应;
8. PROXY2转发"180 RINGING"响应;
9. 用户B摘机,终端B返回对INVITE请求的”200 OK”响应,在该消息中的消息体中带有用户B的媒体属性SDP描述;
10. PROXY2转发”200 OK”响应;
11. 用户A发送确认”200 OK”响应收到的ACK请求,该消息中带有用户A媒体的属性的SDP描述。
12. PROXY2转发ACK消息,用户A和用户B之间建立双向的媒体流;
13. 用户B挂机,用户B向PROXY2发送BYE球求消息;
14. PROXY2向用户A转发BYE请求消息;
15. 用户A返回对BYE请求的200 OK响应消息;
16. PROXY2向用户B转发200 OK响应消息,通话结束。
关于SIP协议详细流程,可以参考RFC3261-SIP协议,当然如果不习惯的话可以参考中文翻译版RFC3261-SIP协议中文版