Skip to content

Latest commit

 

History

History
837 lines (698 loc) · 43.9 KB

File metadata and controls

837 lines (698 loc) · 43.9 KB

MeshKit 系统架构文档

目录


概述

MeshKit 是一个基于 WebRTC 的去中心化 P2P 协作平台,采用 Monorepo 架构,支持多平台部署。系统由三个主要客户端(Web、Desktop、Mobile)和一个轻量级信令服务器组成。

核心设计原则

  1. 去中心化 - 数据直接在客户端之间传输,减少服务器依赖
  2. 安全至上 - 端到端加密,传输层加密,多层安全保护
  3. 跨平台 - 统一核心逻辑,适配多种平台
  4. 模块化 - 清晰的模块划分,便于维护和扩展
  5. 可扩展 - 易于添加新功能和新平台

整体架构

系统架构图

┌─────────────────────────────────────────────────────────────────────┐
│                          MeshKit 系统                                │
├─────────────────────────────────────────────────────────────────────┤
│                                                                       │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐     │
│  │   Web 客户端     │  │ Desktop 客户端  │  │ Mobile 客户端   │     │
│  │                  │  │                 │  │                 │     │
│  │  React + Vite   │  │    Electron     │  │  React Native   │     │
│  │  浏览器运行      │  │  跨平台桌面应用  │  │   iOS/Android   │     │
│  └────────┬────────┘  └────────┬────────┘  └────────┬────────┘     │
│           │                    │                     │              │
│           └────────────────────┼─────────────────────┘              │
│                                │                                     │
│                        ┌───────▼───────┐                            │
│                        │  @meshkit/core │                            │
│                        │  核心业务逻辑   │                            │
│                        └───────┬───────┘                            │
│                                │                                     │
│           ┌────────────────────┼────────────────────┐               │
│           │                    │                    │               │
│      ┌────▼─────┐      ┌──────▼──────┐      ┌─────▼──────┐        │
│      │ P2P 管理  │      │  文件传输    │      │ CRDT 同步  │        │
│      │          │      │             │      │            │        │
│      │ PeerJS   │      │ WebRTC DC   │      │    Yjs     │        │
│      │ WebRTC   │      │ 流式传输     │      │  实时协同   │        │
│      └────┬─────┘      └──────┬──────┘      └─────┬──────┘        │
│           │                   │                    │               │
└───────────┼───────────────────┼────────────────────┼───────────────┘
            │                   │                    │
            │                   │                    │
            │            ┌──────▼──────┐             │
            └────────────►  信令服务器  ◄─────────────┘
                         │             │
                         │  WebSocket  │
                         │  PeerServer │
                         └─────────────┘

                    设备发现 & P2P 连接协商


┌───────────────────────────────────────────────────────────────┐
│                     WebRTC P2P 直连                            │
│                                                                │
│   设备A                                    设备B               │
│  ┌─────┐                                  ┌─────┐            │
│  │     │  ←──── DTLS/SRTP 加密通道 ────→  │     │            │
│  │ Web │                                  │ Web │            │
│  │     │  ←────   文件/消息/CRDT   ────→  │     │            │
│  └─────┘                                  └─────┘            │
│                                                                │
│            不经过服务器 - 点对点直接传输                        │
└───────────────────────────────────────────────────────────────┘

Monorepo 项目结构

MeshKit/
├── packages/                    # 客户端包
│   ├── core/                    # 核心业务逻辑(共享)
│   │   ├── src/
│   │   │   ├── p2p/            # P2P 连接管理
│   │   │   ├── file/           # 文件传输
│   │   │   ├── sync/           # CRDT 同步
│   │   │   ├── crypto/         # 加密通讯
│   │   │   ├── device/         # 设备管理
│   │   │   └── events/         # 事件总线
│   │   └── package.json
│   │
│   ├── web/                     # Web 应用
│   │   ├── src/
│   │   │   ├── pages/          # 页面组件
│   │   │   ├── components/     # UI 组件
│   │   │   ├── hooks/          # React Hooks
│   │   │   └── store/          # 状态管理
│   │   └── package.json
│   │
│   ├── desktop/                 # Desktop 应用
│   │   ├── src/
│   │   │   ├── main/           # Electron 主进程
│   │   │   ├── preload/        # 预加载脚本
│   │   │   └── renderer/       # 渲染进程(复用 Web)
│   │   └── package.json
│   │
│   └── mobile/                  # Mobile 应用(规划中)
│       └── ...
│
├── apps/                        # 应用服务
│   └── signaling/               # 信令服务器
│       ├── src/
│       │   ├── ws/             # WebSocket 服务
│       │   ├── peer/           # PeerServer
│       │   └── index.ts        # 入口
│       └── package.json
│
├── docs/                        # 文档
├── package.json                 # 根配置
├── pnpm-workspace.yaml          # pnpm 工作空间
└── turbo.json                   # Turborepo 配置

技术栈

前端技术栈

技术 版本 用途 说明
TypeScript 5.3+ 开发语言 类型安全,完整类型定义
React 18.2 UI 框架 声明式 UI,组件化开发
Vite 5.0+ 构建工具 快速的开发服务器和构建
Zustand 4.4+ 状态管理 轻量级状态管理方案
TailwindCSS 3.3+ 样式框架 实用优先的 CSS 框架
React Router 6.x 路由管理 客户端路由

P2P & 实时通讯

技术 版本 用途 说明
WebRTC - P2P 通讯 浏览器原生 P2P 能力
PeerJS 1.5+ WebRTC 封装 简化 WebRTC 连接建立
Yjs 13.6+ CRDT 同步 无冲突协同编辑
y-webrtc 10.3+ Yjs WebRTC Yjs 的 WebRTC 传输层

加密 & 安全

技术 版本 用途 说明
libsodium 0.7+ 端到端加密 NaCl 加密库(军事级)
WebCrypto API - 浏览器加密 浏览器原生加密 API
DTLS/SRTP - 传输层加密 WebRTC 内置加密

桌面 & 移动

技术 版本 用途 说明
Electron 28.0+ 桌面应用 跨平台桌面应用框架
Electron Builder 24.0+ 打包工具 多平台打包和发布
React Native 0.73+ 移动应用 跨平台移动应用(规划中)

后端 & 部署

技术 版本 用途 说明
Node.js 18+ 运行环境 JavaScript 运行时
Express 4.18+ Web 框架 信令服务器框架
ws 8.x WebSocket WebSocket 服务器
peer 0.6+ PeerServer PeerJS 信令服务器
Docker - 容器化 容器化部署

构建 & 工具

技术 版本 用途 说明
pnpm 8+ 包管理 快速的包管理器
Turborepo 1.11+ Monorepo 工具 高效的 Monorepo 构建
ESLint 8.x 代码检查 代码质量保证
Prettier 3.x 代码格式化 统一代码风格

核心模块

1. P2P 连接管理模块

位置: packages/core/src/p2p/

职责:

  • 管理 PeerJS 实例
  • 建立和维护 P2P 连接
  • 处理连接状态变化
  • 重连机制
  • 连接质量监控

关键组件:

class P2PManager {
  private peer: Peer
  private connections: Map<string, DataConnection>

  // 初始化 Peer 实例
  initialize(peerId?: string): Promise<void>

  // 连接到对等设备
  connectToPeer(peerId: string): Promise<DataConnection>

  // 断开连接
  disconnect(peerId: string): void

  // 监听连接事件
  onConnection(callback: (conn: DataConnection) => void): void
}

数据流:

客户端 A                信令服务器              客户端 B
   │                       │                      │
   ├──── 注册 Peer ID ────►│                      │
   │                       │◄──── 注册 Peer ID ───┤
   │                       │                      │
   ├──── 请求连接 B ──────►│                      │
   │                       ├──── 转发请求 ───────►│
   │                       │                      │
   │◄──── ICE 候选 ────────┤──── ICE 候选 ───────►│
   │                       │                      │
   │◄───────────── P2P 直连建立 ─────────────────►│
   │                 (不经过服务器)                │

2. 文件传输模块

位置: packages/core/src/file/

职责:

  • 文件分片和流式传输
  • 传输进度跟踪
  • 传输队列管理
  • 错误处理和重传
  • 传输速度计算

关键组件:

class FileTransferManager {
  private chunkSize = 64 * 1024  // 64KB 分片大小

  // 发送文件
  sendFile(
    file: File,
    connection: DataConnection,
    onProgress: (progress: number) => void
  ): Promise<void>

  // 接收文件
  receiveFile(
    connection: DataConnection,
    onProgress: (progress: number) => void
  ): Promise<Blob>

  // 取消传输
  cancelTransfer(transferId: string): void
}

文件传输流程:

发送端                                    接收端
  │                                         │
  ├── 1. 读取文件                            │
  ├── 2. 分片 (64KB)                         │
  │                                         │
  ├── 3. 发送元数据 ───────────────────────►│
  │     (文件名、大小、类型)                  ├── 准备接收缓冲区
  │                                         │
  ├── 4. 发送分片 1 ────────────────────────►│
  ├── 5. 发送分片 2 ────────────────────────►│  接收并组装
  ├── 6. 发送分片 3 ────────────────────────►│
  │     ...                                 │
  │                                         │
  ├── 7. 发送完成标记 ──────────────────────►│
  │                                         ├── 组装完整文件
  │                                         ├── 触发下载
  │◄──── 8. 确认接收 ───────────────────────┤

3. CRDT 同步模块

位置: packages/core/src/sync/

职责:

  • 管理 Yjs 文档
  • WebRTC 传输提供者
  • 本地持久化(IndexedDB)
  • 冲突解决(自动)
  • 离线支持

关键组件:

class SyncManager {
  private ydoc: Y.Doc
  private provider: WebrtcProvider

  // 初始化同步
  initialize(roomName: string): void

  // 获取共享类型
  getSharedArray<T>(name: string): Y.Array<T>
  getSharedMap<T>(name: string): Y.Map<T>

  // 监听变化
  onUpdate(callback: (update: Uint8Array) => void): void

  // 断开连接
  destroy(): void
}

CRDT 同步机制:

设备 A                    设备 B                    设备 C
  │                        │                          │
  ├── 添加便签 "任务1"      │                          │
  ├── 生成操作 Op1         │                          │
  ├────────────────────────►                          │
  │                        ├── 应用 Op1               │
  │                        ├────────────────────────►│
  │                                                   ├── 应用 Op1
  │                        │                          │
  │                        ├── 添加便签 "任务2"       │
  │                        ├── 生成操作 Op2          │
  │◄────────────────────────                          │
  ├── 应用 Op2             ├────────────────────────►│
  │                        │                          ├── 应用 Op2
  │                        │                          │

  结果: 所有设备都有 "任务1" 和 "任务2",顺序一致,无冲突

4. 加密通讯模块

位置: packages/core/src/crypto/

职责:

  • 密钥对生成(ECDH)
  • 密钥交换
  • 消息加密/解密
  • Nonce 管理
  • 密钥派生

关键组件:

class CryptoManager {
  private keyPair: { publicKey: Uint8Array; secretKey: Uint8Array }
  private sharedKeys: Map<string, Uint8Array>

  // 生成密钥对
  generateKeyPair(): void

  // 交换公钥
  exchangeKeys(peerId: string, publicKey: Uint8Array): void

  // 加密消息
  encrypt(message: string, peerId: string): Uint8Array

  // 解密消息
  decrypt(ciphertext: Uint8Array, peerId: string): string
}

端到端加密流程:

Alice                                       Bob
  │                                          │
  ├── 1. 生成密钥对                           │
  │     公钥A, 私钥A                          ├── 1. 生成密钥对
  │                                          │     公钥B, 私钥B
  │                                          │
  ├── 2. 发送公钥A ─────────────────────────►│
  │◄──── 3. 发送公钥B ────────────────────────┤
  │                                          │
  ├── 4. 计算共享密钥                         │
  │     SharedKey = ECDH(私钥A, 公钥B)       ├── 4. 计算共享密钥
  │                                          │     SharedKey = ECDH(私钥B, 公钥A)
  │                                          │
  │     (双方计算出相同的 SharedKey)          │
  │                                          │
  ├── 5. 加密消息 "Hello"                     │
  │     Cipher = XSalsa20(SharedKey, "Hello")│
  ├── 6. 发送密文 ──────────────────────────►│
  │                                          ├── 7. 解密消息
  │                                          │     "Hello" = XSalsa20_Decrypt(SharedKey, Cipher)

5. 设备管理模块

位置: packages/core/src/device/

职责:

  • 设备发现
  • 设备列表维护
  • 在线状态跟踪
  • 设备元信息管理
  • 心跳检测

关键组件:

class DeviceManager {
  private devices: Map<string, Device>

  // 注册设备
  registerDevice(device: Device): void

  // 更新设备状态
  updateDeviceStatus(peerId: string, status: 'online' | 'offline'): void

  // 获取在线设备
  getOnlineDevices(): Device[]

  // 监听设备变化
  onDeviceChange(callback: (devices: Device[]) => void): void
}

6. 事件总线模块

位置: packages/core/src/events/

职责:

  • 模块间通讯
  • 事件订阅/发布
  • 事件过滤
  • 错误事件传播

关键组件:

class EventBus {
  private listeners: Map<string, Set<Function>>

  // 订阅事件
  on(event: string, callback: Function): () => void

  // 发布事件
  emit(event: string, ...args: any[]): void

  // 取消订阅
  off(event: string, callback: Function): void
}

数据流

文件传输数据流

┌─────────────────────────────────────────────────────────────────────┐
│                         文件传输完整流程                             │
└─────────────────────────────────────────────────────────────────────┘

用户操作              应用层           P2P层            WebRTC           对端
    │                  │               │                │               │
    ├─ 选择文件 ───────►│               │                │               │
    │                  ├─ 读取文件      │                │               │
    │                  ├─ 分片 (64KB)  │                │               │
    │                  │               │                │               │
    │                  ├─ 发送元数据 ──►│                │               │
    │                  │               ├─ 发送数据 ─────►               │
    │                  │               │                ├─ DTLS加密 ───►│ 接收元数据
    │                  │               │                │               │ 准备接收
    │                  │               │                │               │
    │                  ├─ 发送分片1 ───►│                │               │
    │                  │               ├─ 发送分片1 ────►               │
    │                  │               │                ├─ DTLS加密 ───►│ 接收分片1
    │                  │               │                │               │
    │                  ├─ 发送分片2 ───►│                │               │
    │                  │               ├─ 发送分片2 ────►               │
    │                  │               │                ├─ DTLS加密 ───►│ 接收分片2
    │                  │               │                │               │ 组装...
    │                  │     ...       │                │               │
    │                  │               │                │               │
    │                  ├─ 发送完成 ────►│                │               │
    │                  │               ├─ 发送完成 ─────►               │
    │                  │               │                ├─ DTLS加密 ───►│ 文件完整
    │                  │               │                │               │ 触发下载
    │                  │               │                │               │
    │                  │◄─ 接收确认 ───┤                │               │
    │                  │               │◄─ 确认消息 ────┤               │
    │                  │               │                │◄─ DTLS加密 ───┤
    │◄─ 显示完成 ───────┤               │                │               │

便签同步数据流

┌─────────────────────────────────────────────────────────────────────┐
│                         便签同步流程                                 │
└─────────────────────────────────────────────────────────────────────┘

设备A              Yjs CRDT         WebRTC Provider       设备B
  │                   │                    │                │
  ├─ 添加便签 ────────►│                    │                │
  │                   ├─ 生成 Op1          │                │
  │                   ├─ 更新本地 Doc      │                │
  │                   ├─ 持久化 IndexedDB  │                │
  │                   │                    │                │
  │                   ├─ 广播 Op1 ────────►                 │
  │                   │                    ├─ WebRTC发送 ──►│
  │                   │                    │   (DTLS加密)   │ 接收 Op1
  │                   │                    │                ├─►Yjs应用
  │                   │                    │                │  更新Doc
  │                   │                    │                │  更新UI
  │                   │                    │                │
  │                   │                    │◄─ 广播 Op2 ────┤ 编辑便签
  │                   │◄─ 接收 Op2 ────────┤   (DTLS加密)   │
  │  更新UI ◄─────────┤                    │                │
  │                   ├─ 应用 Op2          │                │
  │                   ├─ 更新 Doc          │                │
  │                   ├─ 持久化            │                │

加密聊天数据流

┌─────────────────────────────────────────────────────────────────────┐
│                         加密聊天流程                                 │
└─────────────────────────────────────────────────────────────────────┘

Alice              CryptoManager        WebRTC          Bob
  │                     │                   │            │
  ├─ 连接建立 ──────────►│                   │            │
  │                     ├─ 生成密钥对A       │            │
  │                     │   (公钥A, 私钥A)   │            │
  │                     │                   │            │ 生成密钥对B
  │                     │                   │            │ (公钥B, 私钥B)
  │                     │                   │            │
  │                     ├─ 发送公钥A ────────►           │
  │                     │                   ├─ 转发 ────►│ 接收公钥A
  │                     │                   │            │
  │                     │◄─ 接收公钥B ───────┤           │
  │                     │                   │◄─ 转发 ────┤ 发送公钥B
  │                     │                   │            │
  │                     ├─ 计算共享密钥       │            │ 计算共享密钥
  │                     │   ECDH(私钥A, 公钥B)│           │ ECDH(私钥B, 公钥A)
  │                     │                   │            │
  ├─ 发送消息 "Hi" ─────►│                   │            │
  │                     ├─ 加密              │            │
  │                     │   XSalsa20+Poly   │            │
  │                     ├─ 发送密文 ─────────►           │
  │                     │                   ├─ 转发 ────►│ 接收密文
  │                     │                   │   DTLS加密 │
  │                     │                   │            ├─►解密
  │                     │                   │            │  XSalsa20+Poly
  │                     │                   │            │  "Hi"
  │                     │                   │            │
  │                     │                   │            ├─ 显示 "Hi"

安全架构

多层安全防护

┌───────────────────────────────────────────────────────────────┐
│                        安全层次架构                            │
├───────────────────────────────────────────────────────────────┤
│                                                                │
│  第4层: 应用层安全                                             │
│  ┌──────────────────────────────────────────────────────┐    │
│  │ 端到端加密 (E2EE)                                      │    │
│  │ - libsodium (NaCl)                                    │    │
│  │ - XSalsa20 流密码 (256位)                             │    │
│  │ - Poly1305 消息认证                                   │    │
│  │ - 仅用于加密聊天功能                                   │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                                │
│  第3层: 传输层安全                                             │
│  ┌──────────────────────────────────────────────────────┐    │
│  │ WebRTC DTLS/SRTP                                      │    │
│  │ - DTLS 1.2+ 握手加密                                  │    │
│  │ - SRTP 数据流加密 (AES-GCM 128-256位)                 │    │
│  │ - 完美前向保密 (PFS)                                  │    │
│  │ - 应用于所有 WebRTC 连接                              │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                                │
│  第2层: 连接层安全                                             │
│  ┌──────────────────────────────────────────────────────┐    │
│  │ ICE/STUN/TURN                                         │    │
│  │ - NAT 穿透                                            │    │
│  │ - 连接验证                                            │    │
│  │ - 防止未授权连接                                       │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                                │
│  第1层: 网络层安全                                             │
│  ┌──────────────────────────────────────────────────────┐    │
│  │ HTTPS / WSS                                           │    │
│  │ - 信令服务器连接加密                                   │    │
│  │ - TLS 1.2+                                            │    │
│  │ - 防止中间人攻击                                       │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                                │
└───────────────────────────────────────────────────────────────┘

密钥管理架构

┌──────────────────────────────────────────────────────────────┐
│                      密钥管理系统                             │
├──────────────────────────────────────────────────────────────┤
│                                                               │
│  会话密钥 (Session Keys) - 临时性                             │
│  ┌─────────────────────────────────────────────────────┐    │
│  │ WebRTC 会话密钥                                      │    │
│  │ - 每次连接自动生成                                   │    │
│  │ - DTLS 握手协商                                      │    │
│  │ - 连接断开后销毁                                     │    │
│  │ - 提供完美前向保密                                   │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                               │
│  端到端密钥 (E2EE Keys) - 临时性                              │
│  ┌─────────────────────────────────────────────────────┐    │
│  │ 聊天加密密钥                                         │    │
│  │ - ECDH 密钥交换                                      │    │
│  │ - Curve25519 椭圆曲线                                │    │
│  │ - 存储在内存中                                       │    │
│  │ - 页面刷新后清除                                     │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                               │
│  设备标识 (Device ID) - 持久性                                │
│  ┌─────────────────────────────────────────────────────┐    │
│  │ Peer ID                                              │    │
│  │ - 存储在 localStorage                                │    │
│  │ - 用于设备识别                                       │    │
│  │ - 不涉及加密操作                                     │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                               │
└──────────────────────────────────────────────────────────────┘

威胁模型与防护

威胁类型 防护措施 安全级别
网络窃听 DTLS/SRTP 加密 + E2EE
中间人攻击 WebRTC 证书验证 + DTLS 中-高
消息篡改 Poly1305 消息认证码
重放攻击 Nonce 随机数
身份伪造 Peer ID + 公钥验证
密钥泄露 完美前向保密 (PFS)
服务器窃听 P2P 直连 + E2EE 极高
本地攻击 无持久化敏感数据

安全级别说明:

  • 极高: 当前技术条件下几乎不可破解
  • : 需要极高成本和专业知识才能破解
  • 中-高: 有一定防护,但仍有潜在风险
  • : 基础防护,建议增强

部署架构

开发环境

┌────────────────────────────────────────────────────────┐
│                   开发环境架构                          │
├────────────────────────────────────────────────────────┤
│                                                         │
│  开发者机器 (localhost)                                 │
│  ┌────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │  ┌─────────────┐  ┌─────────────┐             │   │
│  │  │ Web Dev     │  │ Desktop Dev │             │   │
│  │  │ :3000       │  │ Electron    │             │   │
│  │  └──────┬──────┘  └──────┬──────┘             │   │
│  │         │                │                     │   │
│  │         └────────┬───────┘                     │   │
│  │                  │                             │   │
│  │         ┌────────▼────────┐                    │   │
│  │         │ 信令服务器        │                    │   │
│  │         │ :7000 (WS)      │                    │   │
│  │         │ :8000 (Peer)    │                    │   │
│  │         └─────────────────┘                    │   │
│  │                                                 │   │
│  └────────────────────────────────────────────────┘   │
│                                                         │
│  局域网内其他设备                                       │
│  ┌────────────────────────────────────────────────┐   │
│  │  手机/平板访问: http://192.168.x.x:3000         │   │
│  └────────────────────────────────────────────────┘   │
│                                                         │
└────────────────────────────────────────────────────────┘

网络拓扑

┌────────────────────────────────────────────────────────────────┐
│                        网络拓扑图                               │
├────────────────────────────────────────────────────────────────┤
│                                                                 │
│  公网                                                           │
│  ┌────────────────────────────────────────────────────────┐   │
│  │                                                         │   │
│  │              ┌─────────────────┐                       │   │
│  │              │   信令服务器     │                       │   │
│  │              │  (公网IP/域名)   │                       │   │
│  │              └────────┬────────┘                       │   │
│  │                       │                                │   │
│  │           ┌───────────┼───────────┐                    │   │
│  │           │           │           │                    │   │
│  └───────────┼───────────┼───────────┼────────────────────┘   │
│              │           │           │                        │
│  ┌───────────▼─┐   ┌─────▼──────┐  ┌▼──────────────┐         │
│  │  家庭网络A   │   │ 办公网络B   │  │  移动网络C     │         │
│  │  (NAT)      │   │  (NAT)     │  │  (4G/5G)      │         │
│  │             │   │            │  │               │         │
│  │  ┌────────┐ │   │ ┌────────┐ │  │  ┌──────────┐ │         │
│  │  │ 设备1   │ │   │ │ 设备2   │ │  │  │  手机1   │ │         │
│  │  │ Web    │ │   │ │Desktop │ │  │  │  Mobile  │ │         │
│  │  └────────┘ │   │ └────────┘ │  │  └──────────┘ │         │
│  │  ┌────────┐ │   │ ┌────────┐ │  │               │         │
│  │  │ 设备3   │ │   │ │ 设备4   │ │  │               │         │
│  │  │ Mobile │ │   │ │ Web    │ │  │               │         │
│  │  └────────┘ │   │ └────────┘ │  │               │         │
│  └─────────────┘   └────────────┘  └───────────────┘         │
│                                                                 │
│  P2P 连接 (跨网络)                                              │
│  ┌────────────────────────────────────────────────────────┐   │
│  │                                                         │   │
│  │  设备1 (NAT-A) ◄──────WebRTC P2P──────► 设备2 (NAT-B)  │   │
│  │                                                         │   │
│  │  • 通过 STUN 发现公网地址                               │   │
│  │  • 通过 ICE 建立最优连接路径                            │   │
│  │  • 如无法直连,使用 TURN 中继 (可选)                    │   │
│  │                                                         │   │
│  └────────────────────────────────────────────────────────┘   │
│                                                                 │
└────────────────────────────────────────────────────────────────┘

性能优化

文件传输优化

  1. 分片大小优化 - 64KB 分片,平衡速度和内存
  2. 流式传输 - 避免一次性加载大文件到内存
  3. 并行传输 - 支持同时传输多个文件
  4. 缓冲管理 - 接收端智能缓冲

CRDT 同步优化

  1. 增量更新 - 只同步变化部分
  2. 本地持久化 - IndexedDB 存储,减少网络同步
  3. 连接池复用 - WebRTC 连接复用
  4. 延迟加载 - 按需加载便签内容

加密性能优化

  1. 密钥缓存 - 共享密钥缓存,避免重复计算
  2. 批量加密 - 批量处理消息
  3. Web Workers - 异步加密,不阻塞 UI

扩展性设计

水平扩展

信令服务器集群:

  • 多实例部署
  • Redis 共享设备状态
  • 负载均衡器分发请求
  • WebSocket 粘性会话

功能扩展

插件架构(未来):

interface MeshKitPlugin {
  name: string
  version: string
  initialize(core: MeshKitCore): void
  destroy(): void
}

可扩展功能:

  • 视频通话
  • 屏幕共享
  • 语音消息
  • 云同步(可选)
  • 插件市场

总结

MeshKit 采用现代化的技术栈和模块化的架构设计,实现了:

  1. 高性能 - WebRTC P2P 直连,局域网可达 20-50 MB/s
  2. 高安全 - 多层加密,端到端加密,军事级保护
  3. 高可用 - 去中心化设计,服务器仅用于信令
  4. 易扩展 - 清晰的模块划分,便于添加新功能
  5. 跨平台 - 统一核心逻辑,支持多平台部署

通过合理的架构设计和技术选型,MeshKit 为用户提供了一个安全、高效、易用的 P2P 协作平台。