文件断点续传的实现:从分块校验到秒传
远程桌面场景下,文件传输是高频功能但也是体验最容易翻车的环节。网络抖动、客户端崩溃、用户主动断开都可能导致传输中断。TcpDesk远程桌面 v3.0 重写传输引擎,通过分块哈希、状态持久化、秒传索引三层机制,让 10GB 大文件的传输体验接近小文件。本文从协议层到存储层全面拆解。
一、整体架构设计
文件传输引擎独立于媒体通道,复用 R-UDP 协议栈但走独立子流。整体架构分为四层:
- 协议层:基于 R-UDP 的分块传输协议(CTP)
- 哈希层:BLAKE3 分块哈希 + 整文件哈希
- 状态层:本地 SQLite 持久化传输状态
- 索引层:服务端秒传索引(可选,仅企业版)
这种分层设计让协议、哈希、状态三者解耦,便于独立优化与回滚。控制端发起传输后,三层并行工作:协议层负责数据搬运,哈希层负责完整性校验,状态层负责断点恢复。
二、分块策略与哈希计算
文件被切分为固定大小的分块(默认 4MB),每块独立哈希、独立传输、独立校验。分块大小直接影响传输效率:
| 分块大小 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| 1MB | 弱网/小文件 | 抗丢包好 | 哈希开销大 |
| 4MB | 通用场景 | 平衡 | 中等 |
| 16MB | 千兆/大文件 | 哈希开销小 | 单块重传代价高 |
分块大小根据网络 RTT 与带宽动态调整,规则:分块 = max(1MB, min(16MB, bandwidth × RTT / 8))。BLAKE3 算法相比 SHA-256 快 5-10 倍,且支持并行计算,单 4MB 分块哈希耗时 < 5ms。
三、秒传机制:整文件哈希索引
秒传指:如果服务端或被控端已存在相同文件,跳过数据传输直接完成。判定依据是整文件哈希(BLAKE3)+ 文件大小的双重匹配。
秒传流程:
- 控制端计算源文件整文件哈希(流式计算,约 800MB/s)
- 通过信令通道向被控端查询哈希是否存在
- 命中则秒传完成,仅更新文件元数据
- 未命中则进入分块级秒传:被控端返回已有分块哈希列表
- 控制端仅发送缺失分块
实测对同一份 2GB 镜像在公司内部 50 台设备间分发,首台传输 5 分钟,后续 49 台平均 8 秒(秒传 + 分块秒传混合)。详见 /blog/enterprise-ops-case 中批量分发的实际效果。
四、断点续传:状态持久化
传输状态持久化在本地 SQLite 数据库,包括已传输分块列表、分块哈希、文件元数据。每次分块传输完成立即落盘,确保崩溃后能精确恢复。
状态表结构(简化):
transfer_session:
session_id TEXT PRIMARY KEY
file_path TEXT
file_size INTEGER
file_hash TEXT
block_size INTEGER
block_count INTEGER
completed_blocks BLOB -- bitmap
created_at INTEGER
updated_at INTEGER
重连续传流程:
- 客户端启动时扫描未完成会话
- 通过信令通道向对端发起续传请求
- 对端校验 file_hash 一致后返回已有分块哈希
- 双方比对 completed_blocks,仅传输缺失分块
- 全部分块到位后做整文件哈希校验
实测 10GB 文件在 50% 进度断开后,重连仅需 30 秒恢复上下文,剩余 5GB 全速传输完成。
五、并发与流控
单文件串行传输在大文件场景下利用率低,v3.0 引入分块级并发:
- 默认并发数:4(自适应 1-16)
- 单连接多路复用:R-UDP 单连接支持 32 路子流
- 流量整形:令牌桶算法,避免挤占媒体通道
- 优先级:键鼠指令 > 媒体帧 > 文件分块
并发数根据网络质量动态调整:RTT < 50ms 时并发 8,RTT > 200ms 时降到 2。流量整形确保文件传输不会导致画面卡顿,单文件传输速率受 可用带宽 × 30% 上限约束。
六、安全与完整性校验
传输层已通过 DTLS 加密,但文件完整性需要额外校验机制:
- 分块级:每块传输完成立即校验 BLAKE3,失败重传
- 整文件级:所有分块到位后做整文件哈希,确保拼接正确
- 防篡改:哈希计算在传输前完成,哈希值通过加密信令同步
- 防重放:分块携带 session_id + 序号,拒绝重复分块
完整安全机制可参考 /blog/e2e-encryption。文件传输的所有操作(开始、完成、失败、断点续传)均落审计日志,详见 /blog/audit-log-guide。
结语
文件断点续传看似简单,做精则需要分块策略、哈希算法、状态持久化、并发控制、完整性校验五层协同。TcpDesk远程桌面 v3.0 通过 BLAKE3 + SQLite + 分块并发,把大文件传输做到了秒级恢复与近秒级秒传。立即更新 v3.0 体验断点续传的顺畅。