2,客户机服务器之间的TCP通信
每一个客户端都采用TCP 连接与一个特定的服务器相连接,服务器分配给客户端一个固定的ID。客户端不能同时连接到几个服务器,也不能动态的选择服务器,除非由其他客户端的邀请。
2.1 建立连接
在建立连接的时候,客户端会向一定数目的服务器发起连接请求,当有一个连接成功建立之后。客户端就会取消所有其他的连接请求。
在连接建立的时候,可能有以下几个情况发生:
(1) high ID 连接:服务器与high ID客户端连接。
(2) Low ID 连接 :服务器与Low ID 客户端连接。
(3) 拒绝连接: 服务器拒绝与客户端连接
当然还有与服务器建立连接不成功或者服务器不可达的情况。
图2.1描述了high ID用户是如何与服务器交互的,在这种情况下,客户端发送登陆消息到服务器端。服务器以客户端——客户端模式建立另一个连接,以便确认客户端可以顺利的接受由其他客户端发起的连接。完成客户端——客户端模式的握手后,服务器关闭第二个连接,然后发送ID 交换信息完成客户端——服务器的握手。图中灰色的部分是emule的扩展协议,我们将留到2.6节讨论。
图2.2描述了Low ID与服务器通信的过程,在这种情况下,服务器发起的第二次连接就会失败。在服务器的返回信息中就会包含如下信息:Warning [server details] - You have alowid. Please review your network config and/or your settings.” 不论是low ID 还是high ID都以ID交换信息作为连接建立的结束。
图2.3描述了连接被拒绝的情况,当客户端是low ID时,或者服务器已经到达硬限制的时候连接就会被拒绝。
2.2 服务器连接启动阶段的消息
在连接成功建立之后,客户机和服务器还要交换一系列的数据。这些数据用来传输客户机之间的状态信息。客户端启动时像服务器端传送其上共享文件的列表,服务器发送其状态信息和版本信息,还有已知的其他服务器列表和其他标志服务器唯一的细节信息。最后,客户端请求源信息,服务器返回可供下载的源信息。
2.3 文件搜索
文件搜索是由用户发起的,作法比较简单,搜索请求发送给服务器,并由服务器返回搜索结果。然后,由用户选择一个或多个文件下载。客户端随即请求下载此文件需要的源信息。同时,服务器也将返回可选的状态信息。包括服务器支持的文件数和用户数。值得一提的是同时还会有UDP数据报作为源节点数据的补足,(更多细节在第3章讨论)在效验过源信息之后,可户端将源加入源列表,并尝试了其他可户端连接。
Emule客户端按照源被加入到源列表的顺序进行连接。并没有优先权机制去比较连接的顺序。并有一套机制来解决在用一个源下载多个文的情况。(因为emule客户端只允许与一个下载可户端建立一个连接)选择算法根据用户的优先权设置(默认则按照字母表顺序)进行选择,更多的细节请参照官方网站的说明。
2.4 Call Back 机制
Call Back 机制主要用来克服low ID不能接受TCP连接(也就是进行NAT穿越用的)。机制比较简单,假设主机A和B都连接到服务器S,A 需要连接到B以便获取B上的文件,但是由于B是LowID,B 不能接受由A发起的连接。这时 A将请求传送到S处,S发送信息令B向A发起连接,这时连接可以成功建立。
Emule也支持通信双方都是low ID的情况,这时将采用中转的方式进行,由S 负责中转。