转载自:
http://hi.baidu.com/nathan2007/blog/item/1ee3823422ebbdb6d1a2d376.html
作者:nathan
以下分析基于Fetion 2006 beta 2.1.0.0,其SIP-C协议的版本是2.0。
前面列出了飞信的SIP-C协议支持的所有SIP Method以及Header Field,下面就两个用户间的聊天,即互相发送文本消息来看看飞信通过SIP-C协议的工作过程。
先看看RFC规定的SIP的建立会话的标准过程,在RFC3261中通过SIP建立会话的过程是这样子的:
atlanta.com . . . biloxi.com
. proxy proxy .
. .
Alice's . . . . . . . . . . . . . . . . . . . . Bob's
softphone SIP Phone
| | | |
| INVITE F1 | | |
|--------------->| INVITE F2 | |
| 100 Trying F3 |--------------->| INVITE F4 |
|<---------------| 100 Trying F5 |--------------->|
| |<-------------- | 180 Ringing F6 |
| | 180 Ringing F7 |<---------------|
| 180 Ringing F8 |<---------------| 200 OK F9 |
|<---------------| 200 OK F10 |<---------------|
| 200 OK F11 |<---------------| |
|<---------------| | |
| ACK F12 |
|------------------------------------------------->|
| Media Session |
|<================================================>|
| BYE F13 |
|<-------------------------------------------------|
| 200 OK F14 |
|------------------------------------------------->|
| |
上图中F1-F14分别是步骤的编号,而Medai Session过程在飞信中,就是文本聊天消息的传递过程了。在RFC3428中对标准SIP的扩展了一个Message方法,通过Message方法承载这种即时消息,这样,上图中的Media Session按RFC3428的规定,就是这样的:
| F1 MESSAGE | |
|--------------------> | F2 MESSAGE |
| | ----------------------->|
| | |
| | F3 200 OK |
| | <-----------------------|
| F4 200 OK | |
|<-------------------- | |
| | |
| | |
| | |
User 1 Proxy User 2
飞信是完全依照以上RFC的要求来实现这一过程来的。
下面来看飞信具体实现的聊天过程是怎么样的。假定有这么一个聊天过程是:飞信用户A(飞信号为123456789,飞信用TCP方式工作在 111.111.111.111:1111)双击好友列表中的飞信用户B(飞信号为987654321,飞信用TCP方式工作在 222.222.222.222:2222),这时聊天窗口弹出,用户A对B发出:"Hello!测试“,然后用户A关闭了聊天窗口,结束了这次即时消息对话过程。
我们看用户A这一端来看整个聊天过程中,用户A与服务器(SIP的Proxy Server)的交互过程是 (请对照上面RFC的SIP会话建立过程,另外,下面的红色字是表示数据的发送方向,蓝色字是全部的SIP消息,即TCP包的包体部分。):
第一步:111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
I fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 1 I
T: sip:987654321@fetion.com.cn;p=1972
K: text/html-fragment
K: multiparty
L: 137
v=0
o=-0 0 IN 111.111.111.111:1111
s=session
c=IN IP4 111.111.111.111:1111
t=0 0
m=message 1111 sip sip:123456789@fetion.com.cn;p=xxxx
上面是发到服务器的第一条消息,是一个SIP协议的INVITE请求,发到飞信的服务器,服务器地址是221.130.45.203,端口8080,协议是TCP,上面的SIP消息就直接放在TCP的包中,UTF-8编码。
消息的第1是请求行,I=INVITE(这缩写的标准在哪里?我还没找到来依据),fetion.com.cn是请求对象(又没用标准的uri),"sIP-C/2.0"是当前的SIP-C协议版本。
第2行开始是消息头:"F"即From,标识从用户A(123456789)发出的请求(依然没用标准uri,应该是 sip:123456789@xx.fetion.com.cn才对吧....);"I"即CallID,按标准的SIP的规定,这应该是一个随机产生的一个全局唯一的标识符,它应该在客户端和服务器整个交互的过程中保持不变,但在飞信的SIP-C协议中,这是一个序列号,第一次与8080端口建立连接发出第一个请求时,这个值为1,以后每次发出一个请求则加1;"Q"即CSeq,也就是Command Sequence,它由一个整数的序列号和一个SIP方法组成,SIP方法与这个消息的SIP方法相同,这个序列号在一个会话过程中每次加1,这样来标识 SIP消息的顺序;"T"就是To啦,这里倒是用了标准uri的表示,"K"即Supported,表示客户端所支持扩展;"L"即Content- Length,就是消息体的长度。
从v=0开始的是消息体,用SDP(Session Description Protocol)描述的,根据RFC:
v= (protocol version),在目前飞信的INVITE中,固定的v=0
o= (owner/creator and session identifier). 在目前飞信的INVITE中,前面是固定的,后面是发起人(用户A)的IP地址和端口
s= (session name). 在目前飞信的INVITE中,固定的为s=session
c=* (connection information - not required if included in all media).在目前飞信的INVITE中,除后面的发起人(用户A)的IP地址和端口外,前面是固定的。
t= (time the session is active) 。在目前飞信的INVITE中,固定的为"t=0 0"
m= (media name and transport address)。在目前飞信的INVITE中,"1111"是发起人的TCP端口,后面的sip:xxxxxxxx,是发起人的uri。
第二步:111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 100 Trying
Q: 1 I
T: sip:987654321@fetion.com.cn;p=xxxx
I: 16
这是服务器回过来的对第一步的INVITE消息的一个RESPONSE,所以,I=16,Q=1 I。表示正在查找用户B。
第三步:111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 200 OK
Q: 1 I
K: text/html-fragment
K: multiparty
T: sip:123456789@fetion.com.cn;p=xxx
I: 16
L: 135
v=0
o=-0 0 IN 222.222.222.222:2222
s=session
c=IN IP4 222.222.222.222:2222
t=0 0
m=message 2222 sip sip:987654321@fetion.com.cn;p=xxx
这是服务器转过来的用户B对用户A的INVITE的回复,是:OK,其中222.222.222.222:2222是用户B的IP和端口。
第四步:111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
A fetion.com.cn SIP-C/2.0
I: 16
Q: 1 A
T: sip:987654321@fetion.com.cn;p=xxx
F: 123456789
接着,用户A发出ACK消息。
第五步:111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
M fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 2 M
T: sip:987654321@fetion.com.cn;p=xxxx
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>
这就是用户A向对方发的即时消息,内容是“hello!测试"。这里用的是SIP Message方法,消息体是XML表示的即时消息,消息头跟INVITE相似。
第六步:111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 200 OK
Q: 2 M
T: sip:123456798@fetion.com.cn;p=xxxx
I: 16
D: Mon, 01 Mar 2007 00:00:00 GMT
XI: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
这是用户B收到第五步发出的即时消息后回过来的RESPONSE,结果是OK,其中XI这个消息头域的MessageID。
第七步:111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
B fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 3 B
T: sip:987654321@fetion.com.cn;p=xxxxx
这是用户A开始关闭聊天窗口准备结束聊天了,向用户B发出了一个BYE的SIP请求消息。
第八步:111.111.111.111:1111 <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 200 OK
Q: 3 B
T: sip:123456789@fetion.com.cn;p=xxxx
I: 16
这是最后用户B对对用户A发出的BYE的回复。
在用户B那边,整个交互过程跟用户A这边对应,用户A在发出INVITE,要求和B会话,而用户B这边则是回应邀请。
那发短信是怎么样的呢?也基本差不多,如发一个内容为test的短信到用户B时的SIP Message请求消息是这样的:
111.111.111.111:1111 >>>>>>>> 221.130.45.203:8080
M fetion.com.cn SIP-C/2.0
F: 12345678
I: 16
Q: 1 M
T: sip:987654321@fetion.com.cn;p=xxxx
N: SendSMS
L: 4
test
以上分析都是飞信通过TCP直连方式工作时的情况,飞信通过HTTP直连呢?工作过程跟上面完全一样,不同的是,连接的是221.130.45.203:80,协议是HTTP,采用的POST请求是:
POST /ht/sd.aspx?t=s&i=2 HTTP/1.1
POST的数据分就是上面一样的SIP消息了。
飞信发送通过即时消息聊天时,整个过程就是这样子。通过这个分析,我们也可以看到,飞信聊天时整个内容是既未加密又未变换的(MSN还作了点点变换),因此聊天过程是可以被截取的,因此通过飞信聊天是会被别人偷听的,就如同去年MSN曝出的监听事件一样。那这个问题是可以解决的吗?当然是可以的,其实扩展SIP的Message方法时,RFC中就提到这一点,我想飞信目前只是没去做,一旦这个问题暴露出来,对聊天内容进行加密,甚至是公开密钥的端到端强加密,都是可能和容易的,只不过不知道会不会不符合监管要求,呵呵:)。
补记:发现了吗?上面分析中提到的URI(在Header Field "To"中)中都带着小尾巴:p=xxxx,这里的xxxx是个数字,怎么来的呢?文中我没解释,因为我还没完全搞清楚,下回再说。
分享到:
相关推荐
飞信是一种基于TCP协议的即时通讯工具,其交互过程主要涉及SIP(Session Initiation Protocol)协议,用于建立和管理通信会话。在上述描述的飞信聊天过程中,我们可以详细分析以下几个关键知识点: 1. **SIP协议**...
飞信,作为中国移动推出的一款即时通讯软件,曾经在2000年代中期风靡一时,它允许用户通过手机和互联网进行免费短信收发、语音聊天等服务。此资源是飞信的源代码,对于想要深入理解即时通讯软件开发或者对C#编程语言...
飞信是中国移动推出的一款即时通讯软件,它曾经在2000年代中期风靡一时,允许用户通过手机或互联网免费发送短信、语音消息、图片等。飞信的源代码是这款软件开发的基础,包含了实现其功能的所有编程语言脚本、数据库...
### 基于XMPP协议的多端即时通讯方案 #### 一、开发背景 ##### 1、国际背景 随着互联网技术的飞速发展,即时通信已成为人们日常沟通的重要方式之一。1996年,Mirabilis公司推出的世界首个即时通信系统ICQ,标志着...
通过分析飞信PC端的源码,我们可以深入理解其工作原理,包括如何与移动通信网络交互,如何处理用户的输入,以及如何实现消息的加密和传输等关键功能。这对于想要从事即时通讯应用开发或者提升自己在该领域技能的...
此源码集成了实现飞信功能的所有必要组件和类,允许开发者深入理解飞信协议,定制自己的飞信客户端,或者作为学习C#网络通信和即时通讯应用开发的参考。 在描述中提到的“所需的各种引用”,这意味着源码包含了与...
易语言飞信是一款基于易语言开发的即时通讯软件,它实现了类似飞信的功能,允许用户通过网络免费发送短信,进行语音聊天,以及分享文件等。易语言是一种中国本土开发的编程语言,以其简明易懂的语法设计,使得编程变...
飞信是一款由中国移动推出的即时通讯软件,它允许用户通过互联网免费发送短信到手机,同时也支持网络聊天、群聊、文件传输等功能。对于开发者而言,飞信的C#源码是研究其工作原理、学习网络通信及多平台交互的重要...
在这个项目中,"WebApplication1"可能是一个用某种服务器端语言实现的Web应用,它演示了如何使用修改后的飞信接口来发送消息。 总的来说,这个资源可以帮助开发者快速实现通过Web应用发送飞信的功能,特别是群发...
标题 "c# 飞信 demo" ...通过分析和运行这个Demo,开发者可以学习到如何在实际项目中使用飞信API,以及如何在C#环境中实现相关的网络通信功能。这不仅对提升C#编程技巧有帮助,也能加深对即时通讯系统工作原理的理解。
1. **即时通讯协议**:飞信可能使用了自定义的通讯协议,或者基于现有的如XMPP、MQTT等协议进行扩展。了解这些协议有助于我们理解飞信如何实现实时的消息传输和状态同步。 2. **网络编程**:源码中涉及TCP/IP网络...
在飞信Delphi版的源代码中,我们可以看到如何利用这些组件来实现聊天窗口、联系人管理、消息发送等功能。 1. **Delphi编程基础** - **Object Pascal语言**:Delphi的基础是Object Pascal,一种面向对象的Pascal...
6. **网络通信**:使用TCP/IP协议或者其他网络库实现客户端和服务器之间的实时通信,保证消息的即时传输。 7. **用户界面设计**:参照飞信,设计出友好的用户界面,提供良好的用户体验。 以上是关于这个模拟聊天...
为了存储用户的聊天记录、联系人信息等,飞信客户端可能使用了数据库,如SQLite或MySQL。Java的JDBC API提供了与各种数据库交互的能力,包括连接、查询、插入和更新数据。 9. **安全性** 鉴于飞信涉及用户隐私,...
飞信是中国移动推出的一种即时通讯服务,它允许用户通过手机或电脑进行文本、语音甚至视频聊天。在给定的信息中,我们关注的是一个名为"fetion_php"的PHP类库,用于与飞信服务进行交互。这个类库包含了三个主要的PHP...
4. **用户界面**:Delphi的VCL库提供了丰富的组件,如TButton、TLabel、TMemo等,源码会用这些组件构建飞信的用户界面,包括登录窗口、联系人列表、聊天窗口等。 5. **数据库操作**:为了存储用户信息、联系人列表...
在移动通信领域,飞信作为一款免费的即时通讯软件,以其独特的短信、语音聊天功能深受用户喜爱。本资源提供了基于Android 1.5版本的飞信手机客户端源码,对于开发者而言,这是一个极其宝贵的参考资料,可以帮助我们...
飞信Fetion是一款由中国移动推出的即时通讯软件,它允许用户通过互联网或手机进行免费的短信、语音聊天和文件传输等通信服务。标题中的“未溷淆代码.src.zip”表明这是一个包含了飞信Fetion源代码的未混淆压缩包,这...