// 动态分片流 // 1. 默认提供分片流 // 2. 允许请求者指定数据段, 返回相应分片, 发送队列可以并行, 接收队列在检查没有新数据时, 补充要求失败的分片 // 3. 可靠模式下分片是完整的, 但响应不是立即的, 当请求超时时放弃接受和发送队列中的分片 // 4. 同一个资源可以向不同的提供者请求, 将不同区段的分片合并然后存储 // 5. 不需要验证hash, 但是需要验证顺序, 发送者应当标记这个分片的开始和结束位置 // 资源id, 开始位置, 结束位置, 数据 // 资源的其他信息, 如hash, 大小, 类型等, 由其他方式获取 // 并不信任发送者, 所以必须验证发送者的分片HASH, 所以资源信息里应当包含每个分片的HASH // 但如果每个HASH都要验证, 那么验证的成本太高, 所以应当有一个HASH验证的阈值, 例如每100个分片验证一次, 如果验证失败, 则放弃这个分片, 重新请求 // 数据块, 每个数据块验证一次HASH, 如果验证失败, 则放弃这个数据块, 重新请求 // 数据块的大小应当是2的幂, 例如2, 4, 8, 16, 32, 64, 128, 256, 512, 1024等 // 数据块的大小应当是分片的倍数, 例如分片大小是1024, 那么数据块大小应当是1024的倍数, 例如1024, 2048, 4096等 /** * { * id: 'resource id', * type: 'resource type', * size: 'resource size', * hash: 'resource hash', * blocks: [ * 'md5 hash of block 1', * 'md5 hash of block 2', * 'md5 hash of block 3', * ] * } */ // 分片交叉验证 // 1. 每个分片都没有hash // 2. 文件有一个完整的hash // 3. 文件取4个交叉验证维度 // 4. 16个HASH验证1GB文件 // 5. 且只在完整hash验证失败时才验证分片