当两个客户端连接时,它们交换容量信息,然后协商一个下载(或者上传,根据看法)的开始。每个客户端有一个下载列表,记住一列等待下载文件的客户端。当eMule客户端下载队列空的时候,一个下载请求很可能会导致一个下载开始(除非,比如这个请求者被禁止)。当下载队列不是空的时候,就会将这个请求的客户端加入到队列中。在给定的时间内,不能为几个以上客户端各自提供最小带宽2.4k/s。一个下载的客户端可能被一个比它较高队列等级的等待的客户端抢占,在下载会话的最初15分钟内,正在下载的eMule客户端的队列等级会增加直到能防止被击溃。
当下载的客户端到达下载队列的头部时,上传的客户端初始化一个连接来给它发送需要的文件块。eMule客户端可以在几个其他客户端的等待队列中,都注册下载相同文件的块。当一个等待的客户端实际上完成了(从它们中的一个)下载文件块,它不会通知其他客户端在其队列中删除它,当它到达它们的队列头时只是简单的拒绝它们的上传意图。
EMuley用一个信用系统来鼓励上传,为了防止假冒用RSA公匙密码系统来保护信用系统。 客户端连接可能用一套eDonkey协议没有定义的信息,这信息称作扩展协议。扩展协议用来实施信用系统,一般信息的交换(像服务器和源列表的更新),通过收发压缩的文件块来改善性能。
当EMule客户端在等待开始下载文件时,有限地用UDP周期性检查在它对等的客户端上的上传队列客户端状态。
1.3 客户ID
客户ID是服务器在它们连接握手时提供的一个4字节标识符。客户ID只在客户-服务器TCP连接的生命期中有效,尽管万一客户端有一个高ID,所有的服务器都会分配它同样的ID直到IP地址改变。客户端ID分为低ID和高ID。当一个客户端不能接收一个输入连接时,eMule服务器将特有地分配给客户端一个低ID。拥有一个低ID会限制客户端对eMule网络的使用,和可能导致服务器拒绝一个客户端连接。高ID的计算是以客户端IP地址为基础的,如下所述。本节从eMule协议观点描述了客户ID的分配和重要性。允许其它客户端自由地连接到其本机上的eMule的TCP端口(默认端口号是4662)的客户端会分配给一个高ID。有高ID的客户端没限制使用eMule网络。当服务器无法打开一个TCP连接到客户端的eMule端口时,会分配一个低ID给该客户端。这主要发生在机器上装有防火墙的客户端,阻止了输入连接。当出现下面情况时,客户端也会接收到一个低ID: l 当客户端通过NAT或代理服务器连接
l 当服务器繁忙(导致服务器重连接计时器超时)
高ID用下面的方法计算:假设主机IP是X.Y.Z.W,ID就是X+2^8*Y+2^16*Z+2^24*W。低ID总是小于16777216(0x1000000),关于它是怎样计算的,我找不到任何线索,在不同的服务器中得到不同的低ID。
低ID客户端没有其他客户端可以连接到的公网IP,这样所有的交流必须通过eMule服务器完成。这增加了服务器计算能力的负担,并且导致服务器勉强接收低ID客户端。这也意味着低ID客户端不能连接到不在同一个服务器上的其他低ID客户端,因为eMule不支持在服务器
6
间管道连接。
为了支持低ID客户端,引入了回调机制。使用这机制,高ID客户端请求(通过eMule服务器)低ID客户端连接它来交换文件。
1.4 用户ID
eMule支持信用系统来鼓励用户共享文件。用户上传越多的文件给其他客户端,它接收的信用越多,它在它们的等待队列中前进得越快。
用户ID是128位(16字节)、连接随机数字创建的GUID,第6和第15字节不是随机产生的,它们的值分别是14和111。在整个客户端和指定的服务器会话中,客户ID是有效的,然而用户ID(也叫用户哈希)是唯一的并且跨越会话时用来识别客户端(用户ID识别工作站)。用户ID在信用系统中扮演重要角色,这为“黑客”假冒其他用户来获得他们信用赋予的优先权提供了动机。Emule提供加密方案设计来阻止欺骗和冒名顶替。这个实施是简单的应答交换,依靠RSA公有/私有钥匙加密。
1.5 文件ID
文件ID用来惟一的标识网络中的文件和文件损坏侦测和修复。注意,eMule不依靠文件名来惟一标识和编目文件,通过哈希文件内容计算出的GUID标识文件。有两种类型文件ID-一种主要用来产生惟一的文件ID,另一种是用来损坏侦测和修复。
1.5.1 文件哈希
文件是用由客户端和基于文件内容计算出来的128位GUID哈希来标识的。GUID是应用MD4算法到文件数据中计算而来。当计算文件ID时,文件被分成每段9.28MB长的部分。每部分单独计算出一个GUID,然后所有的哈希组合成一个惟一的文件ID。当下载的客户端完成一个文件部分下载时,它计算这部分哈希,然后和发送过来的这部分哈希对比,如果这部分发现损坏了,客户端尝试通过逐渐替换这部分中的位(每个180kb)来修复损坏部分,直到哈希计算OK。
1.5.2 根哈希
7
用SHA1算法来为每部分计算根哈希,基于每块180kb大小。它提供了更高等级的可靠性和可修复性,更多信息可在eMule官方网站得到。
1.6 eMule协议扩展
尽管eMule完全兼容eDonkey,它还是实行了几种扩展,允许eMule两个客户端为用户提供另外的功能。扩展只要集中在客户端与客户端的交流,特别是在安全和UDP使用领域上。在本文档中,所有信息流图标明的信息,是eMule扩展部分的,用灰色表示。
1.7 软件和硬件限制
在活动用户数量的服务器配置中有两种限制-软件和硬件。硬件限制远大于软件限制。当活动用户的数量达到软件限制时,服务器停止接收新的低ID客户连接。当用户数量达到硬件限制时,服务器满了,不再接收任何客户端连接。
2 客户端服务器的TCP交流
每个客户端用TCP精确地连接到一个服务器。服务器分配给客户端一个ID,在与服务器其余的会话中标识该客户端(高ID客户端总是根据它的IP地址分配)。eMule GUI客户端需要建立一个服务器连接来用于操作。客户端不能同时与几个服务器连接,也不能在没有用户干涉的情况下动态更换服务器。
2.1 建立连接
在准备建立与服务器的连接时,客户端会尝试并行地连接到几个服务器,根据成功的登陆顺序放弃其他的。
有下面几个可能的连接建立个案:
1、高ID连接-服务器分配一个高ID给正在连接的客户端 2、低ID连接-服务器分配一个低ID给正在连接的客户端 3、拒绝会话-服务器拒绝客户端
8
当然,也有不重要的个案-服务器崩溃或者不可连接。
图2.1高ID连接的信息顺序
图2.1描述了导致高ID连接的信息顺序。在这种情况下,客户端建立一个TCP连接到服务器,然后发送一个登录信息到服务器。服务器用另一个TCP连接到客户端,执行一个客户端-客户端的握手来保证连接的客户端有能力接收来自其他eMule客户端的连接。在完成客户端握手后,服务器关闭第二个连接,通过发送ID更改信息来完成客户端-服务器的握手。你可能注意到eMule信息消息是灰色的。这是因为这个消息是eMule协议扩展的一个部分(1.6节)
9
图2.2描述了导致低ID连接的信息顺序
图2.2描述了导致低ID连接的信息顺序。在这种情况下,服务器不能连接到发送请求的客户端,分配一个低ID给客户端。服务器消息一般包含警告信息,就像“警告[服务器细节] - 你是低ID。请察看你的网络配置和/或你的设置”低ID和高ID握手都是通过随着ID更改消息完成的,这个ID更改消息分配客户端一个客户端ID,用在与服务器的下一个会话。
图2.3描述了被拒绝的会话顺序。因为客户端拥有一个低ID或者到达了服务器硬件的容量限制,服务器就可能拒绝会话。服务器消息会包含一个短字符串描述拒绝的理由。
2.2 连接启动时消息交换
在建立成功的连接后,客户端和服务器交换几个设置消息。这些消息的目的是根据双方状态来双方更新。客户端通过提供它的共享文件列表(见6.2.4节)给服务器来开始,然后要求更新它的服务器列表。服务器发送它的状态和版本(6.2.6节和6.2.2节),然后发送它所知的eMule服务器列表和提供更多一些自我认定的细节。最后客户端要求源(可以访问下载它下载列表中的文件的其它客户端)和服务器回应一系列的消息,客户端下载列表中的每个文件,直到下载所有的源列表到客户端。图2.4图解了这个顺序。
10