eMule协议规范 第二章 客户端服务器的TCP交流

来源:互联网 发布:太原大数据培训机构 编辑:程序博客网 时间:2024/04/24 16:36

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

翻译:lzcx

QQ:402722857

EMail: lzcx_cn@yahoo.com.cn

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

2    客户端服务器的TCP交流
 
每个客户端用TCP精确地连接到一个服务器。服务器分配给客户端一个ID,在与服务器其余的会话中标识该客户端(高ID客户端总是根据它的IP地址分配)。eMule GUI客户端需要建立一个服务器连接来用于操作。客户端不能同时与几个服务器连接,也不能在没有用户干涉的情况下动态更换服务器。
 
2.1    建立连接
 
在准备建立与服务器的连接时,客户端会尝试并行地连接到几个服务器,根据成功的登陆顺序放弃其他的。
有下面几个可能的连接建立个案:
1、高ID连接-服务器分配一个高ID给正在连接的客户端
2、低ID连接-服务器分配一个低ID给正在连接的客户端
3、拒绝会话-服务器拒绝客户端
当然,也有不重要的个案-服务器崩溃或者不可连接。
图2.1描述了导致高ID连接的信息顺序。在这种情况下,客户端建立一个TCP连接到服务器,然后发送一个登录信息到服务器。服务器用另一个TCP连接到客户端,执行一个客户端-客户端的握手来保证连接的客户端有能力接收来自其他eMule客户端的连接。在完成客户端握手后,服务器关闭第二个连接,通过发送ID更改信息来完成客户端-服务器的握手。你可能注意到eMule信息消息是灰色的。这是因为这个消息是eMule协议扩展的一个部分(1.6节)
图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图解了这个顺序。
 
2.3文件搜索
 
文件搜索是由用户发起的。这个操作简单,一个搜索要求(见6.2.9节)发送到服务器,然后服务器用一个搜索结果回应。当有很多结果时,搜索结果消息就会被压缩。接着,用户选择下载一个或多个文件,客户端就要求源为选中的文件和服务器返回每个要求文件的源队列(见6.2.12节)。就在回应发现的源之前,可以发送一个可选的服务器状态消息。这个状态消息(6.2.6节)包含关于当前用户数量和服务器支持的文件等信息。重要注意的是,UDP消息有个补充顺序事件,用来增强客户端为它搜索的文件定位源的能力,详细的细节见第3章。在检验出源是新的之后,eMule客户端开始尝试连接和把它们加入到它的源列表。源联系的顺序就是eMule客户端接收到它们的顺序。图2.5描述了文件搜索顺序。
eMule客户端根据源加入到它的列表中的顺序来连接源。没有优先机制来决定连接那个源。当可以要求同一个源来下载客户端下载列表中的几个文件时,有一种复杂的机制来解决这个局面(注意,载客户端之间eMule只允许一个单独的上传连接)。选择算法是基于用户优先规则,当没有指定优先时,默认是字母顺序。关于处理可以上传多于一个文件的源的详细描述,可以在网站中找到。
 
2.4   回调机制
 
回调机制是设计来克服低ID客户端不能接收输入的连接的,这样客户端之间就能共享它们的文件。机制很简单:假如客户端A和B都连接到同一个eMule服务器,A需要的文件在B上,但B是低ID的,A可以向服务器发送一个回调请求(见6.2.13节),请求服务器叫B呼叫回它。服务器,已经有一个与B的打开的TCP连接,发送一个回调请求消息(见6.2.14节)到B,为它提供A的IP和端口。B就能连接到A并发送文件,没有给服务器增加负担。很明显,只有高ID客户端可以要求低ID客户端回调(低ID客户端是没有接收输入连接的能力的)。图2.6图解了回调消息交换。
也有允许两个低ID客户端交换文件的能力,通过它们的服务器连接,用服务器接力。大部分服务器不再提供这个选项,因为它招致服务器的负担。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=600238