Files
dsh_shenxian/dsh-server-docs/04-调整方案/104-覆盖网络-全球架构复盘.md
T
admin 4e3a1a4a13 docs(overlay): 覆盖网络/客户端化 10 份规划转正式档案 103-112 + 登记
- 新增 04-调整方案/103-112:可行性评估 · 全球架构复盘 · 骨干层方案 ·
  百台推演 v2 · 千台全场景推演 · 游戏专项 · 游戏网络与群聊上限调研 ·
  答疑(群聊/备份/迁移/保密) · 补遗与参考方案 · 九大瓶颈落地方案
- 每份按 交接单/README.md §二 8 段改写(目标/只读前置/范围/决策点/
  步骤/验收/回滚/回报格式)+ 头部状态标注(📋 规划态 · 未实施)
- 技术内容不变:附录 A 逐字保留原文全文(仅去其一级标题),已逐份校验字节一致
- 登记:INDEX.md §二 +10 行、03-路线图与待办.md §二 +1 行
- 收尾:docs-audit.py 退出码 0(无 P0)· docs-manifest.py 已刷新
- 本轮零代码、零服务器改动;⛔ 未 push
- 占号:103-112(先原子 mkdir .lock-<NN> 再写)
2026-09-16 10:25:09 +08:00

267 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 104 · 覆盖网络 · 全球架构复盘
- 日期:2026-09-16 | 状态:📋 **规划态 / 未实施**(架构复盘稿;未接入任何机器、零代码改动)
- 来源:工作区根 `覆盖网络_全球架构复盘_20260916.md`(正文见 附录 A)
- 层级:**决策层 · 架构总纲**(五层架构 + 风暴类型学 + 流量组织)| 承接:档案 103 · 106;被 107 · 108–112 引用
- 触发(用户原话):要**覆盖全球、用户之间互联互通**的完整架构;**重点:避免网络流量风暴 + 有效组织流量上传与接收**
> **TL;DR**
> ✅ **有完整可循的工程路径** —— Tailscale / ZeroTier / Nebula / libp2p / BitTorrent 已反复验证过,**关键是照抄它们踩过的坑,而不是自己发明**。
> 五层架构(控制面 / 会合 / 骨干·中继 / 数据面 / 观测)+ **10 类风暴类型学** + **流量组织五原则** + 7 步落地顺序。
> 🔑 三句结论:**控制面与数据面必须彻底分离**;**失败不要变成重试**(退避 + 抖动 + 判死);**放大点必须前置治理**。
## 一、目标
给出「全球覆盖 + 用户间互联」的完整架构与**防风暴**的组织方式。可判定「做完了没有」= 五层职责明确、10 类风暴各有处置、流量预算表可算、落地顺序可排。
## 二、只读前置
| # | 事实 | 核对方式(期望输出) |
|---|---|---|
| 1 | 现有中继 = **绑在 Manager 上的 SSH 反向隧道(单中心)** ⇒ 必须先拆组件 | 读 `src/worker/tunnel.ts`(`ssh -O forward -R`)+ 集群化方案 §1.3 |
| 2 | 节点身份现为**共享密钥**(不满足「一机一身份 + 可吊销」) | 读 `src/worker/agent.ts` 头部自陈 |
| 3 | 现有心跳 **20 s** 正好落在 NAT 老化安全区间内 | 读 `src/worker/tunnel.ts` 自愈定时器 |
| 4 | 客户端首屏 bundle **≈10.8 MB**(实测 `11,363,655 B`)⇒ 冷启动风暴的量级来源 | 抓壳页 `/plugins/` 产物计字节(档案 97 同源) |
| 5 | 归属 / 租约 / 骨干资格**只能单点控制面写** | 集群化设计 §1.3(权威状态单点) |
## 三、范围
- **改什么**:⏳ 尚未开跑。方案面 = 拆会合/中继为独立组件 · 换传输 · 换身份 · 补 443/TCP 兜底 · 上参数表 · 内容寻址 + 分级缓存 · 骨干层 + 观测。
- **不动什么**:⛔ 官方 dsh 主程序(R2)|⛔ 单点控制面语义(归属/租约/资格签发**必须单点**,不得下放)|⛔ 本轮不动服务器。
- 🟢 **范围声明(2026-09-16 用户定)**:**本方案只考虑技术实现;跨境数据合规由使用者自行考虑。**
① 技术选型**不为合规让路**(多区域就近部署是**性能**最优的结果,不是合规动作);
② 跨境**不设限**(不做地域封禁、不做数据落地/留存约束);
③ **后续读者 ⛔ 不要再把合规 / 数据主权 / 备案当作本方案的前置条件、约束或上抛项**。
## 四、决策点
**已定**
1. **只做技术实现,合规由使用者自负**(用户原话,见 §三 范围声明)⇒ ⛔ 不得再上抛合规项。
2. **控制面 / 数据面彻底分离**(业内实测支撑:控制面挂掉时节点用内存 netmap 继续跑,已有连接不断)。
3. **骨干/中继是限额资源**(预约 + TTL + 配额),不可无限使用。
4. **可见性默认最小**(接入 ≠ 可见)。
**待拍板(唯一一项,真取舍)**:**骨干节点的服务范围** —— A 只服务自己名下设备(优点:无资源/计费纠纷、权限面不变;缺点:骨干少、冗余低)| B 服务全网(优点:骨干多、可用性高、中继容量易满足;缺点:他人流量跑在你的机器上、元数据暴露、被攻破影响面大)。**倾向 A→B 渐进**。详见档案 105 §七。
## 五、步骤(§八 落地顺序,每步自带一次验证)
1. **拆出会合 / 中继为独立组件**(脱离 Manager)→ 验证:Manager 重启不影响已有数据面连接。
2. 换传输:SSH 隧道 → **单进程多对端**隧道 → 验证:常驻内存下降 1–2 个数量级。
3. 身份:**一机一钥 + 吊销 + 自报网络画像** → 验证:吊销单台生效、其余不受影响。
4. 补 **443/TCP 兜底**通道 → 验证:封 UDP 环境(企业网/校园网)下仍能接入。
5. 上**限流与退避参数表**(§5.2)+ 连接水位/宽限期/扇出上限 → 验证:压测下无重试风暴。
6. **内容寻址 + 分级缓存** → 验证:版本发布时回源字节数 ≈ 1 份 × 组数。
7. 骨干层(多中心 + 选择性加入,见档案 105)+ **观测与容量告警**。
## 六、验收
| # | 口径 | 期望 |
|---|---|---|
| A | 12 条必须内建特性 | 逐条可对照(本档 §2 已列);实施后逐条给证据 |
| B | 10 类风暴 | 每类有「成因 → 触发 → 处置」,且处置落到参数与上限 |
| C | 流量预算表 | 每类流量有「频率 / 单次 / 放大后 / 上限手段」四列,可算 |
| D | 直连成功率 | 作为一等指标被采集(业内口径 >90–94%,本环境未实测) |
| E | 未验证项透明 | §九 六条已列全(网络类型占比、打洞成功率、自有中继收益、中继出口带宽、控制面规格、~~合规~~已出范围) |
## 七、回滚
- **本档自身**:零改动 ⇒ 无回滚需要。
- **执行期**:按 §五 顺序,**每步可单独回滚**(拆组件 / 换传输 / 换身份 / 补兜底各自独立);⛔ 但**归属/租约单点语义不得回滚**(那是红线,不是开关)。
## 八、回报格式
执行会话回填:① 每步验证命令 + 实际输出 ② 参数表落地值(并与 §5.2 逐项对照)③ 红线遵守声明(R2 / 单点控制面 / 接入≠可见)④ commit ⑤ 未完成项与卡点 ⑥ 若实测推翻推演数字,给出实测口径。
## 九、未验证项(勿当结论)
各网络类型实际占比(推演设定)|本环境实测打洞成功率(未实测)|自有中继的性能收益(业内 −150 ms / 12.5×,**本环境未复现**)|中继出口带宽与链路质量(未实测,跨云 22 KB/s 只能作下界)|控制面机规格(1.8 GB / 2 核,**待复核**)|~~跨境传输合规口径~~ ⏹ **已出范围**。
---
## 附录 A · 原始规划正文(逐字保留 · 2026-09-16)
> 以下为工作区根 `覆盖网络_全球架构复盘_20260916.md` 的**原文全文**,仅删除其一级标题(避免与档案标题重复),
> 其余**一字未改**;本档的可判定部分以上方 8 段为准。
> 日期:2026-09-16 | 性质:**架构复盘稿**(调研 + 推演,未接入任何机器)
> 承接:`覆盖网络_百台规模推演_20260916.md`(v2)· `覆盖网络_骨干层方案_20260916.md`
> 用户要求:**覆盖全球、用户之间互联互通**的完整架构;**重点:避免网络流量风暴 + 有效组织流量上传与接收**
---
## 0. 判定与目标
✅ **有完整可循的工程路径** —— 这套东西在 Tailscale / ZeroTier / Nebula / libp2p / BitTorrent 上已被反复验证,**关键是照抄它们踩过的坑,而不是自己发明**。
**目标形态**:任何用户在任何网络(服务器 / 家宽 / 共享 IP / 移动网 / 企业网 / VPN)里的设备,都能与自己的其他设备、以及授权的他人设备互通;**全球可接入**,且**网络在规模化时不产生风暴**。
> 🟢 **范围声明(2026-09-16 用户定)**:**本方案只考虑技术实现;跨境数据合规由使用者自行考虑。**
> 因此:① 技术选型**不为合规让路** —— 多区域就近部署是**性能**最优的结果,不是合规动作;② 跨境**不设限**(不做地域封禁、不做数据落地/留存约束);③ **后续读者 ⛔ 不要再把合规 / 数据主权 / 备案当作本方案的前置条件、约束或上抛项**。
---
## 1. 架构分层(五层)
| 层 | 职责 | 关键要求 |
|---|---|---|
| **控制面** | 身份、授权、归属/租约、网络地图(netmap)分发 | **承载几乎零流量**;**挂了不影响已建立的数据面**(节点内存缓存状态) |
| **会合层** | 交换候选地址、协助打洞、签发骨干目录 | 多区域、多实例、可缓存 |
| **骨干 / 中继层** | 打洞失败时转发密文;可选做区域汇聚 | **限额资源**(预约制 + TTL + 配额),**不可无限使用** |
| **数据面** | 端到端加密的节点间直连/中继传输 | 直连优先;**空闲不建连**;扇出设上限 |
| **观测层** | 路径类型(直连/中继)、时延、重连次数、带宽 | 没有它,容量规划与排障只能靠猜 |
**全球布局要点**:会合与中继按区域就近部署(业内做法:DERP 覆盖 **20+ 区域**,每区域多台冗余);跨洲回源要显式避免。
---
## 2. 必须内建的特性清单(12 条)
1. **控制面 / 数据面彻底分离** —— 业内实测:控制面挂掉时,节点用内存里的网络地图**继续跑**,已有连接不断。
2. **连接总是"先中继、再升级直连"** —— 先保证能连上,再后台升级到直连(Tailscale 的路径:**直连 → 自有中继 → 共享中继**)。
3. **直连成功率要作为一等指标** —— 业内 >90–94%(UDP 打洞成功率约 94%),**自有节点做中继**时实测 **延迟降 ~150 ms、吞吐提升 12.5×**。
4. **空闲不建连(懒建连)** —— WireGuard 对空闲 peer **不握手、不维护状态**:拓扑是"潜在可达",不是"常连"。
5. **中继是稀缺资源,要准入** —— 限额中继协议(预约 + TTL + 单次最大时长/数据量)是标准做法。
6. **失败要能"判死"** —— 判定"不可打洞的节点"直接降级中继,**不要反复重试**。
7. **端到端加密 + 中继不解密** —— 中继只见元数据(谁连谁、量多大)。
8. **一机一身份 + 可吊销**(现有共享密钥不满足)。
9. **自报网络画像** —— 路径类型 / NAT 类型 / 是否 VPN / 上行带宽。
10. **内容寻址 + 分级缓存** —— 同一份静态资源全网只取一次。
11. **统一限流与退避参数表**(下一节的"预算表")。
12. **可见性默认最小**(接入 ≠ 可见)。
---
## 3. 技术选型对照(照抄成熟做法)
| 维度 | 成熟做法 | 出处 |
|---|---|---|
| 隧道 | WireGuard(内核态或用户态) | Tailscale / NetBird |
| 打洞 | STUN + 同时发包;**先经中继交换信息再升级直连** | Tailscale DERP / libp2p **DCUtR** |
| 中继 | 限量中继(预约 + TTL + 配额);自有节点可当专用中继 | libp2p **relay v2** / Tailscale **Peer Relays** |
| 兜底通道 | **HTTPS/443**(UDP 全被封时仍能通) | DERP over TLS 443 |
| 连接管理 | 低/高水位 + **宽限期** + 按连接价值衰减裁剪 | libp2p Connection Manager(100 / 400 / 1 min) |
| 拨号限流 | **每对端最多 4 个并发拨号**、总并发 100、超时 30 s | libp2p Dialer 默认值 |
| 资源上限 | 连接数 / 流数 / 每协议流数 / 内存上限 + 自动伸缩 | libp2p Resource Manager |
| 中继自荐节流 | 服务广告**延迟 15 min、TTL 30 min** | libp2p HOP relay advertise |
| 中继数量上限 | 每节点最多预约 **2** 个中继 | libp2p `autoRelay.maxListeners` |
| 上传调度 | **同时上传对象上限 4**、10 s 重评、**30 s 随机试新对端** | BitTorrent choking |
| 分发调度 | **稀有优先**(+ 新人先随机易得)、末段加速、哈希校验 + 封禁 | BitTorrent |
---
## 4. ⚡ 流量风暴类型学(**重点一**)
> 每一类都给出:成因 → 触发 → 处置。**风暴的本质是"放大"**:一个事件被 N 个节点同时响应,就被放大了 N 倍。
| # | 风暴 | 成因 | 典型触发 | 处置 |
|---|---|---|---|---|
| 1 | **冷启动拉取风暴**(flashcrowd) | 大量节点同时拉同一份大资源 | 新版本发布(100 台 × 10.8 MB = **1.08 GB**) | 内容寻址 + 分级缓存 + **错峰启动** + 令牌桶 + 拉取而非推送 |
| 2 | **重连风暴 / 惊群** | 控制面或中继抖动 ⇒ 全体同时重连 | 控制面重启、中继切换 | **指数退避 + 随机抖动**;数据面不依赖控制面存活 |
| 3 | **保活风暴(N²)** | 全互联逐对保活 | 节点数增长(100 台全互联 = 4,950 对) | **禁全互联**;懒建连;**按需激活**;保活预算表 |
| 4 | **重试 / 重传风暴** | 打洞反复失败仍重试 | 对称 NAT / CGNAT 节点 | **失败预算**(每对端并发拨号 ≤4)+ 退避 + **判定即降级中继** |
| 5 | **同步 / 对账风暴** | 全量状态对账 | 状态变更或周期任务 | 增量 + 摘要比对 + 周期错峰 + 限速 |
| 6 | **探测风暴** | 每节点探测全部对端 | 监控过密 | 抽样探测 + 只在有流量时探测 + 结果缓存 |
| 7 | **NAT 表溢出** | 同 NAT 后多台同时向同一目标打洞 | 同一办公室多台设备 | **每 NAT / 每子网打洞并发上限** + 分散端口 |
| 8 | **中继过载 → 抖动放大** | 中继打满 ⇒ 超时 ⇒ 重试 ⇒ 更堵 | 突发流量 | 中继侧**准入 + 背压**;**超时不要立刻重试**;预约制配额 |
| 9 | **广播 / 泛洪风暴** | L2 广播或 gossip 无上限扩散 | 错误的二层拓扑 / 无 fanout 限制 | 覆盖层坚持 **L3**;gossip **限制扇出**或改拉取式 |
| 10 | **元数据 / 目录风暴** | 所有节点同时拉目录与 ACL | 目录更新 | 签名目录 + **TTL 缓存** + 多镜像 + 不推送 |
### 4.1 三条治风暴的总原则
1. **放大点前置** —— 任何"会被 N 个节点同时响应"的事件,都要在第一跳就被**限流 + 错峰 + 缓存**。
2. **失败不要变成重试** —— 重试是风暴的最大推手;必须"退避 + 抖动 + 判死"。
3. **数据面与控制面解耦** —— 控制面抖动不该引起数据面重连;否则一次发布 = 一次全局风暴。
---
## 5. 📊 流量的组织:上传与接收(**重点二**)
### 5.1 五条原则
1. **拉优先于推**:所有"广播"改为带 TTL 的本地缓存轮询 —— 服务器主动推 N 份 = 天然的放大。
2. **懒建连 + 按需激活**:连接由"有数据要发"驱动,不由"拓扑完整"驱动(WireGuard 对空闲 peer 零状态是这条的现成地基)。
3. **限制扇出**:任何节点**同时上传/转发的对象数设硬上限**(BitTorrent 是 4),否则上行带宽被稀释。
4. **直连优先、中继兜底且中继准入**:中继是稀缺资源,用预约 + TTL + 配额管住。
5. **内容寻址 + 分级缓存**:同一份 bundle 全网只该被取一次(把 100×10.8 MB 压成 1 份 + 99 次命中)。
### 5.2 流量预算表(什么频率、多大、放大后多少、用什么管住)
| 流量 | 频率 | 单次 | 100 台放大 | 上限手段 |
|---|---|---|---|---|
| 控制面心跳 | 20 s | ~100 B | **5 req/s**(可忽略) | 懒心跳(有变化才发)+ 合并上报 |
| 归属 / 状态同步 | 事件驱动 | 小 | 低 | 增量 + **单点写** |
| 打洞尝试 | 建连时 | 小 | 受并发约束 | **每对端 ≤4 并发** + 每 NAT 上限 |
| **客户端 bundle 首屏** | 版本变化时 | **10.8 MB** | **1.08 GB** | **内容寻址 + 边缘/本地缓存 + 局域网共享**;已加载走 **304** |
| 工作区文件传输 | 用户驱动 | 可变 | 不可预测 | 分片 + 断点续传 + 背压 + 后台限速 |
| 版本 / 目录分发 | 发布时 | 大 | 爆炸 | **分层拉取**(骨干 → 区域 → 边缘 → 节点),不推送 |
### 5.3 借鉴 BitTorrent 的调度(可直接搬的四件事)
| 机制 | 作用 | 对我们的用途 |
|---|---|---|
| **同时上传上限(4)** | 防止带宽稀释,逼出互惠 | 节点/中继的并发上传上限 |
| **随机试新对端(30 s)** | 跳出局部最优;让新人拿到第一份数据 | 新节点快速进入"可交换"状态 |
| **稀有优先** | 让资源分布**均匀化** ⇒ 最大化并发可交换性 | 大文件/多副本资源的分片调度 |
| **校验 + 封禁** | 防恶意节点反复喂坏数据浪费带宽 | 客户端版本包与资源包的完整性 |
⚠️ 一条已实测的坑(学术结论):**单纯按速率互惠对低带宽节点不公平**(高带宽节点上传量可达下载量的 7 倍);改为**配对块级记账**(`已上传 ≤ 已下载 + Δ`)能显著改善公平性且不损失利用率。
### 5.4 针对我们那份 10.8 MB 首屏的专项处置
1. **内容寻址 + 不可变缓存**:版本号即内容指纹 ⇒ 可以永久缓存、跨节点复用。
2. **分级缓存**:区域边缘缓存一份,局域网内**互相共享**(办公室/家庭多台设备只回源一次)。
3. **已加载走 304**(平台已有此能力)。
4. **错峰 + 令牌桶**:版本发布时不要 100 台同时拉。
5. ⇒ 把"跨机冷加载 10.8 MB"从**常态**降成**例外**。
---
## 6. 全球规模的额外约束
| 约束 | 影响 | 处置 |
|---|---|---|
| **RTT 与带宽时延积** | 跨洲 RTT 200 ms,单条 TCP 吞吐受窗口限制 | 调大窗口 / 用 QUIC 多流;避免跨洲回源 |
| **区域就近** | 跨区域中继 = 白付延迟与带宽 | GeoDNS / anycast 落地会合与中继 |
| ~~数据主权与合规~~ | **不在本方案范围**(见 §0 范围声明) | 由使用者自行考虑 —— 技术上不做地域封禁、不做数据落地约束 |
| **时钟** | 签名 / 证书校验依赖时间 | 强制时间同步 + 容忍窗口 |
| **观测** | 全球分布后本地排障失效 | 集中指标 + 每节点自报画像 |
---
## 7. 与现平台的结合点
| 项 | 判定 |
|---|---|
| 归属 / 租约 / 资格签发 | ⛔ **必须单点控制面**(现架构已如此,继续沿用) |
| 会合 / 中继多实例 | ✅ 属数据面,**架构本来就允许** |
| 客户端形态 | ✅ 单机自用 + 覆盖网络互联**不矛盾**(租户维度收窄 ≠ 网络维度收窄) |
| 现有中继 | ⚠️ 现在是**绑在 Manager 上的 SSH 反向隧道(单中心)** ⇒ **必须先拆成可独立部署组件** |
| 现有 20 s 心跳 | ✅ 正好落在 NAT 老化的安全区间内 |
| 共享密钥 | ❌ 必须换成一机一钥 + 可吊销 |
| 11 MB bundle + ETag/304 | ✅ 已有基础,需补**内容寻址与分级缓存** |
---
## 8. 落地顺序
1. 拆出**会合 / 中继**为独立组件(脱离 Manager)。
2. 换传输:SSH 隧道 → **单进程多对端**隧道(内存差 1–2 个数量级)。
3. 身份:一机一钥 + 吊销 + 自报网络画像。
4. 补 **443/TCP 兜底**通道(治封 UDP 的企业网/校园网)。
5. 上**限流与退避参数表**(§5.2)+ 连接水位/宽限期/扇出上限。
6. 内容寻址 + 分级缓存(治 10.8 MB 首屏)。
7. 骨干层(多中心 + 选择性加入,见骨干层方案);观测与容量告警。
---
## 9. 未验证项(勿当结论)
| # | 项 | 状态 |
|---|---|---|
| 1 | 各网络类型实际占比 | ⚠️ 推演设定(决定中继容量) |
| 2 | 本环境实测打洞成功率 | ⚠️ 未实测(业内 90–94% 只能作参考) |
| 3 | 自有中继的性能收益(延迟/吞吐) | 📋 业内实测 −150 ms / 12.5×,**本环境未复现** |
| 4 | 中继出口带宽与链路质量 | ⚠️ 未实测(跨云 22 KB/s 只能作下界) |
| 5 | 控制面机规格 | ⚠️ 旧记录 1.8 GB / 2 核,**待复核** |
| 6 | ~~跨境传输合规口径~~ | ⏹ **已出范围**(2026-09-16 用户:「方案只考虑技术实现,跨境数据合规是谁用谁自己考虑」)—— **不再作为方案约束或上抛项** |