附录:数据结构(Manifest/Chunk/State)最小建议
本附录提供面向“分片并发 + 断点续传 + 幂等重试”的最小数据结构建议。 目标是让实现既能高吞吐并发,又能在失败后可靠恢复,而不需要复杂事务。
总体原则
- 大对象与小状态分层:chunks/manifest 属于大对象,进入对象存储;state 属于小状态,进入状态存储。
- 唯一键与幂等:chunk 必须可用 (transferId, fileId, chunkIndex) 唯一定位,用于幂等重传。
- 可恢复性:state 必须能表达“已完成集合”,恢复时跳过已完成部分。
- 不泄露敏感信息:对象键与状态中 SHOULD 避免包含 email、原始文件名等敏感字段(是否密文化取决于隐私策略)。
A.1 Manifest(清单)最小字段
Manifest 是接收方下载与组装的“唯一入口”。最小建议如下:
- manifestVersion:MUST。用于兼容升级(例如
1)。 - transferId:MUST。传输会话唯一标识。
- createdAt / expiresAt:SHOULD。用于生命周期与 UI 提示。
- policy:SHOULD。包含下载次数限制、是否需要密码、是否允许未完成分享等策略摘要。
- files[]:MUST。文件集合描述(至少包含文件大小与分片范围)。
- chunking:MUST。包含 chunkSize、chunkCount 计算方式或每文件的 chunkCount。
- objectKeyRule:MUST。用于从 (transferId,fileId,chunkIndex) 推导对象键,或给出明确映射表。
A.1.1 files[] 最小字段建议
- fileId:MUST。文件唯一标识(不使用文件名作为唯一键)。
- size:MUST。字节数。
- mime:MAY。用于展示与下载建议。
- name:MAY。若你坚持零知识/最小泄露,name 可选择不保存或改为密文名。
- chunkCount:MUST。该文件分片数。
- chunkOffset:MAY。若多个文件共享全局 chunkIndex,需要 offset;否则可省略。
A.1.2 完整性与校验字段(可选但推荐)
- chunkHashes[]:SHOULD。每个 chunk 的校验(hash/长度/etag 之一或组合)。
- fileHash:MAY。整文件校验(下载后验证)。
- ciphertextLength:MAY。用于密文级别的长度一致性检查(不需要明文)。
A.2 Chunk(分片对象)最小约束
- 唯一定位:chunk MUST 可由 (transferId, fileId, chunkIndex) 唯一定位。
- 幂等上传:重复上传同一 chunk MUST 不破坏最终状态(可覆盖或拒绝但必须一致)。
- 最小元信息:服务端 MAY 仅记录密文长度、写入时间、etag/版本等,用于可观测与问题定位。
A.2.1 对象键规则(示例)
/transfers/{transferId}/chunks/{fileId}/{chunkIndex}/transfers/{transferId}/manifest
约束:对象键 MUST 支持按 transferId 前缀批量清理;对象键 SHOULD 避免携带敏感业务信息。
A.3 State(状态记录)最小字段
State 用于回答“上传/下载进度与恢复”,应该尽量小、可快速读写。
- transferId:MUST。
- status:MUST。建议:
UPLOADING/READY/DELETED/EXPIRED。 - uploadedSet:MUST。已完成 chunk 集合;SHOULD 用 bitmap / range-set 压缩表示。
- uploadedBytes:SHOULD。用于展示进度与限额判断(可由 chunks 推导但实时维护更快)。
- downloadCount:MAY。若你有下载次数限制,必须记录并原子更新(实现细节依赖你的存储)。
- expiresAt:SHOULD。用于过期拒绝与后台清理。
A.3.1 恢复接口的最小输出
为了断点续传,服务端 SHOULD 能返回:
- transfer 状态(UPLOADING/READY/DELETED/EXPIRED)
- uploadedSet(已完成 chunk 集合)
- 限制信息摘要(例如是否已超配额/是否已到期/是否允许继续上传)
附注:与安全白皮书的边界
- 本附录仅描述传输/存储所需的“结构与约束”。
- 加密字段、密钥材料如何携带/派生、认证失败的失败关闭等边界,请以《安全与隐私白皮书》为准。