eMule协议规范 附录 A - 消息编码 客户端服务器TCP消息

译自 Yoram Kulbak and Danny Bickson 《The eMule Protocol Specification》

翻译:lzcx

QQ:402722857

EMail: lzcx_cn@yahoo.com.cn

供学习用,转载请注明出处

6.2 客户端服务器 TCP 消息
 
本章描述了在服务器和客户端之间用TCP传送的消息。
 
6.2.1 登录
在TCP连接建立之后,客户端发送到服务器的第一个消息是登录消息。这个消息的长度可变的,因为它是依据用户的配置的,例如用户昵称。为什么客户端的TCP端口出现在TCP的头部,还是再发送(2次),这不是很清楚。
名称
字节大小
默认值
注释
Protocol(协议)
1
0xE3
 
Size
(大小)
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type(类型)
1
0x01
OP_LOGINREQUEST操作码的值
User Hash
(用户哈希)
16
 
关于用户哈希的细节可以在1.4节找到
Client ID
(用户ID)
4
0
在第一次连接中发送的用户ID通常是零。关于用户ID的细节可以在1.3节找到
TCP Port
2
4662
客户端使用的TCP端口,可配置的
Tag Count
4
4
消息中跟随的标签数目
Name Tag
可变的
NA
用户的昵称(在软件中可配置)。这个标签是字符串标签,标签名称是值为0x1的整数
Version Tag
8
0x3C
客户端支持的eDonkey版本。这个标签是整型标签,标签名称是值为0x11的整数
Port Tag
8
4662
客户端使用的TCP端口。这个标签是整型标签,标签名称是值为0x0F的整数
Flags Tag
8
0x01
这个标签是整型标签,标签名称是值为0x20的整数
 
 
6.2.2 服务器消息
服务器消息是可变长度的消息,在不同的场合中,第一次客户端登录请求之后立即由服务器发送到客户端。一个服务器消息可以包含几个的消息,用换行操作符(’/r’,’/n’或两者)分隔。用”server version”,”warning”,”error”和”[emDynIP:”开头的消息对客户端有特定的意义。其它的消息简单地显示给用户。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x38
OP_SERVERMESSAGE操作码的值
Size
2
NA
消息剩余字节的数目,不包括目前描述的域
Message
可变的
NA
一列服务器消息,用换行分隔
 
特别的消息
1、     版本 – 通常在成功的连接我手中发送
2、     错误 –
3、     警告 – 通常在服务器拒绝连接或者客户端是低ID时发送
4、     emDynIP –
 
 
6.2.3 ID 改变
服务器发送ID改变的消息,作为对登录请求消息的回应和表示服务器已经接收客户端的连接。消息大小为14或10字节,依赖于发送的可选TCP连接位图(TCP connection bitmap)。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x40
OP_IDCHANGE操作码的值
Client ID
4
NA
关于客户端ID的描述可在1.3节找到
TCP connection bitmap
4
0x000000001
当前只有1位(LSB)有意义,设置它为1来标识服务器支持压缩
 
 
6.2.4 文件提供
该消息被客户端用来描述可获得的当地文件,让其它客户端下载。如果客户端有文件提供,文件提供消息立即在连接建立之后发送。当客户端共享文件列表发生改变时,该消息也会发送。该消息的另一用法是周期地发送到服务器,保持活动状态。如果服务器支持压缩,文件提供(消息)会被压缩。当用作保持活动状态(没有文件压缩和消息大小很小)时,该消息不被压缩。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x15
OP_OFFERFILES操作码的值
File Count
4
NA
里面描述的文件数目。无论如何不超过200。服务器也可以为这个数目设置一个相对较低的限制
Files
可变的
NA
可选的文件列表,单个条目格式如下所述
 
单个文件条目格式
下面的表格描述了单个文件条目。在一个文件提供消息中可以有一系列的多个条目。
名称
字节大小
默认值
注释
Hash Code
16
NA
执行在文件内容上的哈希结果(TBD规范)。这个哈希用来唯一的标识文件,忽略不同客户端之间的名称差别
Client ID
4
NA
客户端ID,如果客户端有高ID,否则为零
Client Port
2
0x15
客户端TCP端口号,如果客户端是低ID则为零
Tag Count
4
NA
该域以下的标签的数目
File Name Tag
可变的
NA
(必选的)文件名称。这个标签是字符串标签,标签名称是值为0x1的整数
File Size Tag
8
NA
(必选的)文件大小,字节单位。这个标签是整型标签,标签名称是值为0x2的整数
File Type Tag
可变的
NA
(可选的)文件类型。以下之一:“Audio”、“Video”、“Image”、“Pro”或“Doc”。这个标签是字符串标签,标签名称是值为0x3的整数
File Format Tag
可变的
NA
(可选的)文件扩展名,小写。例如,“zip”、“exe”。这个标签是字符串标签,标签名称是值为0x4的整数
Media Length Tag
可变的
NA
(可选的)如果文件是mp3,歌曲播放时间。该标签是字符串标签,标签名称是“length”的字符串
Media Bitrate Tag
TBD
NA
(可选的)如果文件是mp3,编码位率。该标签是整型标签,标签名称是“bitrate”字符串
Media Codec Tag
可变的
NA
(可选的,从不发送)如果文件是影片,编码解码器。该标签是字符串标签,标签名称是“codec”的字符串
 
6.2.5 获得服务器列表
该消息在成功握手完成之后立即从客户端发送到服务器。当客户端被配置通过请求它当前服务器来扩大它的eMule服务器列表时,发送该消息。消息大小是6字节。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x14
OP_SERVERSTATUS操作码的值
 
6.2.6 服务器状态
从服务器发送到客户端。该消息包含关于服务器上用户和文件的当前数目的信息。消息中的信息不但存储在客户端也表现出给用户看。该消息大小14字节。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x34
 
User Count
4
NA
当前登录到服务器的用户数目
File Count
4
NA
服务器知道的文件数目
 
6.2.7 服务器列表
从服务器发送到客户端。该消息包含关于用另外的eMule服务器来扩展客户端服务器列表的信息。消息大小可变的(根据发送的服务器数目)。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x32
OP_SERVERLIST操作码的值
Entry Count
1
NA
该消息中描述的服务器数目
Server entries
(Entry Count) * 6
NA
服务器描述符条目,每个条目大小是6字节,包含4字节IP地址和2字节TCP端口
 
6.2.8 服务器身份证明
从服务器发送到客户端。包含服务器哈希(TBD),服务器IP地址和TCP端口(当通过代理连接时很有用处),还有服务器描述信息。消息大小可变的。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x41
OP_SERVERIDENT操作码的值
Hash
16
NA
服务器的GUID(好像用来调试用)
Server IP
4
NA
服务器IP地址
Server Port
4
NA
服务器监听的TCP端口
Tag Count
4
NA
在消息末处标签的数目
Server Name Tag
可变的
NA
服务器名称。该标签是字符串标签,标签名称是值为0x1的整数
Server Description Tag
可变的
NA
服务器描述字符串。该标签是字符串标签,标签名称是值为0xB的整数
 
6.2.9 搜索请求
从客户端发送到服务器。该消息用来通过用户的搜索字符串搜索文件。消息大小是可变的。搜索字符串可以包含布尔条件”AND”、”OR”、”NOT”。用户可以指定需要的文件的类型和大小,也可以设置一个有效的阈值(例如显示至少来自5个其它客户端的有效结果)。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x16
OP_SEARCHREQUEST操作码的值
Parsed search string
可变的
NA
解析搜索字符串格式,下面描述
File Type Constraint
可变的
NA
可选的。字符串条件。字符串值是“Audio”、“Video”、“Pro”或“Image”其中之一。类型域是3字节:0x1 0x0 0x3
Min Size Constraint
可变的
NA
可选的。整数条件。提供的文件大小单位是M。类型域是4字节:0x1 0x1 0x0 0x2
Max Size Constraint
可变的
NA
可选的。整数条件。提供的文件大小单位是M。类型域是4字节:0x2 0x1 0x0 0x2
Availability Constraint
可变的
NA
可选的。整数条件。设置一个较低的限制在提供搜索文件的客户端数目上。类型域是4字节:0x1 0x1 0x0 0x15
Filename Extension constrain
可变的
NA
可选的。字符串条件。类型域是3字节:0x1 0x0 0x3
 
解析的搜索字符串格式
解析的搜索字符串用布尔操作符‘AND’、‘OR’和‘NOT’与字符串操作数来编码一个表达式的二叉树。树是用预先顺序编码的。操作符编码成2字节整数,0x0对应‘AND’,
0x100对应‘OR’,0x200对应‘NOT’。字符串用TLV格式编码,这里,类型的域是一个字节值为0x1,长度的域是2字节整数。注意,当搜索字符串是一个单词,它就作为单个字符串操作数(没有操作符)编码。以后的eMule版本编码一个只有”AND”操作符的字符串搜索表达式,用空格符代替“AND”,这样适合服务器的搜索字符串解析,把一个语句分成一系列的用“AND”操作符分隔的单词。
 
可选的条件格式
条件是一序列的条目。每个条目以“AND”描述符(2字节0x00)开始,紧接着是已编码的条件。这样,整个搜索行格式是<“搜索字符串” AND 条件1 AND 条件2 等>,如下面的例子示意图所示。编码的条件被分成3个域:
1.        种类 – 单字节,描述是字符串条件(0x2)还是整数条件(0x3)
2.        值 - 要么是类型长度编码的字符串,要么是4字节整型值
3.        类型 – 3或4字节,描述条件的种类(查看上面的主表)
 
 
 
6.2.10 搜索结果
从服务器发送到客户端的消息,作为对搜索请求的回应。这个消息通常被压缩。消息大小可变的。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x16
OP_SEARCHRESULT操作码的值
Result Count
4
NA
消息中搜索结果的数目
Result list
可变的
NA
搜索结果列表
 
搜索结果列表项格式
下面的表格描述了一个搜索结果列表项的格式。每个搜索结果包含了一个哈希,这个哈希唯一地标识文件,连同拥有这个文件的其它eMule客户端的细节。也有几个标签描述了文件属性。标签列表如下所述。注意,大部分的标签是可选的,它们的次序是不保证的。标签编码规则在本章开头详细描述。
名称
字节大小
默认值
注释
File Hash
16
NA
哈希值,用来文件的唯一的身份证明
Client ID
4
NA
拥有文件的eMule客户端的ID
Client Port
2
NA
拥有文件的客户端的TCP端口
Tag Count
4
NA
下面描述符标签的个数
Tag list
可变的
NA
描述符标签列表
 
 
6.2.11 获得源
该消息从客户端发送到服务器,为文件请求源(其它客户端)。消息大小是22字节。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x19
OP_GETSOURCERS操作码的值
File hash
16
NA
请求文件的哈希
 
6.2.12 已找到的源
该消息从服务器发送到客户端,带有请求文件的源(其它客户端)。消息大小可变的。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x42
OP_FOUNDSOURCERS操作码的值
File hash
16
NA
请求文件的哈希
Sources Count
1
NA
消息中源的个数
List of sources
可变的
NA
源列表
 
源列表项格式
下面表格描述了源列表项的格式。每个源包含了拥有该文件的eMule客户端的细节。
名称
字节大小
默认值
注释
Client ID
4
NA
拥有该文件的eMule客户端的客户ID
Client Port
2
NA
拥有该文件的eMule客户端的TCP端口
 
6.2.13 回调请求
该消息从客户端发送到服务器,请求其它客户端回调 – 例如,连接到请求中的客户端。有高ID的、想连接到一个低ID客户端(见2.4节)发送该消息。消息大小是10字节。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x1C
OP_CALLBACKREQUEST操作码的值
Client ID
4
NA
被请求回调客户ID
 
6.2.14 被请求回调
该消息从服务器发送到客户端,指出另一个客户端要求接收的客户端连接它。当接收的客户端是低ID(见2.4节),发送该消息。消息大小是12字节。接收的客户端尝试连接这个由回调请求包指定的IP和端口。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x35
OP_CALLBACKREQUESTED操作码的值
Client IP
4
NA
请求呼叫自己的客户端IP
Client TCP Port
2
NA
客户端监听的TCP端口
 
6.2.15 回调失败
该消息从服务器发送到客户端,指出客户端的回调请求失败。消息大小是6字节。接收的客户端把这个消息记日志,然后丢弃它。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x36
OP_CALLBACK_FAILED操作码的值
 
6.2.16 消息被拒绝
该消息从服务器发送到客户端,指出服务器拒绝客户端发出的最后一条命令。消息是6字节。接收的客户端把这个消息记日志,然后丢弃它。
名称
字节大小
默认值
注释
Protocol
1
0xE3
 
Size
4
 
消息大小是以字节为单位,不包括头部和大小的域
Type
1
0x05
OP_REJECT操作码的值
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值