- 新增 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> 再写)
19 KiB
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 用户定):本方案只考虑技术实现;跨境数据合规由使用者自行考虑。 ① 技术选型不为合规让路(多区域就近部署是性能最优的结果,不是合规动作); ② 跨境不设限(不做地域封禁、不做数据落地/留存约束); ③ 后续读者 ⛔ 不要再把合规 / 数据主权 / 备案当作本方案的前置条件、约束或上抛项。
四、决策点
已定
- 只做技术实现,合规由使用者自负(用户原话,见 §三 范围声明)⇒ ⛔ 不得再上抛合规项。
- 控制面 / 数据面彻底分离(业内实测支撑:控制面挂掉时节点用内存 netmap 继续跑,已有连接不断)。
- 骨干/中继是限额资源(预约 + TTL + 配额),不可无限使用。
- 可见性默认最小(接入 ≠ 可见)。
待拍板(唯一一项,真取舍):骨干节点的服务范围 —— A 只服务自己名下设备(优点:无资源/计费纠纷、权限面不变;缺点:骨干少、冗余低)| B 服务全网(优点:骨干多、可用性高、中继容量易满足;缺点:他人流量跑在你的机器上、元数据暴露、被攻破影响面大)。倾向 A→B 渐进。详见档案 105 §七。
五、步骤(§八 落地顺序,每步自带一次验证)
- 拆出会合 / 中继为独立组件(脱离 Manager)→ 验证:Manager 重启不影响已有数据面连接。
- 换传输:SSH 隧道 → 单进程多对端隧道 → 验证:常驻内存下降 1–2 个数量级。
- 身份:一机一钥 + 吊销 + 自报网络画像 → 验证:吊销单台生效、其余不受影响。
- 补 443/TCP 兜底通道 → 验证:封 UDP 环境(企业网/校园网)下仍能接入。
- 上限流与退避参数表(§5.2)+ 连接水位/宽限期/扇出上限 → 验证:压测下无重试风暴。
- 内容寻址 + 分级缓存 → 验证:版本发布时回源字节数 ≈ 1 份 × 组数。
- 骨干层(多中心 + 选择性加入,见档案 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 条)
- 控制面 / 数据面彻底分离 —— 业内实测:控制面挂掉时,节点用内存里的网络地图继续跑,已有连接不断。
- 连接总是"先中继、再升级直连" —— 先保证能连上,再后台升级到直连(Tailscale 的路径:直连 → 自有中继 → 共享中继)。
- 直连成功率要作为一等指标 —— 业内 >90–94%(UDP 打洞成功率约 94%),自有节点做中继时实测 延迟降 ~150 ms、吞吐提升 12.5×。
- 空闲不建连(懒建连) —— WireGuard 对空闲 peer 不握手、不维护状态:拓扑是"潜在可达",不是"常连"。
- 中继是稀缺资源,要准入 —— 限额中继协议(预约 + TTL + 单次最大时长/数据量)是标准做法。
- 失败要能"判死" —— 判定"不可打洞的节点"直接降级中继,不要反复重试。
- 端到端加密 + 中继不解密 —— 中继只见元数据(谁连谁、量多大)。
- 一机一身份 + 可吊销(现有共享密钥不满足)。
- 自报网络画像 —— 路径类型 / NAT 类型 / 是否 VPN / 上行带宽。
- 内容寻址 + 分级缓存 —— 同一份静态资源全网只取一次。
- 统一限流与退避参数表(下一节的"预算表")。
- 可见性默认最小(接入 ≠ 可见)。
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 三条治风暴的总原则
- 放大点前置 —— 任何"会被 N 个节点同时响应"的事件,都要在第一跳就被限流 + 错峰 + 缓存。
- 失败不要变成重试 —— 重试是风暴的最大推手;必须"退避 + 抖动 + 判死"。
- 数据面与控制面解耦 —— 控制面抖动不该引起数据面重连;否则一次发布 = 一次全局风暴。
5. 📊 流量的组织:上传与接收(重点二)
5.1 五条原则
- 拉优先于推:所有"广播"改为带 TTL 的本地缓存轮询 —— 服务器主动推 N 份 = 天然的放大。
- 懒建连 + 按需激活:连接由"有数据要发"驱动,不由"拓扑完整"驱动(WireGuard 对空闲 peer 零状态是这条的现成地基)。
- 限制扇出:任何节点同时上传/转发的对象数设硬上限(BitTorrent 是 4),否则上行带宽被稀释。
- 直连优先、中继兜底且中继准入:中继是稀缺资源,用预约 + TTL + 配额管住。
- 内容寻址 + 分级缓存:同一份 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 首屏的专项处置
- 内容寻址 + 不可变缓存:版本号即内容指纹 ⇒ 可以永久缓存、跨节点复用。
- 分级缓存:区域边缘缓存一份,局域网内互相共享(办公室/家庭多台设备只回源一次)。
- 已加载走 304(平台已有此能力)。
- 错峰 + 令牌桶:版本发布时不要 100 台同时拉。
- ⇒ 把"跨机冷加载 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. 落地顺序
- 拆出会合 / 中继为独立组件(脱离 Manager)。
- 换传输:SSH 隧道 → 单进程多对端隧道(内存差 1–2 个数量级)。
- 身份:一机一钥 + 吊销 + 自报网络画像。
- 补 443/TCP 兜底通道(治封 UDP 的企业网/校园网)。
- 上限流与退避参数表(§5.2)+ 连接水位/宽限期/扇出上限。
- 内容寻址 + 分级缓存(治 10.8 MB 首屏)。
- 骨干层(多中心 + 选择性加入,见骨干层方案);观测与容量告警。
9. 未验证项(勿当结论)
| # | 项 | 状态 |
|---|---|---|
| 1 | 各网络类型实际占比 | ⚠️ 推演设定(决定中继容量) |
| 2 | 本环境实测打洞成功率 | ⚠️ 未实测(业内 90–94% 只能作参考) |
| 3 | 自有中继的性能收益(延迟/吞吐) | 📋 业内实测 −150 ms / 12.5×,本环境未复现 |
| 4 | 中继出口带宽与链路质量 | ⚠️ 未实测(跨云 22 KB/s 只能作下界) |
| 5 | 控制面机规格 | ⚠️ 旧记录 1.8 GB / 2 核,待复核 |
| 6 | ⏹ 已出范围(2026-09-16 用户:「方案只考虑技术实现,跨境数据合规是谁用谁自己考虑」)—— 不再作为方案约束或上抛项 |