4.7 取得文件预览
客户端可以请求对方来获得下载文件的预览。预览是种独立的、随着文件类型不同而不同的应用。eMule 0.30e只支持图像预览。这个消息交换如图4.13描述,只包含两种消息:预览请求(6.5.11节)和预览回应(6.5.12节)。
5 客户端到客户端的UDP连接
eMule客户端周期性地用UDP协议发送消息。在eMule0.30e中,使用的UDP消息只是询问客户端在对方下载队列中的位置。这个简单的请求-应答方案是随着重复要求文件消息(6.6.1节)而开始的。对于这个请求,有三种可能的回应,如图5.1所示。
26
1. 队列等级 - 客户端在发送者队列中的等级 2. 队列满 - 发送者队列已满
3. 找不到文件 - 发送者在它的列表中没有被请求的文件
重复要求文件消息大约每20分钟的间歇发送到每个客户端,这些客户端把发送者加入到它的下载队列中。
27
6附录详细的消息编码格式
6.1 一般消息编码要点
本章描述了在TCP/UDP有效负载中消息编码的一般方法。
6.1.1 字节序
所有消息都是用 little-endian 编码,而不是 big-endian, big-endian 是约定的网络字节序。这个很容易解释,事实上客户端/服务器都是基于微软窗口的应用程式,运行在Intel处理器上。
6.1.2 消息头
所有的消息有一个6字节的头,头有着下面的结构:
1. 协议 - 一个字节,协议ID - 0xE3是eDonkey,0xC5是eMule
2. 大小 - 4字节消息大小 - 消息大小,以字节为单位,不包含头,例如,如果消息不包含任何有效负载,如6.4.11节中,则消息长度是零。 3. 类型 - 一个字节,类型 - 独一无二的消息ID
6.1.3 消息标签
标签类似TLV(类型,长度,值)结构,用来增加可选的数据到eMule消息中。有几种类型的标签,本章中列出了所有的标签。当提及到协议消息里特定的标签时,只有标签类型是指定的,读者应该把本章作为一个参考来确定协议消息的准确的结构。每个标签拥有4个域,在消息中它们并不都是连续的:
1.类型 - 1字节整型 2.名称 - 可以是以下之一 l 可变长度字符串 l 1字节整型 3.值 - 可以是以下之一 l 4字节整型 l 4字节浮点数 l 可变长度字符串
28
4.专用的 - 1字节整型,专用的标签指定者
带有整型值的标签叫做整型标签,类似的我们有字符串标签和浮点数标签。字符串标签的类型值是2,整型标签的类型值是3和浮点数标签的类型值是4。当标签被编码来发送时,是按照上面的次序编码,例如,类型,然后名称,最后是值。类型被编码成一个字节。名称被编码成2个字节长度值,可以是字符串名称和整型名称。例如,整型名称0x15编码顺序是0x01 0x00 0x15。
固定的值域(好像整型和浮点数字)正如它们这样写入,字符串值就以相同的长度值方式编码。
注意:标签给出的名称是没有特定的协议意义的,只是易于在以后的协议消息描述中引用。
6.2 客户端服务器TCP消息
本章描述了在服务器和客户端之间用TCP传送的消息。
6.2.1 登录
在TCP连接建立之后,客户端发送到服务器的第一个消息是登录消息。这个消息的长度可变的,因为它是依据用户的配置的,例如用户昵称。为什么客户端的TCP端口出现在TCP的头部,还是再发送(2次),这不是很清楚。
名称
Protocol(协议) Size (大小)
Type(类型)
User Hash (用户哈希) Client ID
字节大小 1 4
默认值 注释 0xE3
消息大小是以字节为单位,不包括头部和大小的域
1 16
0x01
OP_LOGINREQUEST操作码的值
关于用户哈希的细节可以在1.4节找到
4 0 在第一次连接中发送的用户ID通常是零。关于用户ID的细节可以在1.3节
29
(用户ID)
找到
TCP Port
Tag Count
Name Tag
Version Tag Port Tag Flags Tag
名称 Protocol Size Type Size
2 4662 客户端使用的TCP端口,可配置的
4 4 消息中跟随的标签数目
可变的 NA 用户的昵称(在软件中可配置)。这个标签是字符串标签,标签名称是值 为0x1的整数
8 0x3C 客户端支持的eDonkey版本。这个标签是整型标签,标签名称是值为0x11 的整数
8 4662 客户端使用的TCP端口。这个标签是整型标签,标签名称是值为0x0F的整 数
8 0x01 这个标签是整型标签,标签名称是值为0x20的整数
6.2.2 服务器消息
服务器消息是可变长度的消息,在不同的场合中,第一次客户端登录请求之后立即由服务器发送到客户端。一个服务器消息可以包含几个的消息,用换行操作符(’\\r’,’\\n’或两者)分隔。用”server version”,”warning”,”error”和”[emDynIP:”开头的消息对客户端有特定的意义。其它的消息简单地显示给用户。
字节大小 默认值 注释 1 0xE3
4 消息大小是以字节为单位,不包括头部和大小的域
1 0x38 OP_SERVERMESSAGE操作码的值
2 NA 消息剩余字节的数目,不包括目前描述的域
30