局域网 P2P 文件分发系统
BitStorm 是一个基于 Wails v2 构建的局域网 P2P 文件分发桌面应用。管理员选择文件或文件夹后,通过 UDP 广播自动发现局域网内的客户端,利用 P2P 网状拓扑将文件高速分发到所有节点。客户端之间互相共享已下载的分片,突破传统一对多传输的带宽瓶颈,大幅提升大规模文件分发效率。
- 机房 / 实验室多台机器批量部署软件包
- 局域网内大文件快速分享
- 文件夹同步分发到多台设备
- P2P 网状传输 — 客户端下载完分片后自动成为 Seeder,其他节点可从中拉取,充分利用全网带宽
- Block-level 流水线 — 1MB 分片拆分为 16KB 块,多节点并行竞争下载同一分片
- 稀有度优先算法 — 始终优先下载全网最少的分片,最大化分片分布均匀度
- RTT 自适应并发 — 根据网络延迟动态调整并发窗口(LAN 下可达 64 并发)
- Endgame 模式 — 最后一批分片时所有持有者同时竞争,避免尾端延迟
- 断点续传 —
.bsfd_parts持久化存储,重连后自动跳过已下载分片 - TCP 多路复用 — 每对等节点 4 条 TCP 连接,FNV hash 负载均衡
- 文件夹分发 — 自动打包为 tar 归档后分片,客户端完成自动解压
- 种子文件 — 支持导出
.bsfd文件,客户端可预加载成为纯 Seeder - Windows 深度适配 — 自动添加防火墙规则、端口冲突检测、跨盘符空间检查
┌────────────────────────────────────────────┐
│ Frontend │
│ React 19 + TypeScript + Vite │
│ Tailwind CSS + React Router │
│ Wails IPC │
├─────────────────────┼──────────────────────┤
│ Backend (Go) │
│ │
│ ┌─────────┐ ┌──────────┐ ┌───────────┐ │
│ │ cmd/ │ │ internal/│ │ protocol/ │ │
│ │ admin │ │ transfer │ │ BSFD │ │
│ │ client │ │ chunk │ │ Codec │ │
│ │ cli │ │ discovery│ │ Types │ │
│ └─────────┘ │ config │ └───────────┘ │
│ │ utils │ │
│ └──────────┘ │
├────────────────────────────────────────────┤
│ Network │
│ UDP 26931 (Discovery) │
│ TCP 26932 (Transfer) │
└────────────────────────────────────────────┘
BitStorm/
├── cmd/
│ ├── admin/ # 管理员端 Wails 应用(文件选择、分发控制)
│ ├── client/ # 客户端 Wails 应用(自动发现、P2P 下载)
│ ├── admin_cli/ # 管理员命令行工具
│ └── client_cli/ # 客户端命令行工具
├── frontend/ # 主应用前端(模式选择 + 路由)
├── internal/
│ ├── chunk/ # 文件分片、SHA-256 校验、LRU 缓存、文件组装
│ ├── config/ # 常量与参数配置
│ ├── discovery/ # UDP 广播与监听,节点发现
│ ├── transfer/ # TCP 连接池、消息路由、RTT 追踪
│ └── utils/ # 调试日志、端口管理
├── protocol/ # BSFD 帧协议定义与编解码
├── build/ # Wails 构建资源(图标、安装器脚本)
├── wails.json # Wails 项目配置
└── go.mod
所有网络通信使用自定义的 BSFD(Binary Simple Frame Distribution)二进制帧格式:
┌──────────┬──────┬───────────┬──────────────┐
│ "BSFD" │ Type │ PayloadLen│ Payload │
│ 4 bytes │ 1 B │ 4 bytes │ N bytes │
└──────────┴──────┴───────────┴──────────────┘
| 类型 | 值 | 方向 | 说明 |
|---|---|---|---|
| Heartbeat | 0x01 |
All ↔ All (UDP) | 节点发现,携带 ChunkBitmap |
| Hello | 0x02 |
Client → Admin (TCP) | TCP 握手 |
| FileInfo | 0x03 |
Admin → Client | 文件元数据 |
| StartDist | 0x04 |
Admin → Client | 开始分发 |
| ChunkRequest | 0x10 |
Peer ↔ Peer | 请求分片 |
| ChunkDataBin | 0x12 |
Peer ↔ Peer | 二进制分片数据 |
| BlockRequest | 0x13 |
Peer ↔ Peer | 请求分片内块 |
| BlockDataBin | 0x14 |
Peer ↔ Peer | 二进制块数据 |
| Cancel | 0x30 |
Admin → Client | 取消分发 |
| Finish | 0x31 |
Admin → Client | 分发完成 |
| KeepAlive | 0xFE |
Peer ↔ Peer | TCP 保活 |
- Go ≥ 1.25
- Node.js ≥ 18
- Wails CLI —
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 克隆仓库
git clone https://github.com/CuiCuiSha233/bitstorm.git
cd bitstorm
# 安装前端依赖
cd frontend && npm install && cd ..
# 开发模式运行(热重载)
wails dev
# 构建生产版本
wails build- 启动 管理员端 — 选择文件或文件夹,设置客户端保存路径
- 启动 客户端 — 自动通过 UDP 发现管理员并建立 TCP 连接
- 管理员点击「开始分发」,所有客户端开始 P2P 下载
- 客户端之间互相共享已下载分片,全程可视化监控
| 层级 | 技术 |
|---|---|
| 桌面框架 | Wails v2 |
| 后端语言 | Go |
| 前端框架 | React 19 + TypeScript 5.6 |
| 构建工具 | Vite 7 |
| CSS 框架 | Tailwind CSS 4.3 |
| 路由 | React Router DOM 7 |
| 图表 | Recharts 3.9 |
MIT