当A到达B上传队列的顶部时,B连接A,执行初始握手,然后发送一个接收上传请求消息(6.4.11节)。A现在可以选择要么发送请求块消息来继续下载文件,要么发送取消传输消息来取消(如果它已经从别的源得到了这一块)。图4.6演示了这些选择。
4.4 数据传输
4.4.1 数据包
发送和接收文件块是eMule网络活动的主要部分。用FTP解释eMule可以推论出,当所有其它eMule可以控制,发送的文件块适合数据传输。发送的文件块大小可以是在5000到15000位(也根据压缩)范围内。为了避免出错,文件块消息在碎片中发送,每碎片在一个独立的TCP包中。在eMule 0.30e版中,最大的碎片大小是1300位(注意,这个数字只与TCP有效负载有关)。换句话说,当每个控制消息在单独的TCP包中发送,有时和其它消息共享,数据消息被分成几个TCP包。第一个包包含发送文件块消息头部(6.4.3节)。剩下的包值包含数据。当被分成1300,如果发送块的大小有剩余,和第一个包(这个包带有头部)一起发送。图4.7演示了文件块消息。
21
4.4.2 数据传输顺序
在文件请求回应之后立即开始块传输顺序。下载客户端A发送一个开始上传请求(6.4.10节),然后一个接收上传请求消息(6.4.11节)回应这个请求。A在这之后立即开始请求文件块(6.4.4节),B通过发送被请求块(6.4.3节)来回应。注意,单独的文件块请求可能请求可达3块之多,所以每个文件块请求可能被可达3个发送的块顺序回应。
当两个客户端都支持扩展的客户端协议,文件块可能压缩发送。扩展协议也支持可选的文件信息消息(6.5.5节),该消息就在接收上传请求消息之前发送。图4.8演示了块传输消息顺序。
22
4.4.3 选择块下载
为了最大化整个网络的吞吐量和共享,eMule仔细挑选选择块的下载顺序。每个文件被分成9.28M的块,每部分分成180KB的片。
块下载的顺序是由发送请求文件块消息(6.4.4节)的下载客户端决定。下载客户端可以在任何给定时刻从各个源中下载一个单独的文件块,所有从相同源中请求的片都在同一个块中。下面的原理(以这个顺序)应用于下载块等级:
1.(可获得的)大片的频率,尽可能快的下载非常稀少的大片来形成一个新的源。 2.用来预览的块(最初+最后的大片),预览或检查文件(比如,电影、mp3) 3.请求状态(过程中下载),尝试向每个源询问其它的大片。在所有源之间扩散请求。 4.完成(未到某种程度的完成),在开始下载另一个时应该完成获得部分的大片
频率标准定义了三个区域:非常稀少、稀少和一般。在每个区域里,标准有特定的权重,用来计算块等级。较低等级的块先下载。下面的列表根据上面的原理指定文件等级范围: l 0-9999 - 不请求和请求非常稀少的块
23
l 10000-19999 - 不请求稀少和预览块 l 20000-29999 - 不请求大部分完成的一般的块 l 30000-39999 - 请求的稀少和预览的块 l 40000-49999 - 请求的没有完成的一般的块
这个算法通常选择第一个最稀少的块。然而,部分完成的块,接近完成的,也可能被选中。对于一般的块,在不同的源之间扩散下载。
4.5 浏览共享的文件和文件夹
有两个消息流程来处理每对客户端之间的共享文件和文件夹的浏览。第一个是浏览共享文件消息(6.4.21节),该消息在初始握手后立即发送。通常由一个浏览共享文件回应消息(6.4.22)来回应这个消息。当回应的客户端想隐藏它的共享文件列表时,回应就包含零个文件(而不是发送一个指示访问拒绝的消息)。图4.9演示了这个消息顺序。
第二个消息流程随着一个浏览共享的文件夹列(6.4.23节)表请求开始,通过共享文件夹列表来回应这个消息,然后,对于回应中的每个文件夹,发送浏览共享文件夹内容的消息。当消息到达时,回应的每个消息带有内容列表。图4.10演示了这个消息顺序。
24
如果接收的客户端设置了阻塞共享文件/文件夹请求,它用请求共享拒绝消息回应,如图4.11所示。
4.6 交换片哈希集
为了取得片的哈希,发送一个哈希集请求,这个请求通过一个包含文件中每块的哈希集回应来回答。图4.12演示了这个。
25