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

19 KiB
Raw Blame History

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 用户:「方案只考虑技术实现,跨境数据合规是谁用谁自己考虑」)—— 不再作为方案约束或上抛项