183 lines
6.0 KiB
Markdown
183 lines
6.0 KiB
Markdown
# Core 模块分层架构与文件组织规范
|
||
|
||
## 🎯 职责分工
|
||
|
||
### `connect/` - 连接工厂层(对外建立连接)
|
||
|
||
**职责**:**对外**与 Peer 建立各种类型的网络连接,返回标准的 `net.Conn` 接口。
|
||
|
||
**关键特性**:
|
||
- 实现 **9 层降级传输策略**
|
||
- 每层独立的连接工厂(Factory)
|
||
- 所有工厂实现统一的 `TransportFactory` 接口
|
||
- 通过 `StrategyScheduler` 管理优先级和自动降级
|
||
|
||
**文件组织**(9 个独立工厂):
|
||
```
|
||
connect/
|
||
├── strategy.go # 策略调度器(核心)
|
||
│ ├── StrategyScheduler # 管理 9 层工厂的优先级
|
||
│ ├── TransportFactory # 统一接口:Dial() net.Conn
|
||
│ └── Layer # 9 层枚举
|
||
│
|
||
├── ice.go # ICE 协商(辅助功能)
|
||
│
|
||
├── direct_udp.go # Direct-UDP 工厂 ⏳ 待从 fake_tcp.go 拆分
|
||
├── fake_tcp.go # Direct-FakeTCP 工厂 ✅
|
||
├── real_tcp.go # Direct-RealTCP 工厂 ✅
|
||
│
|
||
├── turn_udp.go # TURN-UDP 工厂 ✅ (已重命名)
|
||
├── turn_tcp.go # TURN-TCP 工厂 ⏳ 待从 turn_udp.go 拆分
|
||
├── turn_tls.go # TURN-TLS 工厂 ⏳ 待从 turn_udp.go 拆分
|
||
├── turn_quic.go # TURN-QUIC 工厂 ✅
|
||
│
|
||
├── webrtc.go # WebRTC 工厂 ⏳ 待创建
|
||
└── ws.go # WS/WSS 工厂 ✅ (已重命名)
|
||
```
|
||
|
||
**为什么叫 `connect`**:
|
||
- 词源:**Connect to peer**(连接到对端)
|
||
- 职责:**建立**网络连接
|
||
- 抽象层次:网络层(Network Layer)+ 传输层(Transport Layer)
|
||
|
||
---
|
||
|
||
### `transport/` - 传输绑定层(对内对接 WireGuard)
|
||
|
||
**职责**:**对内**将建立的连接暴露给 WireGuard 使用,实现 `conn.Bind` 接口。
|
||
|
||
**关键特性**:
|
||
- 不关心具体的建连方式(UDP/TCP/TURN)
|
||
- 只使用 `net.Conn` 接口
|
||
- 负责 WireGuard 数据包的 Read/Write
|
||
- 管理 Peer 连接的生命周期
|
||
|
||
**文件组织**(2 个核心组件):
|
||
```
|
||
transport/
|
||
├── core_bind.go # WireGuard Bind 实现
|
||
│ └── CoreBind # 实现 conn.Bind 接口
|
||
│ ├── Write(buffers) # 写入 WireGuard 数据包
|
||
│ ├── Read(buffer) # 读取 WireGuard 数据包
|
||
│ └── Dial(peerID) # 使用 connect.Scheduler 建连
|
||
│
|
||
└── relay.go # 数据中继器
|
||
└── Relay # 基于 net.Conn 的透明转发
|
||
├── RegisterFactory() # 注册传输工厂
|
||
├── GetConnection() # 获取已建立的连接
|
||
└── Forward() # 透明读写转发
|
||
```
|
||
|
||
**为什么叫 `transport`**:
|
||
- 词源:**Transport WireGuard packets**(传输 WireGuard 数据包)
|
||
- 职责:**传输**应用层数据(WireGuard 密文)
|
||
- 抽象层次:绑定层(Bind Layer)- WireGuard 专有概念
|
||
|
||
---
|
||
|
||
## 📊 完整数据流
|
||
|
||
```
|
||
[WireGuard 内核态]
|
||
↓ Write(buffers, size, offset)
|
||
↓ "发送加密数据包"
|
||
|
||
[transport/CoreBind]
|
||
↓ 检查是否有 Peer 的连接
|
||
↓ 如果没有 → 调用 Scheduler.Dial()
|
||
↓ 如果有 → 直接使用现有 net.Conn
|
||
↓ conn.Write(packet)
|
||
|
||
[connect/StrategyScheduler]
|
||
↓ 按优先级尝试 9 层工厂
|
||
↓ Layer1: Direct-UDP.Dial()
|
||
↓ 失败 → Layer2: FakeTCP.Dial()
|
||
↓ 失败 → Layer3: RealTCP.Dial()
|
||
↓ ...
|
||
↓ 成功 → 返回 net.Conn
|
||
|
||
[底层网络 Socket]
|
||
↓ UDP Socket.Send()
|
||
↓ TCP Socket.Connect() + Send()
|
||
↓ TURN Server.Allocate() + Send()
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 当前状态 vs 目标状态
|
||
|
||
### Connect 目录(连接工厂层)
|
||
|
||
| 当前文件 | 目标文件名 | 状态 | 说明 |
|
||
|---------|-----------|------|------|
|
||
| `strategy.go` | `strategy.go` | ✅ | 策略调度器 |
|
||
| `ice.go` | `ice.go` | ✅ | ICE 协商 |
|
||
| `fake_tcp.go` | `direct_udp.go` | 🔄 | 需要拆分出 Direct-UDP |
|
||
| `fake_tcp_factory.go` | 合并到 `fake_tcp.go` | 🔄 | 空文件,可删除 |
|
||
| `real_tcp.go` | `real_tcp.go` | ✅ | RealTCP |
|
||
| `real_tcp_factory.go` | 合并到 `real_tcp.go` | 🔄 | 空文件,可删除 |
|
||
| `turn_udp.go` | `turn_udp.go` | ✅ | 已重命名 |
|
||
| `turn_tcp.go` | `turn_tcp.go` | ⏳ | 待从 turn_udp.go 拆分 |
|
||
| `turn_tls.go` | `turn_tls.go` | ⏳ | 待从 turn_udp.go 拆分 |
|
||
| `turn_quic.go` | `turn_quic.go` | ✅ | QUIC 扩展 |
|
||
| `webrtc.go` | `webrtc.go` | ⏳ | 待创建 |
|
||
| `ws.go` | `ws.go` | ✅ | 已重命名 |
|
||
| `stun.go` | `stun.go` | ✅ | STUN 探测(辅助) |
|
||
|
||
### Transport 目录(传输绑定层)
|
||
|
||
| 当前文件 | 目标文件名 | 状态 | 说明 |
|
||
|---------|-----------|------|------|
|
||
| `core_bind.go` | `core_bind.go` | ✅ | WireGuard Bind |
|
||
| `relay.go` | `relay.go` | ✅ | 数据中继 |
|
||
| ~~`intercept.go`~~ | ❌ 已删除 | ✅ | 废弃(被 CoreBind 替代) |
|
||
|
||
---
|
||
|
||
## ✅ 重构原则
|
||
|
||
### 1. 保持 9 层独立性
|
||
- ❌ **不要合并**不同层的工厂(如 P2P 工厂)
|
||
- ✅ **每层对应一个文件**(如 `turn_udp.go`, `turn_tcp.go`)
|
||
- ✅ **每层实现统一的接口**(`TransportFactory`)
|
||
|
||
### 2. 文件名语义化
|
||
- ✅ `{layer}.go` - 直接体现传输层类型
|
||
- ✅ `{layer}_factory.go` - 强调工厂模式(可选)
|
||
- ❌ 避免模糊的名称(如 `p2p_factory.go` 包含 3 层)
|
||
|
||
### 3. 职责分离
|
||
- ✅ `connect/` 负责**建立**连接(Dial)
|
||
- ✅ `transport/` 负责**使用**连接(Read/Write)
|
||
- ❌ 不要混淆两者的边界
|
||
|
||
---
|
||
|
||
## 📝 下一步行动
|
||
|
||
### Phase 1: 清理空文件
|
||
```bash
|
||
rm core/connect/fake_tcp_factory.go
|
||
rm core/connect/real_tcp_factory.go
|
||
```
|
||
|
||
### Phase 2: 拆分 TURN 工厂
|
||
- 从 `turn_udp.go` 中拆分出:
|
||
- `turn_tcp.go` - TURN-TCP 工厂
|
||
- `turn_tls.go` - TURN-TLS 工厂
|
||
|
||
### Phase 3: 补充缺失的层
|
||
- 创建 `direct_udp.go` - Direct-UDP 工厂
|
||
- 创建 `webrtc.go` - WebRTC 工厂
|
||
|
||
### Phase 4: 验证编译
|
||
```bash
|
||
go build ./cmd/meshray
|
||
```
|
||
|
||
---
|
||
|
||
*创建时间:2026-03-20*
|
||
*版本:v2.1.0*
|
||
*架构原则:connect 管建连,transport 管传输*
|