什么是BT下载
BT下载,大家应该都很熟悉,所谓的BT下载,其实就是采用了P2P技术来让客户端相互间进行数据传输,一来加快数据下载的速度,二来减轻下载服务器的负担。
为了更好的理解,我还是举个简单的BT下载的例子吧。假如,下载服务器T上有BT资源 S,既然是BT资源,那么S里的数据肯定被分成一块一块的,假如它由a,b二块组成。这时,A、B两个用户都想下载BT资源S, A首先会从T上下载a, 下载完成后,就会告知B,此时B知道A上已经有数据块a了,如果这时B去下载S时,它会从T上下载b,并且同时去A上下载a,这样既加快了下载效率,又减轻了服务器T的负载。
上面只是简单的描述了数据传输的大概逻辑,但是有一点我们还没有提到,那就是数据传输正确性的验证。一般,数据在跨网络传输时,为了却确保传输的正确性,客户端在接收到数据时需要对数据进行验证,验证数据在传输过程中是否出现了什么意外情况,如验证数据是否被别人篡改,数据是否丢失等。常用的验证方式是,数据传输前,对传输的数据进行计算,生成一个信息摘要,而客户端接收到数据时,会再次对接收到的数据进行计算,形成一个新的摘要,然后比对新摘要和接收的摘要是否一致,如果一致表示接收到的数据时是效的,反之,数据是无效的,需要重新进行传输。
BT下载的处理过程简述
大家都知道,我们使用BT下载时,通常要先下载一个称为种子文件的东西(文件后缀名是.torrent), 这个文件里包含哪些内容呢? 它其实包含了对要下载的资源的一些描述,如实际资源所在的地址,文件名,文件长度,数据块长度,以及各个数据块对应的摘要信息等。下载文件的过程分为以下几个步骤:
1. 首先,客户端A会根据下载的种子文件得出资源的目标服务器地址,然后与目标服务器地址建立连接, 进行数据块下载;
2. 当一个数据块下载完成后,客户端A会计算该数据块的摘要,然后用这个摘要与先前种子文件里的摘要进行比对,如果一致,表示这个数据块下载成功,否则,重新下载;
3. 如果数据块下载成功,客户端A会与其它下载资源的客户端进行通信,告知它们它已经成功下载了一个数据块,然后其他客户端也需要下载这个数据块时,会去客户端A下载。 当然,实际情况可能并不是这么简单,里面肯定还牵涉到负载相关的东西。
这个算法看似非常不错,但是它存在一点点问题:它把资源里所有的数据块对应的摘要信息都存储在 种子文件里,而摘要信息也是需要占用一定存储空间的,大概20B,这样,当下载的资源特别大时,会产生许多数据块,从而会产生许多摘要信息,最终会使得种子文件变得非常庞大。如果这样,客户端争先去下载这个种子文件时,会对种子文件服务器造成很大的负载压力。
怎么办呢? 一种方法是将数据块的大小设的特别大,这样,数据块的数量就会减少,从而产生的摘要数量就会变小,但是使用这个方法就会衍生出其它问题:一个客户端下载完一个数据块后,验证数据块时发现数据块无效,此时需要重新传输,由于数据块很大,导致白白浪费了很多网络资源(因为数据块比较大,传一块不容易嘛)。
采用Merkle Hash Tree简化数据块的验证
首先根据下载资源里的所有数据块构造一个Merkle Hash Tree,具体如图一。 此时,已经不是将所有数据块的摘要放在种子文件里了,而仅仅是存放根节点(0节点)hash值,这样,无论下载资源有多大,种子文件里只保存一个信息摘要,占用存储会大大减少。客户端下载种子文件时,会很快就下载完成,从而减少了种子文件服务器的负担,提高了系统的整体性能。
如果这样,客户端从种子文件里只能得到一个Hash值(根节点),那么当客户端下载得到一个数据块又怎么验证呢? 验证过程是这样的,拿图一来举例子吧,假如客户端下载piece0, 这样可得到节点15的hash值,然后通过组合计算,通过15、16节点的hash值计算得到节点7的hash值,依次计算,最后得到节点0的hash值,然后把这个值和种子文件里的hash值进行比较,如果一样,表示数据块有效,否则重新进行下载。这里有点需要注意:如果验证成功,会将hash校验相关路径的hash值会缓存下来,以简化后续数据块的校验。例如,客户端对数据块piece0进行了验证,且缓存了各相关节点的hash值,此时如果你需要对piece1进行验证,无需从其它客户端获得
及节点8、4、2的hash值,因为在对piece0进行验证时已经证明了节点7的正确性。所以,缓存的节点hash值越多,验证越容易。
图一 Merkle Hash Tree
参考论文地址:http://www.docin.com/p-439367248.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
标题中的“PyPI 官网下载 | merkle-tree-stream-0.0.1a4.tar.gz”表明这是一个从Python Package Index(PyPI)官方下载的软件包,名为“merkle-tree-stream”,版本号为0.0.1a4,其打包格式是tar.gz。PyPI是Python...
在使用这个库之前,开发者需要先解压"前端开源库-merkle-tree-stream.zip",查看其中的README文件以了解如何安装和使用。可能包含的文件有: 1. **源代码文件**(如JavaScript或TypeScript):实现Merkle Tree和...
merkle tree merkle tree merkle tree merkle tree merkle tree merkle tree merkle tree merkle tree merkle tree
前端开源库-merkle-tree-streamMerkle树流,一种基于输入数据生成Merkle树的流。
在 `keybase/go-merkle-tree` 项目中,Go 语言被选为实现语言,这是因为 Go 具有并发处理能力、内存管理效率高以及丰富的标准库,特别适合构建这类高性能、高可靠性的系统组件。项目的核心功能包括: 1. **树的构建...
2. 在认证阶段,利用改进的Merkle-Tree认证方法构造搜索方案的验证及动态更新算法,实现高效认证和动态更新;与经典的MHT相比,计算成本从O(n)降低到O(log n)。 本文还对所提方案的正确性、安全性和性能进行了详细...
java 实现 merkle tree while (true) { Event event = receiveEvent(); String hash = computeHash(event); // ... process and transmit the message to the downstream Queue sendToDownstreamQueue(hash, ...
merkle树的坚固性 JS-实体sha3 merkle树桥。 在JS中生成证明;...import MerkleTree , { checkProof , merkleRoot , checkProofSolidityFactory } from 'merkle-tree-solidity' import { sha3 } from 'e
Kotlin中的Merkle Tree和Merkle证明实现MerkleTree是使用Kotlin kotlin-platform-common插件在Kotlin中实现的,该插件可将代码编译为JavaScript。 实现的方法: MerkleTree (input : List , hash : ( ByteArray ) ->...
概要 这是指定的修改后的merkle patricia树的实现: 修改后的Merkle Patricia树(trie)提供了一种持久性数据...安装npm install merkle-patricia-tree 用法该库中实现了三种树变体,分别是: BaseTrie , Checkpoin
python-merkle-tree
梅克尔树流 根据输入的数据生成merkle树的流。 改编自 。为什么? 签名和完整性检查是使Dat成为出色协议的一部分。 穿过系统的每个块都经过哈希处理,并成为哈希树的一部分。 由于 ,我们最终创建了散列的散列,这...
在提供的`merkle-tree-master`压缩包中,可能包含了实现这些功能的源代码,包括Merkle树的构建、哈希计算、证明验证等方法。通过阅读和分析这些代码,可以深入理解Merkle树的原理和Java实现细节。对于学习和实践...
Merkle-Hellman背包公钥密码系统是一种早期的公钥加密算法,由 Ralph Merkle 和 Martin Hellman 在1978年提出。这个系统基于背包问题,这是一种在计算理论上具有挑战性的数学问题。本文将详细讲解其基本原理以及...
比较Merkle Tree和树的气体使用量的Solidity示例。 建造 npm run build 测试 npm test 输出: Test append gas used: 0 62737 append gas used: 1 47749 append gas used: 2 47749 [...] append gas used: 97 ...
c++代码实现merkle_tree树..............
由于提供的文件内容主要是摘要性质的,以下知识点的提炼可能无法涵盖报告中的所有细节,但我会基于给出的文件内容尽可能详尽地提炼相关的知识点。 1. 消费者参与报告 报告名为《MERKLE INSIGHTS-2020年第二季度消费...
这些数据结构还支持在动态设置中使用的更新。 这些更新非常小,因为该实现利用客户端缓存来避免重新传输未更改的内部值。 可以并行进行哈希的重新计算,以加快更新速度。 用法 建造 $sh build.sh 安装 $mvn ...
默克尔空投 使用 Merkle 树将代币空投快速、高效且经济地分散到多个账户。 特征 任意数量代币的固定成本和低成本部署 所有代币都可以立即领取 任何人都可以支付汽油 ...更多详情、使用方法,请下载后阅读README.md文件
根据提供的文件信息,以下知识点将围绕“MERKLE INSIGHTS-2020年第三季度客户参与报告(英文)”中的内容进行展开。 ### 知识点一:现代平台概念 报告中提到的“现代平台”是支持现代营销技术的关键基础设施。该...