- 新增 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> 再写)
17 KiB
106 · 覆盖网络 · 百台规模推演-v2
- 日期:2026-09-16 | 版本:v2(09:3x 按用户纠正重写前提与结论)| 状态:📋 规划态(纯文字推演,纸面演算,未接入任何机器)
- 来源:工作区根
覆盖网络_百台规模推演_20260916.md(正文见 附录 A) - 层级:规模推演(第一版)| 承接档案 103 §六;上级 = 档案 104;被 105(P0-1 展开)· 107(扩到 1000 台)承接
⚠️ 本档含一次前提级纠错(v1 作废),务必先读 §0 修正声明 用户纠正原话:「单机用也要互联,这正是建立覆盖网络的目的」,且 100 台是各种网络情况,不是全都是单机。 v1 错在把「租户维度收窄」误当成「网络维度收窄」(平台只有我一个用户 ≠ 我只有一台机器、不需要跨机)。
TL;DR(v2) 租户维度只有一个人,不影响网络维度有 100 台设备要互通 ⇒ 覆盖网络正是为「同一个人/团队的多台设备散落在各种网络里」而存在。 异构网络最直接的后果:中继占比远高于同构假设(不是 15%,基准 40–45%、最坏 55%)⇒ 中继容量必须按最坏情况预留, 并先把网络里现成的公网节点(L1)用起来当会合/中继。拓扑不用换(仍是星型/分组星型),要换的是三件:传输、身份、443/TCP 兜底。
一、目标
对「同一个人/团队名下 100 台异构设备经覆盖网络互联」做纸面推演:节点画像 · 中继容量 · 拓扑 · 分场景判读 · 瓶颈排序 · P0/P1/P2 前置项。 可判定「做完了没有」= 上述六项齐备,且每条数值都标注是「推演设定」还是「实测锚点」。
二、只读前置
| # | 事实(实测锚点,非推演) | 核对方式(期望输出) |
|---|---|---|
| 1 | 跨机访问实例 UI 首屏 ≈10.8 MB(实测) | 抓壳页 /plugins/ 合并脚本计字节(档案 97 同源,实测 11,363,655 B) |
| 2 | 跨云链路 ~22 KB/s(下界参考) | 47↔106 实测记录(见档案 110 §三) |
| 3 | 心跳间隔 20 s | src/worker/tunnel.ts 自愈定时器 |
| 4 | 归属/租约必须单点 Manager;会合/中继可多实例 | 集群化设计 §1.3 |
| 5 | 节点身份现为共享密钥(无法吊销单台)⇒ 一机一钥是硬前置 | src/worker/agent.ts 头部自陈 |
三、范围
- 改什么:⏳ 未开跑。本档只输出推演与 P0/P1/P2 前置清单,不含实施。
- 不动什么:⛔ 权威状态单点语义|⛔ 本轮不动服务器、不改代码。
- 前提口径(用户纠正后):100 台 = 异构(服务器 / 家宽 / 共享 IP·CGNAT / 移动网 / 企业校园网 / VPN 全隧道),不是同构单机。
四、决策点
已定(v2 重写后的口径)
- 单机自用 ≠ 不需要互联 —— 租户维度收窄 ≠ 网络维度收窄(用户原话)。⛔ 不得再用「单机自用所以没流量要互联」当前提。
- 中继按 45% 设计 / 55% 留余量(乐观 30% / 基准 40–45% / 悲观 55%)—— ⛔ 不得再用同构假设的 15%。
- 必须补 443/TCP 兜底通道(否则封 UDP 的企业/校园网整类节点进不来)。
- L1(有公网 IP)自动升格为中继候选池。
- 拓扑仍是星型 / 分组星型 + 按需建连 + 懒保活(⛔ 不建全互联:100 台全互联 4,950 条 vs 星型 100 条,差 49.5 倍)。
未定 / 待复核:控制面机规格(1.8 GB / 2 核 系 09-08 旧记录);各网络类型实际占比(推演设定,需按真实设备池校准)。
五、步骤(§7 前置项,按 P0/P1/P2)
P0(不做就走不通)
- 中继容量按 45–55% L3 占比设计 + L1 自动升格 → 验证:中继容量不随玩家/设备数漂移。
- 443/TCP 兜底通道 → 验证:封 UDP 环境仍能接入。
- 一机一钥 + 可吊销 + 限流 → 验证:吊销单台生效。
- SSH 反向隧道换成单进程多对端方案 → 验证:常驻内存下降 1–2 个数量级。
P1(不做会出事):中继 ≥2 台且与控制面分开部署 + 秒级切换|跨机大流量直连优先 + 10.8 MB 首屏就近/本地缓存|保活 ≤25 s;VPN/代理类检测即降级中继(不重试)|重连指数退避 + 抖动 + 控制面令牌桶。
P2:节点自报网络画像(路径类型 / NAT 类型 / 是否 VPN / 上行带宽)|客户端 × 平台版本兼容矩阵。
六、验收
| # | 口径 | 期望 |
|---|---|---|
| A | 分层数字 | L1 10 / L2 30 / L3 需中继 40–55;稳态中继 20–27 Mbps |
| B | 拓扑对比 | 全互联 4,950 条 vs 星型 100 条 ⇒ 明确不建全互联 |
| C | 分场景判读 | S1–S9 逐条给出判读(含 S4 定性从「危险」修正为「核心用例」) |
| D | 瓶颈排序 | 7 条按「先炸顺序」排(中继带宽第一) |
| E | 未验证项透明 | §九 七条已列全 |
七、回滚
- 本档自身:零改动 ⇒ 无回滚需要。
- ⚠️ v1 的前提已被推翻:本档取代 v1,⛔ 不得再引用 v1 §0 的结论("100 台没有流量要互联")。v1 全文保留在 附录 A 的 §0 修正声明中(作为错误样本)。
八、回报格式
执行会话回填:① 校准后的网络类型实际占比(与 §2 表对照)② 实测打洞成功率(分层)③ 中继出口带宽与 jitter 实测 ④ 控制面规格复核结果 ⑤ 若推翻本档任一数字,给出实测口径与取数时间。
九、未验证项(勿当结论)
各网络类型实际占比(推演设定,需按真实设备池校准)|打洞成功率(分层:家宽 / CGNAT / 移动网 / 企业网,未实测)|VPN 全隧道是否真的破坏打洞(未实测,推演按"会破坏"保守处理)|企业网封 UDP 的比例(未实测)|中继出口带宽与链路质量(未实测,仅有跨云 22 KB/s 作下界)|控制面机规格(1.8 GB / 2 核,待复核)|单条 SSH 隧道常驻内存 3–5 MB(量级估计)。
附录 A · 原始规划正文(逐字保留 · 2026-09-16)
以下为工作区根
覆盖网络_百台规模推演_20260916.md的原文全文,仅删除其一级标题(避免与档案标题重复), 其余一字未改;本档的可判定部分以上方 8 段为准。
日期:2026-09-16 | 版本:v2(09:3x 按用户纠正重写前提与结论)| 性质:纯文字推演(纸面演算,未接入任何机器) 配套:
可行性评估_客户端安装与覆盖网络互联_20260916.md§六|dsh客户端化部署方案_20260916.md|dsh桌面客户端_开发方案_20260916.md📄 本文的上一级(全球级复盘,含风暴类型学与流量组织)见覆盖网络_全球架构复盘_20260916.md
0. 修正声明(v1 的第 0 节被判定为错误)
⚠️ 用户纠正(2026-09-16 09:3x,原话要点):「单机用也要互联,这正是建立覆盖网络的目的」;且 100 台是各种网络情况,不是全都是单机 —— 有服务器、有单机、有局域网、有互联网、有专属外网 IP、有共享外网 IP、有固定宽带、有移动网、有 VPN 等各种情况。
v1 错在哪:v1 断言"按单机自用形态,100 台之间根本没有流量要互联 ⇒ 覆盖网络无事可做"。 错因:把 租户维度的收窄(平台只有我一个用户)误当成 网络维度的收窄(我只有一台机器、不需要跨机)。
| 维度 | 单机自用是否收窄 | 说明 |
|---|---|---|
| 租户维度(有几个人用) | ✅ 收窄为 1 | 形态开关决定 |
| 网络维度(要连几台机器) | ❌ 完全不收窄 | 同一个人也有多台设备,分布在家里宽带 / 移动网 / 公司网 / 云主机上 —— 这正是覆盖网络存在的理由 |
⇒ 修正后:"单机自用"与"需要互联"不矛盾,而是同一条路线的两个正交面。 v2 据此重写。
1. 前提(v2)
| 项 | 取值 |
|---|---|
| 角色 | 同一个人(或同一个团队)名下的 100 台设备,经覆盖网络互相可见 |
| 目标流量 | ① 跨机访问彼此的实例/工作区 ② 跨机文件与数据交换 ③ 平台侧的控制与调度 |
| 中心 | 控制面(会合点)+ 中继 —— 数量与落点见 §3(不再假设只有 1 台) |
| 节点构成 | 异构,见 §2 |
2. 节点构成:100 台的异构画像(这是 v1 缺失的核心)
台数为推演设定(可按实际调),关键结论对比例敏感、对绝对值不敏感。
| 类 | 场景 | 台数 | 公网可达 | NAT 行为 | 打洞前景 |
|---|---|---|---|---|---|
| A | 云服务器(专属公网 IP) | 10 | ✅ 可直接拨入 | 无 NAT | 不需要打洞 |
| B | 家庭固定宽带 | 30 | ❌ | 多为锥形/受限锥形 | ✅ 最好 |
| C | 共享公网 IP / CGNAT(含运营商大内网) | 20 | ❌ | 多用户共享同一出口,端口映射冲突 | ⚠️ 差 |
| D | 移动网(4G/5G) | 15 | ❌ | 对称 NAT + CGNAT 居多 | ❌ 基本失败;且切基站就换 IP |
| E | 企业 / 校园局域网 | 15 | ❌ | 对称 NAT,常封 UDP,可能强制 HTTP 代理 | ❌ 差 |
| F | VPN 用户(全隧道) | 10 | 取决于 VPN | VPN 把流量全隧道化 ⇒ 映射被破坏 | ❌ 差 |
2.1 按可达性分三层(决定谁是直连、谁是中继)
| 层 | 定义 | 台数 | 在方案里的角色 |
|---|---|---|---|
| L1 | 可直接拨入(有公网 IP) | 10 | 天然的会合点 / 中继候选 |
| L2 | 能打洞(锥形类) | 30 | 直连主体,流量不过中心 |
| L3 | 只能走中继 | 40–55(C/D/E/F 中打洞失败的部分) | 中继容量必须按这一层算 |
⚠️ v1 假设"15% 需中继",对异构网络严重偏低。 保守口径:按 45% 设计中继容量,按 55% 留余量。(乐观 30% / 基准 40–45% / 悲观 55%)
2.2 三类"特殊网络"的处置要求(缺一样就有整类节点进不来)
| 情况 | 现象 | 处置 |
|---|---|---|
| 封 UDP(企业网/校园网) | 打洞与 UDP 中继全失败 ⇒ 该类节点完全看不见 | 必须提供 443/TCP 兜底通道(TLS 伪装),否则 E 类 15 台直接出局 |
| 全隧道 VPN | 反复尝试打洞、每次失败、白白抖动 | 检测到即直接降级中继,不要重试 |
| 移动网 | 切基站换 IP,直连秒断 | 保活更密(≤20 s)+ 重打洞要快,且中继常驻为该类兜底 |
3. 中继容量:按最坏情况排(v1 的数字作废)
| 项 | v1(同构假设) | v2(异构) |
|---|---|---|
| 需中继的台数 | 15 | 40–55(按 45 设计 / 55 留余量) |
| 稳态占用(按 0.5 Mbps/台) | 7.5 Mbps | 20–27 Mbps |
| 跨机首屏突发(≈10.8 MB/台) | 165 MB | 同口径:3 台同时冷加载 ≈ 32 MB;10 台 ≈ 108 MB |
由此得出 v2 的第一条新设计点:
🔑 让 L1 层(有公网 IP 的 10 台)自动升格为中继候选池。 异构网络里本来就躺着现成的公网出口 —— 不利用它,就等于用一台小服务器去扛 40+ 台的流量。同构假设下想不到这一条。
⚠️ 但有一条硬边界(与平台既有分层判据一致):
- 会合点 / 中继:可以多实例(谁有公网 IP 谁就能当);
- 权威状态(归属 / 租约):必须单点 Manager —— 客户端节点永远不得持有权威状态,否则就是脑裂。
4. 拓扑:仍然不能建全互联(这条 v1 正确,保留)
全互联 = 100×99/2 = 4,950 条;星型 = 100 条 ⇒ 差 49.5 倍。 ⇒ 星型 / 分组星型 + 按需建连 + 懒保活。跨机通信由中心或直连路径承担,不靠"每对都常连"。
5. 分场景推演
| # | 场景 | 判读 |
|---|---|---|
| S1 | 逐台加入(1→10→50→100) | 心跳 0.1→0.5→2.5→5 req/s;控制面无压力 |
| S2 | 稳态一小时 | 控制面 5 req/s;中继常驻 20–27 Mbps(45 台口径) |
| S3 | 家宽笔记本换网(家→公司) | 秒级重打洞;失败切中继。保活 ≤25 s 才不会表现为"随机断网" |
| S4 | 跨机访问对方实例 UI(真实需求,非假设) | 首屏 ≈10.8 MB(实测值):直连(30 台上行 20–50 Mbps)≈ 2–4.5 s ✅;走中继(100 Mbps)≈ 1 s/台但并发即叠加 ⇒ 必须直连优先 |
| S5 | 移动网节点切基站 | IP 变 ⇒ 直连断 ⇒ 回中继;该类节点在中继上是常态而非例外 |
| S6 | 企业网节点(封 UDP) | 打洞全败 ⇒ 必须走 443/TCP 兜底;否则整类不可用 |
| S7 | 中继 A 挂掉 | 受影响的是 L3 那 45 台 → 必须秒级切 B;控制面与中继分开部署(合并 = 挂了全员失联) |
| S8 | 控制面重启 / 早高峰 100 台同上线 | 瞬时 100 并发 ⇒ 指数退避 + 抖动 + 令牌桶 |
| S9 | 异常节点 | 现状是共享密钥(无法吊销单台)⇒ 一机一钥是硬前置 |
S4 的定性变了:v1 把它当"要规避的危险场景",v2 认定它是核心用例 ⇒ 结论从"大流量绝不能过网"修正为:
大流量优先直连、中继兜底,且中继容量按几十台常驻来配;同时把 10.8 MB 首屏做就近/本地缓存(同版本复用 + 已有 ETag/304),把跨机冷加载从常态降为例外。
6. 瓶颈排序(v2,按先炸顺序)
| 序 | 瓶颈 | 触发条件 | 量级 |
|---|---|---|---|
| 1 | 中继带宽 | L3 占 45%(v1 只算 15%) | 稳态 20–27 Mbps + 突发叠加 |
| 2 | 443/TCP 兜底通道缺失 | 企业网/校园网封 UDP | 整类节点(E: 15 台)完全进不来 |
| 3 | 控制面机内存 | 若沿用 SSH 隧道(每连接一进程) | 100 × 3–5 MB = 300–500 MB |
| 4 | 控制面单点 | 重启/升级 | 100 并发重连风暴 |
| 5 | 共享密钥 | 无法吊销、可整片放行 | 一机一钥是硬前置 |
| 6 | VPN / 代理类节点 | 反复打洞失败 | 白抖动,需检测即降级 |
| 7 | 版本碎片 | 客户端 × 平台 | 排障成本随台数线性涨 |
7. 要扩到 100 台必须先做的(v2 修订)
P0(不做就走不通)
- 中继容量按 45%–55% 的 L3 占比设计,且让有公网 IP 的节点自动成为中继候选(不能只有一台中心)—— 具体设计见
覆盖网络_骨干层方案_20260916.md(多中心骨干 + 选择性加入 + 资格由控制面签发)。 - 443/TCP 兜底通道(治封 UDP 的企业网/校园网)——否则整类节点进不来。
- 一机一钥 + 可吊销 + 限流(替换共享密钥)。
- 把 SSH 反向隧道换成单进程多对端方案(内存差 1–2 个数量级)。
P1(不做会出事)
- 中继 ≥2 台、就近选择、与控制面分开部署、秒级切换。
- 跨机大流量直连优先 + 10.8 MB 首屏就近/本地缓存。
- 保活 ≤25 s;VPN / 代理类节点检测即降级中继(不重试)。
- 重连指数退避 + 抖动 + 控制面令牌桶。
P2
- 节点自报网络画像(路径类型 直连/中继、NAT 类型、是否在 VPN、上行带宽)——没有它,容量规划与排障只能靠猜。
- 版本兼容矩阵(客户端 × 平台)。
8. 结论(v2,三句)
- 单机自用与互联是两件事:租户维度只有一个人,不影响网络维度有 100 台设备要互通 —— 覆盖网络正是为"同一个人/团队的多台设备散落在各种网络里"而存在的。v1 把这两维混为一谈,是本次推演最根本的错误。
- 异构网络最直接的后果是"中继占比远高于同构假设"(不是 15%,基准 40–45%、最坏 55%)⇒ 中继容量必须按最坏情况预留,并且要先把网络里现成的公网节点用起来当会合/中继。
- 拓扑不用换(仍是星型/分组星型),要换的是三件:传输(SSH → 多对端隧道)、身份(共享密钥 → 一机一钥)、兜底通道(补 443/TCP) —— 第三件在 v1 里完全没出现,是异构网络画像逼出来的。
9. 本推演的未验证项(勿当结论)
| # | 项 | 状态 |
|---|---|---|
| 1 | 各网络类型的实际占比 | ⚠️ 推演设定(§2 表),需按真实设备池校准 |
| 2 | 打洞成功率(分层:家宽 / CGNAT / 移动网 / 企业网) | ⚠️ 未实测 |
| 3 | VPN 全隧道是否真的破坏打洞 | ⚠️ 未实测(推演按"会破坏"保守处理) |
| 4 | 企业网封 UDP 的比例 | ⚠️ 未实测 |
| 5 | 中继出口带宽与链路质量 | ⚠️ 未实测(仅有跨云 22 KB/s 作为下界参考) |
| 6 | 控制面机规格(1.8 GB / 2 核) | ⚠️ 来自 2026-09-08 旧决策记录,需复核 |
| 7 | 单条 SSH 隧道常驻内存 3–5 MB | 📋 量级估计 |