# 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 管传输*
