飞信分析之六:Fetion手机语聊的SIP-C交互过程

转载自:

http://hi.baidu.com/nathan2007/blog/item/0b28a3540b63e11e3b293552.html

 

作者:nathan

以下分析基于客户端版本Fetion 2006 beta 2.1.0.0,协议版本是SIP-C 2.0。

一位朋友留言提到飞信的手机语聊,我这里也把两个飞信用户间手机语聊的通信过程贴出来,大家一起探讨。

以下文字中:红色的表示数据的传递方向,其中221.130.45.203:8080是Fetion用TCP直连方式连接的服务器地址和端口,也就是SIP Proxy Server的IP和Port,蓝色部分是完整的SIP-C消息,就是TCP包的包体部分。

以下的过程是用户A(飞信号:123456789,IP:Port=111.111.111.111:1111)向用户B(飞信号:987654321,IP:Port=222.222.222.222:2222)发起手机语聊,我们可以看到,整个过程仍基本是一个标准的SIP会话建立过程(就是没有Ringing)。

用户A这边:

STEP 1: 通过Proxy转发,发出INVITE到用户B
111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
I fetion.com.cn SIP-C/2.0
F: 1234567890
I: 11
Q: 1 I
T: sip:[email protected];p=xxxx
L: 180

v=0
o=-0 0 IN P4111.111.111.111:1111
s=VoiceChat
c=IN IP4 111.111.111.111:1111
t=0 0
a=user:sip:[email protected];p=xxxx
m=ivr 1111 sip sip:[email protected];p=yyyy


STEP 2:收到Proxy Server返回的“正在联络B..."
111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 100 Trying
Q: 1 I
T: sip:[email protected];p=xxxx
I: 11



STEP 3:收到Proxy Server转来的用户B的同意消息
111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 200 OK
Q: 1 I
T: sip:[email protected];p=xxxx
I: 11


STEP 4:回复用户B已收到其同意的消息 (ACK)
111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
A fetion.com.cn SIP-C/2.0
I: 11
Q: 1 A
T: sip:[email protected];p=xxxx
F: 123456789



STEP 5:要求Proxy Server开始接通过手机进行语聊,所以这里发出的是S,S=Service方法,用来请求服务器提供额外的服务,这个服务就是"StartVoiceChat"。
111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
S fetion.com.cn SIP-C/2.0
F: 123456789
I: 12
Q: 1 S
N: StartVoiceChat
L: 103

<args><voice-chat begin-date="2007-00-00 00:00:00.0000" /><users><user sid="987654321" /></users></args>


到这里就跟飞信客户端无关了,我猜测下面就是飞信服务器那边在通过7号信令接通两部手机,通过IVR给两部手机放音,然后捆绑话路,然后两部手机通过飞信的话路控制平台进行话音通话。

用户B那边呢?和用户A这边是一一对应的:

STEP 1: 用户B收到INVITE
222.222.222.222:2222 <<<<<<<< 221.130.45.203:8080
I 123456789 SIP-C/2.0
Q: 1 I
F: sip:[email protected];p=xxxx
I: -1
L: 178

v=0
o=-0 0 IN P4222.222.222.222:2222
s=VoiceChat
c=IN IP4 222.222.222.222:2222
t=0 0
a=user:sip:[email protected];p=yyyy
m=ivr 3418 sip sip:[email protected];p=xxxx

收到这个后,用户B的飞信会弹出窗口,问用户B是否接受用户A发起的手机语聊。这个消息的消息体中的a=,根据SDP,这里是<attribute>:<value>的形式。


STEP 2: 用户B发出同意消息:
222.222.222.222:2222 >>>>>>>> 221.130.45.203:8080
SIP-C/2.0 200 OK
I: -1
Q: 1 I
F: sip:[email protected];p=xxxx
L: 180

v=0
o=-0 0 IN P4222.222.222.222:2222
s=VoiceChat
c=IN IP4 222.222.222.222:2222
t=0 0
a=user:sip:[email protected];p=xxxx
m=ivr 1082 sip sip:[email protected];p=yyyy


STEP 3:收到用户A的ACK确认:
222.222.222.222:2222 <<<<<<<< 221.130.45.203:8080
A 123456789 SIP-C/2.0
Q: 1 A
F: sip:[email protected];p=xxxx
I: -1


到这里用户B手机也就响了。

其实,上面这整个过程体现的是真正的SIP过程,跟即时消息不同,SIP的出发点就是建立会话,至于会话的具体过程,如语音还是数据,用什么承载,是人对人还是人对机器,这都不是SIP协议所关心的事情,它最主要的任务只是建立会话。

你可能感兴趣的:(C++,c,C#,Blog,F#)