【发布时间】:2008-09-30 19:27:00
【问题描述】:
我必须实现一个用于文件共享的中间件系统,它必须拆分文件,这与在 bittorrent 上发生的情况不同,它同时从各种来源发送和接收单独的片段。我怎么做?它是一个库还是我必须自己实现文件拆分?
【问题讨论】:
我必须实现一个用于文件共享的中间件系统,它必须拆分文件,这与在 bittorrent 上发生的情况不同,它同时从各种来源发送和接收单独的片段。我怎么做?它是一个库还是我必须自己实现文件拆分?
【问题讨论】:
将文件分割成块,假设每个 100KB。然后在每个块上计算一个 SHA 哈希(或其他一些哈希算法)。所以如果文件是 905KB,你将计算出 10 个这样的哈希值。
服务器将为它所服务的每个文件包含一个哈希定义文件。该散列定义文件将包含文件所有块的列表以及散列。因此,如果服务器正在为我们的名为 test.exe 的 905KB 文件提供服务。然后我们会有另一个名为 test.exe.hashes 的文件,其中包含该文件的 10 个哈希列表。
客户端会下载散列定义文件,并确保它拥有所有的块。客户端可以单独请求每个块,下载后可以再次计算其末端的哈希值,以确保没有损坏。
您不需要对文件进行物理拆分,拆分文件只是读取您感兴趣的部分。文件的第一个块是从字节范围 0 到 102399,下一个块是从 102400到 204800,依此类推。所以只需打开文件,寻找那个位置,读取数据,然后关闭文件。
【讨论】:
看看 Split & Concat(GNU 软件)的实现。
【讨论】:
您可能需要考虑使用 Solomon-Reed 编码。这将使获得最终块变得更加容易。这是微软在 Avalaunch 中采取的路线。
【讨论】:
出于兴趣:为什么不直接实施 BitTorrent 或类似的东西?有许多开源客户端(即Azureus),协议为really simple。还有an article with a little more detail,但它包含一些扩展——毫无疑问,官方规范总是正确的。
【讨论】: