飞信文件传输协议简述
今天切回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,这些问题搞清楚了文件传输的实现就是时间的问题了。
Recent Comments