存档

‘Protocol’ 分类的存档

飞信文件传输协议简述

二月 3rd, {2010 没有评论 3,922 人阅读过  

今天切回win分析了一下飞信的一些零散的功能的协议,觉得好不容易切过来就抢包看了看文件传输的协议。状态机我就不细划了,简单的地写一下几个重要的点:
当发起文件传输请求的时候,客户端向服务器发起ShareContent的请求:

fetion.com.cn SIP-C/2.0
F: 916098834
I: 3
Q: 0 O
K: ShareContent
T: sip:572003969@fetion.com.cn;p=4599
L: 460

1
2
3
4
5
6
7
8
9
<share-content id="6b984ea5-2e66-48f4-acb3-60513160162a">
<caps modes="block;relay;p2p;p2pV2;relayV2;p2pV3;scV2" max-size="2097151" />
<client outer-ip="" inner-ip="59.64.128.137:1429;" port="1428" />
<fileinfo>
<transmit type="p2p" session-id="xz4BBcV6b984ea52e6648f4acb360513160162a" />
<file name="Desktop.rar" size="526697" url="" 
md5="1a0edaa0a213be4a28d415594a150053" id="6b984ea5-2e66-48f4-acb3-60513160162a" file-type="unknown" />
</fileinfo>
</share-content>

这里面包含几个重要的字段,session-id,id,md5
md5显而易见是对要传输的文件做md5散列运算得出的字符串,用于在接收端对文件内容的完整性进行校验。
id 其实是Guid,也就是全局唯一标识符,它指在一台机器上生成的数字,在同一时空中不会有另一台机器上的数字与它相同。
官方飞信是能C#开发的,GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:337c7f2b-7a34-4f50-9141-bab9e6478cc8 即为有效的 GUID 值。 查看了一下飞信生成Guid用了一句话:

System.Guid.NewGuid().ToString("D");

session-id的生成是这样的,把id中的‘-’去掉,然后在前面加上”xz4BBcV”这个字符串,C#代码如下:

1
2
3
4
5
6
7
public string SessionId
{
    get
    {
        return ("xz4BBcV" + this.SessionGuid.ToString().Replace("-", string.Empty));
    }
}

filetype字段的定义

1
2
3
4
5
public enum ShareContentFileType
{
    Unknown,
    DirectSendImage
}

接收端接收文件时向服务器发送如下信息:

IN 916098834 SIP-C/2.0
I: 1
Q: 4 IN
F: sip:572003969@fetion.com.cn;p=4599
L: 201

1
2
3
<share-content action="accept">
<file id="c36b9ea6-7704-4860-a323-9470db7fab74" />
<client prefer-types="FFFFFFF" inner-ip="3B408089" net-type="7" udp-inner-port="1497" tcp-port="1496" /></share-content>

id就不用说了,在同一个会话中都使用一个id,prefer-types是指接收端希望使用的传输协议,共有如下几种类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum ShareContentType
{
    All = 0xfffffff,
    None = 0,
    P2P = 0xff00,
    RelayAndBlock = 1,
    TCP = 0x100,
    UDP = 0x200,
    V2All = 0xff0000,
    V2HttpRelay = 0x200000,
    V2TcpClient = 0x20000,
    V2TcpRelay = 0x100000,
    V2TcpServer = 0x10000,
    V2Udp = 0x40000
}

在这里使用FFFFFFF表示可以使用所有的类型进行传输,后来分析了一下发现其实飞信文件传输用的一直都是P2P。
OK,这些问题搞清楚了文件传输的实现就是时间的问题了。

分类: Protocol 标签: ,