`

飞信分析之四:Fetion协议所支持的SIP方法及SIP消息头域

阅读更多

转载自:

http://hi.baidu.com/nathan2007/blog/item/a097c6249570a2004d088df6.html

 

作者:nathan

等着在淘宝上淘来的升级部件邮寄的时侯还是回到飞信吧,以下分析仍基于Fetion 2006 beta 2.1.0.0。

飞信所使用的协议版本标记是"SIP-C/2.0",协议栈中标记的版权信息是"Copyright (c) 2004-2006 China Mobile Limited. All rights reserved.",(再次说明飞信开发了很久了嘛;))。抓协议包初看的印象是,它基于IETF(Internet Engineering Task Force)所制定的标准SIP协议作了一丁点调整。关于标准的SIP协议,请参见IETF或RFC3261以及其它一些对它进行扩展的RFC,内容实在是太多了,不过如果有点基础的话,估计看个半小时的RFC就明白了个大概。另外,飞信照着微软做的,所以看微软的实时通信协议的说明也一样:Look

一个SIP的请求消息的格式是:请求行+消息头+空行+消息体,请求行的格式是:SIP方法+空格+接受方uri+空格+SIP协议版本,如:
    INVITE sip:bob@biloxi.com SIP/2.0
接下来是消息头部,消息头的格式跟http头格式一样,也是Field Name:Field Value的形式,如:
     Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
      Max-Forwards: 70
      To: Bob <sip:bob@biloxi.com>
      From: Alice <sip:alice@atlanta.com>;tag=1928301774
      Call-ID: a84b4c76e66710@pc33.atlanta.com
      CSeq: 314159 INVITE
      Contact: <sip:alice@pc33.atlanta.com>
      Content-Type: application/sdp
      Content-Length: 142

IETF SIP中对这些Header Field均有专门的定义,见RFC3261以及IETF的SIP草案文档。Fetion的SIP-C/2.0协议中用到的Header Field有:
    Authorization    缩写为"A"
    CallID        "I"
    Contact        "M"
    ContentEncoding    "E"
    ContentLength    "L"
    ContentType    "C"
    CSeq        "Q"
    Date        "D"
    EndPoints    "EP"
    Event        "N"
    Expires        "X"
    From        "F"
    MessageID    "XI"
    ReferredBy    "RB"
    ReferTo        "RT"
    Require        "RQ"
    RosterManager    "RM"
    Source        "SO"
    Supported    "K"
    To        "T"
    Unsupported    "UK"
    WWWAuthenticate    "W"


以上这些头域很多在RFC并没有定义,只在IETF的协议草案中有定义,如Event。SIP消息头后,由一个空行分隔,接下来就是SIP的消息体。消息体通过是用SDP协议描述的,见RFC2327,当然也有直接文本或XML表示的信息,消息体的格式按RFC中的定义,应由头部的Content- Type来决定,但飞信好象不是,具体是怎么定义,还没深入去研究,留待下次吧。


飞信所支持的SIP方法(SIP Method)有以下几种:
1. Ack方法。在Fetion的SIP-C/2.0中,缩写为"A",以下是一个Ack消息,会话(Session)发起方用以向SIP Proxy确认会话的开始:
A fetion.com.cn SIP-C/2.0
I: 16
Q: 1 A
T: sip:987654321@fetion.com.cn;p=1234
F: 123456789

其中:123456789是发起方的SIP地址,这个显然没按SIP标准来表达,只是用了一个飞信号码。sip:987654321@fetion.com.cn,这个是按标准表达的对方地址。

2.BENotify方法(Fetion缩写为"BN"),这不是个标准的SIP方法,既没在RFC中定义,也没出现在IETF的协议草案中,这是微软在其LCS中定义的:BENOTIFY ("best effort" notify)enhances server performance by eliminating the response requirement. Otherwise, a BENOTIFY request has the same behavior as NOTIFY. Applications that require NOTIFY support need to implement similar processing for BENOTIFY."(见MSDN)。就是个不需要回复的NOTIFY,微软扩展出这个方法是为了支持大量用户。以下是飞信的一个BENotify消息,表示用户987654321的在线状态的变化:
BN 123456789 SIP-C/2.0
Q: 13 BN
N: presence
X: xxxx
I: 9
L: xxx

<events><event type="PresenceChanged"><presence uri="sip:987654321@fetion.com.cn;p=xxxx"><basic value="100" device-id="PCCL025722" device-type="PC" device-caps="simple-im,im-session,temp-group" /></presence></event></events>



3.Bye方法(Fetion缩写为"B"),以下是一个BYE的请求消息,用以结束会话:
B fetion.com.cn SIP-C/2.0
F: 123456789
I: 11
Q: 2 B
T: sip:987654321@fetion.com.cn;p=1234


4.Cancel方法(C),用以取消正在进行中的INVITE请求。

5.Info方法(IN),用以在SIP协议中支持应用相关的控制信息,飞信传文件时,用到了这个方法。这是RFC中的一个扩展。以下是一个INFO方法的消息:
IN fetion.com.cn SIP-C/2.0
F: 123456789
I: 22
Q: 3 IN
T: sip:987654321@fetion.com.cn;p=1234
L: 266

<action type="share-content" method="request"><transmit type="relay" session-id="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /><file name="xxxxxx.xx" size="xxx" url="HTTP://221.130.45.206/hds/RamRelayDownloadShareContent.aspx?FileUri=xxxxxxxxxxxxx" /></action>


6.Invite方法(I),这是用建立会话过程的SIP方法。以下是飞信的INVITE方法的一个协议消息,表示用户123456789要求和987654321建立会话,准备进行文本消息的通信:
I fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 1 I
T: sip:987654321@fetion.com.cn;p=1234
K: text/html-fragment
K: multiparty
L: 137

v=0
o=-0 0 IN xxx.xxx.xxx.xxx:xxxx
s=session
c=IN IP4 xxx.xxx.xxx.xxx:xxxx
t=0 0
m=message 1769 sip sip:123456789@fetion.com.cn;p=xxxx



7.Message方法(M),这也是一个标准的SIP扩展,用以支持即时消息。以下是飞信的一个Message消息,用户123456789向用户987654321发消息说“Hello!你好” :
M fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 2 M
T: sip:987654321@fetion.com.cn;p=1972
C: text/html-fragment
K: SaveHistory
L: 121

<Font Face='Arial' Color='-16777216' Size='9'>hello! </Font><Font Face='SimSun' Color='-16777216' Size='12'>你好</Font>


8.Negotiate方法(NEG),这是一个IETF定义的SIP的方法,好象没见纳入RFC? 用以在会话建立(INVITE)前的协商会话相关的参数,但没见飞信用啊....以后再说。

9.Notify方法(N),这是IETF定义的一个SIP扩展方法,并被RFC接纳,见RFC3265。消息见前面的BENotify。这个消息是需要进行回复的。

10.Options方法(O),标准的SIP方法,用来查询对端或服务器的能力。比如了解对方支持什么编码类型。在飞信传文件时使用了以下消息:
O fetion.com.cn SIP-C/2.0
F: 123456789
I: 22
Q: 2 O
K: ShareContent
T: sip:987654321@fetion.com.cn;p=xxxx

11.Refer方法(REF),这是已纳入RFC的一个SIP扩展方法,其功能是要求接受方通过使用在请求中提供的联系地址信息联系第三方。

12.Register方法(R),这是SIP的标准方法,用来向服务器登记。如以下飞信在注册时发出的消息:
R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 2 R
A: Digest response="xxxxxxxxxxxxxxxxxxxxxxxxxx",cnonce="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
L: 147

<args><device type="PC" version="131" /><caps value="simple-im;im-session;temp-group" /><events value="contact;permission;system-message" /></args>


13.Service方法(S),这是IETF定义的一个SIP扩展方法,好象未纳入RFC?用来向SIP服务器请求额外的服务。如一下飞信发出的消息:
S fetion.com.cn SIP-C/2.0
F: 123456789
I: 2
Q: 1 S
N: GetPersonalInfo
L: 172

<args><personal version="11" attributes="all" /><services version="11" attributes="all" /><config version="109" attributes="all" /><mobile-device attributes="all" /></args>

以上是飞信客户端要求服务器返回用户信息。又如:
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-01-01 00:00:00.1234" /><users><user sid="987654321" /></users></args>

这是通过服务器开始飞信语聊。


14.Subscribe方法(SUB),这是IETF定义的一个SIP扩展方法,并被RFC接纳,见 RFC3265。这个方法被用来向服务器订阅事件异步通知。服务器就会用NOTIFY或BENOTIFY(微软扩展的)方法,将事件通知给飞信客户端。如飞信订阅用户的presence事件,比如上线啊,下线啊什么的:
SUB fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 1 SUB
N: presence
L: xxx

<args><subscription><contacts><contact uri="sip:xxxxxxxx@fetion.com.cn;p=xxxx" /><presence><basic attributes="all" /><personal attributes="all" /><extended types="sms;location;listening;ring-back-tone" /></presence></subscription></args>




以上只是粗粗列出了飞信按SIP协议的实现的一些SIP方法,具体的协议通信过程还需要具体分析。后面有空再做吧。

另外,飞信的协议为什么叫SIP-C呢?放狗一查,没找到这个,只查到一个SIPC的,那是Columbia大学的一个SIP协议的IP电话软件。是 SIP-CHINA? SIP-CHINAMOBILE? SIP-COMPACT? 我估计是Compact,因为SIP方法在SIP规范中是不用缩写的,只有Header中才用缩写,以便在UDP报文上承载,缩写一下,然后丢掉SIP要求的URI的规范表达,简化Header的支持,就Compact了,就自主创新了,嘻嘻 ;)

分享到:
评论

相关推荐

    飞信2006正式版:Fetion2006_2.3.0210

    还是用回2006版,2008版的飞信程序太臃肿了,启动得慢。建议用回2006版的!!!

    PHP飞信发送类(PHPFetion)1.2.0

    (2) send()方法是有返回值的,可以通过分析文本判断是否发送成功。考虑到wap界面会改动,所以没有在类里写死关于发送成功的判断; (二)实现原理 1. 利用socket模拟登录wap版飞信,并模拟发送飞信,好处是不会...

    ubuntu下支持2010飞信协议的fetion

    ubuntu下支持2010飞信协议的fetion 不是以前的linuxfetion

    飞信 fetion_2008

    1. **即时消息**:飞信支持文字、表情、图片等多种形式的消息传递,用户可以实时与好友交流,无论是手机用户还是电脑用户,都能接收到消息通知。 2. **免费短信**:对于中国移动的用户,飞信的一大亮点就是能够向...

    PHP飞信(PHPFetion)发送类v1.2

    (2) send()方法是有返回值的,可以通过分析文本判断是否发送成功。考虑到wap界面会改动,所以没有在类里写死关于发送成功的判断。 (二)实现原理 1. 用PHP发送HTTP请求模拟登录WAP版的飞信,并模拟发送飞信。实现...

    飞信.ppt飞信.ppt飞信.ppt飞信.ppt

    飞信支持的SIP方法有: 1. ACK方法:用于会话发起方向SIP代理确认会话开始。 2. BENotify方法(Fetion的BN缩写):这是一个无需回复的NOTIFY,用于通知用户状态变化。 3. BYE方法:结束会话的请求。 4. CANCEL方法...

    Fetion客户端的简单实现

    飞信,全称为中国移动飞信,是一款融合了即时通讯与短信功能的应用,让用户可以通过网络免费发送短信至手机,同时也支持网络内的即时聊天。在本文中,我们将深入探讨如何使用C++来实现一个简单的飞信客户端,并涉及...

    飞信协议分析

    协议分析是指对飞信软件在实现通信时所使用的技术细节和规则进行研究,这对于理解飞信的运作机制、开发基于飞信的第三方应用或对现有应用进行优化都具有重要的意义。 描述中提到的“史上最完整的飞信文档,支持...

    Fetion.rar_fetion_移动飞信_飞信

    飞信,全称为中国移动飞信,是一款由中国移动推出的融合通信服务,它允许用户通过互联网或者手机免费发送短信、语音消息,同时支持多方通话和在线聊天功能。在IT领域,飞信因其开放的API接口和SDK,成为了开发者进行...

    Fetion.rar_fetion_飞信

    飞信,全称为中国移动飞信,是一款由中国移动推出的融合通信服务,它允许用户通过网络或者短信方式免费向手机和电脑用户发送消息。"Fetion.rar_fetion_飞信"这个压缩包文件可能包含了飞信的应用程序安装文件,即...

    fetion(飞信) for linux

    飞信,全称为中国移动飞信,是一款由中国移动推出的即时通讯软件,它允许用户通过网络进行免费的文字、语音以及视频通信。在Linux操作系统中,飞信的使用为用户提供了跨平台的沟通便利,打破了Windows系统对这类应用...

    Fetion.rar_fetion_fetion 3_fetion java_fetion3

    飞信是中国移动推出的一款免费即时通讯软件,名为"Fetion",它允许用户通过手机或电脑进行文字、语音甚至视频的通信。在这个压缩包文件中,我们看到的是一个针对飞信3.0版本的修改版,名为"Fetion 3_fetion java_...

    移动飞信协议分析与接口调用资料整理

    飞信协议分析与接口调用是理解其工作原理和技术实现的关键,这对于开发者来说具有重要价值,特别是对于想要利用飞信API进行二次开发或者集成到自己的应用中的人员。 首先,我们来看"飞信2006分析"和"飞信2010分析...

    飞信Fetion 2008.zip

    飞信飞信飞信飞信Fetion 2008.zip飞信Fetion 2008.zip飞信Fetion 2008.zip飞信Fetion 2008.zip飞信Fetion 2008.zip飞信Fetion 2008.zip飞信Fetion 2008.zip

    Fetion_NN81_SYMBIAN200

    nokia N81手班飞信飞信(英文名:Fetion)是中国移动提供的可同时在电脑和手机上使用,能实现消息、短信、语音等多种沟通方式的综合通信服务。 飞信可通过PC客户端、手机客户端或WAP方式登录,也可用普通短信方式与...

    java飞信接口,FetionApi(无license限制,附可运行例子,简单文档说明,eclipse项目)

    private static Fetion fetion = null; public static void main(String[] args) throws Exception{ String mobile = null; String pwd = null; if(args==null || args.length){ System.out.println(...

    飞信接口java Fetion Api java

    final Fetion fetion = new Fetion("phone","password"); fetion.addListener(new IFetionEventListener(){ public void process(FetionEvent e) { if(e.getFirstLine()!=null && e.getFirstLine...

    飞信交互过程飞信交互过程

    接着是消息头,包含多个字段,如`From`(From字段,表明请求的来源)、`Call-ID`(全局唯一的通话标识)、`CSeq`(命令序列号,用于标识消息顺序)、`To`(To字段,接收方标识)、`Supported`(客户端支持的特性)和...

    Fetion.rar_fetion_fetion Visual Basic_飞信

    在“Fetion.rar_fetion_fetion Visual Basic_飞信”这个压缩包中,我们可以看到与飞信相关的编程资源,特别是与Visual Basic的结合,这表明它是关于如何使用Visual Basic来控制和操作飞信的教程或者代码示例。...

    webFetion网页版本飞信客户端

    【标题】:“webFetion网页版本飞信客户端”是一个基于网页的即时通讯服务,它允许用户通过浏览器进行短信发送、在线聊天等操作,无需安装专门的客户端软件。飞信是中国移动推出的一款通信服务,旨在融合互联网和...

Global site tag (gtag.js) - Google Analytics