3. 客户端服务器UDP通信
Emule的客户端和服务器通过不可靠的UDP信息保证在线和搜索增强。Emule 可户端发送的UDP数据包流量可以达到它发送数据包总和的5%,这和客户端服务器列表中的服务器数目,每个文件的源数目,客户端之前的搜索数目有关。UDP数据包每100ms由计时器触发一次。每次采用一个线程以最大10个UDP包/秒的速度进行传输。
3.1服务器保持在线和状态信息
客户端周期性的对服务器列表中的服务器进行效验,这个效验是通过UDP服务器效验信息和服务器状态信息完成的。简单的保持在线信息是在每个时间间隔发送若干个UDP数据包进行的,最大的传输速率是每5秒一个UDP数据包。
客户端对服务器的查询信息中包括:一个随机的令牌号,服务器的回应信息中也包括同一个令牌。如果服务器返回的回应信息中的令牌号不符,客户端将丢弃这个令牌。在客户端每次请求服务器状态信息时,它都将对请求进行计数。任何从服务器返回的信息都将重置这个记数。当这个请求计数到达预先设置的数值时,客户端认定服务器不可达,并将其从服务器列表中移出。服务器状态的回答中包含了服务器现有的客户机数和注册的文件数,也包含了服务器的软硬极限。服务器描述数据包包含了服务器名和一小段服务器描述信息。
3.2 加强的文件搜索
Emule客户端可以通过配置使用UDP数据包来加强文件搜索,和TCP的搜索方式基本相同。但是UDP搜索允许用户依次搜索服务器列表中的每个服务器。
3.3加强的源搜索
当发现的源数目少于预先设定的数值(一般情况是100)时,客户端就会采用UDP 方式进行增强的源搜索。具体做法是发送UDP数据包倒其服务器列表中的其他服务器,数据包每1秒种发送一个,这使得源查询数据包成为客户机产生的主要UDP 流量。数据包净荷的格式与TCP 源查找包的格式相同。UDP数据包是否被减弱和返回的源的数目有关。
4.客户端与客户端的TCP连接
在在服务器端注册,并获得源的ip地址之后,客户端就要连接到其他的客户端以便传输数据。对每一个{文件,客户机}都建立一个专门的TCP连接。 当客户机显式的关闭连接或者在40秒内没有sockte活动的时候连接就会被关闭。
为了保证下载率,emlue在每个下载者的平均带宽小于2.4kb/s的时候就会拒绝新的客户机连接。
4.1初始握手
初始握手是对称的,每部分都发送相同的数据包。客户端交换彼此的认证,客户端版本,容量等信息。整个过程包含两类数据包,hello数据包和emule扩展数据包。前一个部分是edonkey的数据包,兼容edonkey 协议。后面的则是emule扩展的,包含安全认证和源交换信息。
4.2安全的用户认证
在1.4简要的介绍了用户的 ID和用户为什么要伪装成别人。安全的用户认证属于emule的扩展协议。在客户端支持的情况下,在初始握手之后马上就进行用户的安全认证。按照如下步骤执行:
(1) 在初始阶段,B表示支持安全认证功能。
(2) A检查是否需要B的公钥,然后发送一个需要B认证的4byte的数据。
(3) 假如A确定需要B的公钥,B发送公钥给A。
(4) B发送经过认证的数据,同时还有附加信息。如果B是low ID , 那么附加A 的IP 地址。如果B是high ID,那么附加B的ID。
4.2.1 信用系统
信用系统的目的是鼓励用户上传文件。当用户上传数据的时候,下载方根据其上传的数据量为其信用系统增加积分。信用系统并不是全局的,而是存储载下载方本地,也仅仅在下次上传方请求同一下载方的文件的时候才发生作用。信用积分按照如下规则计算:
(1) 上传的数据量*2/下载的数据量,当下载量为0的时候整个等式取10。
(2) 上传的数据量+2以后的平方根。当上传的数据量小于1 MB时,整个等式取1。
上传/下载的数据量采用mb计算,所以信用积分不会大于10也不会小于1。
4.3 请求文件
前面已经提到,对于每一个{文件,客户机}对,都建立一个特定的连接用于文件传输。在连接建立之后,通信的双方就发送下载文件的查询信息
4.3.1 基本信息交换
基本信息由4类信息构成。A通过传送文件ID来进行文件查询。B 对特定ID的文件给出应答。扩展的协议还包括如下的信息:如果B也正在下载这个文件的话,那么它将传送已知的源信息给A。同时,B 也可以传送任何一个B已经完成的文件分片。
4.3.2 不能定位文件
当A提交查询请求给B,但是B不能定位文件。那么B将忽略这个查询信息。并传送一个包含此文件ID 的文件不能定位信息。
4.3.3 不能处理上传请求
当B成功的定位了A想要下载的文件,A,B双方按照前面描述的方式建立了连接。但是,这是B的上传队列可能不空,也就是有用户正在下载这个文件。这时,B将A加入其上传队列,并发送排队信息给A,并在其中包含A的位置信息。
4.3.4 上传队列管理
对于每个共享文件,emule维护了一个上传队列以保证上传的顺序。下载者在队列中的位置根据其在队列中的排队时间和改变因子进行计算。在队头的下载者拥有最高的“分数”。分数按照score = (rating _ seconds in the queue)/100计算,但是被定义为朋友的节点的分数被计算为无穷大,初始的下载分数为100。除了被禁止的客户端,(它的rating被设为0,这样它就不可能到达队列的顶端)rating根据下载者先前积累的信用积分或者是由上传者分配的优先权。当一个下载者的分数高于队列中的其他下载者的时候,他到达队列的顶端开始下载。在下面情况发生时客户端将离开下载位置:
(1) 用户终结下载
(2) 下载的客户端下载完毕
(3) 在轮循中有其他客户端的得分高过下载者