每个客户端用
TCP
连接到具体的服务器。服务器给客户端分配一个
ID
,这个
ID
用来标示其后与服务器的会话中该客户端(高
ID
客户端总是按照它的
IP
地址来分配)。电骡
GUI
客户端为了运行而请求建立服务器连接。客户端不能同时连接几个服务器并且不能在没有用户的干预下动态改变服务器。
1.1
连接建立
当建立一个到服务器的连接时,客户端可能尝试同时连接几个服务器,抛弃其他的连接尝试不谈,这里仅仅描述成功登录的序列:
图
2.1
:高
ID
客户端连接序列图
有几种可能连接建立的用例:
1.
高
ID
连接
-
服务器分配一个高
ID
给正在连接的客户端
2.
低
ID
连接
-
服务器分配一个低
ID
给正在连接的客户端
3.
拒绝会话
-
服务器拒绝客户端
当然,有些小的用例,服务器
DOWN
了或不可达。
图
2.1
描述了建立一个高
ID
连接的报文序列图。这个例子中,客户端建立一个到服务器的
TCP
连接,然后发送登录消息给服务器;服务器连接使用另一个
TCP
连接到客户端来指定一个客户端到客户端的握手,来确保正在连接的客户端可以接受其他电骡客户端的连接。在完成客户端握手后,服务器关闭第二个连接,完成客户端
-
服务器握手并且发送一个
ID
改变消息。你可能注意到电骡信息报文是灰色的。这是因为这些信息是电骡协议扩展(
1.6
节)。
图
2.2
:低
ID
客户端连接序列图
图
2.2
描述建立低
ID
连接的消息序列图。这种情况下,服务器发出到客户端的连接超时而失败,因此客户端被分配一个低
ID
。服务器消息通常包含一个警告,例如:“
Warning[
服务器细节
]-You have a lowed. Please review your network configure and/or your setting.
”
图
2.3
描述拒绝会话的序列。服务器可能拒绝会话的原由有:客户端有一个低的
ID
或当连接达到服务器的容量极限时。服务器消息包含一个描述拒绝原因的短字符串。
图
2.3
:服务器拒绝会话序列
1.2
连接开始报文交互
在连接成功建立之后,客户端和服务器交换几个安装信息。这些消息的目的是更新双方知道的其他端的状态。客户端以提交服务器共享文件(
6.2.4
节)列开始,然后请求更新它的服务器列表。服务器发送它的状态和版本(
6.2.6
和
6.2.2
节),然后发送它知道的电骡服务器并提供其他一些自标示信息。最终,客户端请求源(其他的可以提供下载文件的客户端),服务器以一系列报文来响应,一个是客户端下载列表中的每个文件,直到所有的源列表都被下载到客户端为止。图
2.4
描述这个序列。
图
2.4
:连接开始序列图
1.3
文件搜索
文件收缩由用户来初始化;操作简单,一个搜索请求(见
6.2.9
节)发送到服务器,服务器以一个搜索结果来响应(
6.2.10
节)。当有多个结果的时候,搜索结果信息是压缩的。下面,用户选择来下载一个或多个文件,客户端然后请求源来下载选中的文件,服务器返回每个请求文件的源的列表(见
6.2.12
)。一个可选的服务器状态信息可能在服务器找到源响应之前发送给客户端。状态信息(见
6.2.6
节)包含当前用户数和服务器支持的文件信息。重要的点是有一个后备
UDP
消息队列,它是用来增强客户端从它搜索列表中查询源的能力,更多的信息节
3
节。在验证了源是新的之后,电骡客户端初始化一个连接尝试和添加这些到源列表中。源联系的顺序和电骡客户端接收他们的顺序是相同的。图
2.5
描述文件搜索时序。
电骡客户端连接源的顺序与这些源在连表中的顺序是一样。没有优先级机制来决定先连接谁。有个复杂的算法来解决在客户端下载队列中从同一个源请求下载几个文件的情况(注意,电骡客户端仅仅允许在客户端之间有一个上传连接)。选择算法是基于用户优先级规范,在没有优先级指定的情况下,按照字母表的顺序。网站上有处理源上传多于一个文件的详细描述。
图
2.5
:文件搜索序列
1.4
回调机制
回调机制设计用来克服低
ID
客户端不能接受输入的连接而因此不能共享文件给其他客户端的。这个机智很简单:假设客户端
A
和
B
连接到同一个电骡服务器,
A
请求一个在
B
上的文件,但
B
是低
ID
,
A
发送一个回调请求给服务器(见
6.2.13
节),请求服务器告诉
B
来主动连接它(回调)。服务器已经有一个打开的
TCP
连接到
B
,它发送回调请求给
B
(
6.2.14
节),将
A
的
IP
地址和端口提供给
B
。
B
然后连接到
A
,将其上的一些文件(没有更多头)发送给
A
。显然,只有高
ID
客户端才能请求低
ID
客户端回调(低
ID
的客户端不能接收输入连接)。图
2.6
描述了回调信息的交换。
同样有一个特性就是允许两个低
ID
客户端通过他们的服务器连接来交换文件;服务器作为一个中继。大多数的服务器都不再支持这个功能了,因为服务器消耗增加。