diff --git a/TASKS.md b/TASKS.md index 3a9bf11..8a88501 100644 --- a/TASKS.md +++ b/TASKS.md @@ -37,15 +37,15 @@ UDP 打洞优先,分层中继,超级辅助节点。 - [x] **集成到 inp2pc main**:登录前先探测,结果带入 LoginReq - [ ] 定期重新探测(每 5 分钟),NATType 变化时通知 server -### M3: 打洞(预计 300 行) +### M3: 打洞(预计 300 行)✅ 完成 - [x] UDP punch 基础实现 `pkg/punch/` - [x] TCP punch 基础实现 - [x] 优先级链(direct → UDP → TCP) -- [ ] **双端同步打洞协调** - - server 收到 A 的 ConnectReq - - 同时推送 PunchStart 给 A 和 B(带对方的 IP:Port + NAT 类型) - - 双方同时调 `punch.Connect()` - - 任一方成功后报告 PunchResult +- [x] **双端同步打洞协调** `internal/server/coordinator.go` + - [x] server 收到 A 的 ConnectReq + - [x] 同时推送 PunchStart 给 A 和 B(带对方的 IP:Port + NAT 类型) + - [x] 双方同时调 `punch.Connect()` + - [x] 任一方成功后报告 PunchResult - [ ] Symmetric NAT 端口预测(可选优化) - [ ] 打洞结果上报 + 统计 @@ -63,22 +63,25 @@ UDP 打洞优先,分层中继,超级辅助节点。 - [ ] UDP 端口转发实现 - [x] 连接池/复用(同 peer 多 app 共享一条 tunnel) -### M5: 中继(预计 400 行) -- [x] 中继管理器框架 `pkg/relay/` -- [ ] **中继节点选择策略**(server 端) - - 同用户 `--relay` 节点优先 - - 全局 `--super` 节点次优 - - server 自身中继兜底 -- [ ] **中继握手协议** - - A → server: RelayNodeReq - - server → A: RelayNodeRsp(中继节点信息 + TOTP/一次性令牌) - - A → relay: 建立 TCP 连接 + 携带令牌 - - server → relay: PushRelayOffer(通知中继节点) - - B → relay: 建立 TCP 连接 - - relay: 桥接 A↔B -- [ ] **中继认证** - - 同用户:TOTP(token, now) - - 跨用户超级节点:server 签发 `RelayToken`(HMAC-SHA256 签名,含 TTL) +### M5: 中继(预计 400 行)✅ 完成 +- [x] 中继管理器 `pkg/relay/` — 完整实现(~320 行) +- [x] **中继节点选择策略**(server 端 `server.GetRelayNodes()`) + - [x] 同用户 `--relay` 节点优先 + - [x] 全局 `--super` 节点次优 + - [x] server 自身中继兜底 +- [x] **中继握手协议**(长度前缀 JSON) + - [x] A → relay: TCP 连接 + RelayHandshake{sessionID, role="from", token, node} + - [x] B → relay: TCP 连接 + RelayHandshake{sessionID, role="to", token, node} + - [x] relay: TOTP 验证 → 配对等待(30s 超时)→ 双向桥接 + - [x] 结果回传 relayResult{error, detail} +- [x] **中继认证** + - [x] 同用户:TOTP(token, now) + - [x] 跨用户超级节点:server 签发 `RelayToken`(HMAC-SHA256 签名,含 TTL) +- [x] **客户端工具函数** `ConnectToRelay()` — 封装完整握手+等待配对 +- [x] **测试覆盖**(3/3 通过) + - [x] TestRelayBridge — A↔B 双向数据验证 + - [x] TestRelayLargeData — 1MB 精确传输 + - [x] TestRelayAuthDenied — 错误 TOTP 被正确拒绝 - [ ] 中继带宽统计 + 负载均衡 ### M6: inp2ps / inp2pc main 入口(预计 200 行)✅ 完成 @@ -180,7 +183,7 @@ pkg/ ├── punch/ ✅ 完成(UDP/TCP punch + direct + 优先级链) ├── mux/ ✅ 完成(流多路复用,7 测试 + 1 benchmark 全部通过) ├── tunnel/ ✅ 完成(基于 mux 的端口转发,端到端测试通过) -└── relay/ ✅ 框架完成(缺握手协议实现) +└── relay/ ✅ 完成(中继握手、TOTP 认证、双向桥接、3 测试通过) internal/ ├── server/ ✅ 完成(登录、心跳、report、relay 选择、节点管理、打洞协调) @@ -199,7 +202,9 @@ cmd/ - pkg/mux: 7 tests + 1 bench (0.2s) — 并发/大载荷/FIN/session - pkg/tunnel: 3 tests (0.16s) — 端到端转发/5 并发/统计 -二进制: bin/inp2ps (8.8MB) + bin/inp2pc (8.2MB) + - pkg/relay: 3 tests (0.3s) — 双向桥接/1MB 中继/认证拒绝 + +二进制: bin/inp2ps (6.0MB) + bin/inp2pc (5.6MB) (静态编译, strip) ``` ## 接口约定(核心层 ↔ 前端/次要层)