01
选路是一条决策链,不是一个分数
很多人以为客户端在给节点打分,然后选最高分。实际做法是三层过滤:先删掉不可用的,再在可用的里比稳定性,最后才比速度。

第一层:可达性
端口探测决定「能不能连」。UDP 403 次全失败即判定为不可用,不进入后续比较;这一层过滤掉的节点占全部候选的 11%。
第二层:稳定性
丢包、抖动与时延共同决定「稳不稳」。这一层不看绝对延迟高低,而看与历史基线的偏差,避免被一次偶然快的结果带偏。
- 第三层才比较速度,且只在延迟差超过 15% 时才允许改变结论。
- 三层过滤的顺序不能调换:先比速度会选出「快但连不上」的节点,这正是手动选节点最常见的翻车方式。
- 过滤结果会写入诊断日志,包含每层被淘汰的节点数与原因。
02
三类探测信号:延迟、丢包、端口
探测本身要便宜,否则会占用用户带宽。三类信号合计每 20 秒消耗不到 2 KB 流量,对吞吐几乎无影响。
| 信号 | 探测方式 | 周期 | 单次成本 | 阈值 |
|---|---|---|---|---|
| 延迟 | 向 8 个采样节点各发 5 个 ICMP 或 UDP 包 | 20 秒 | 约 640 字节 | 优于当前 15% |
| 丢包 | 统计最近 30 秒内业务流与探测流的丢包比例 | 滚动窗口 | 0 字节(复用业务流) | 高于 2% |
| 端口 | 对 443 与 UDP 高位端口做三次握手探测 | 60 秒 | 约 180 字节 | 三次全失败 |

丢包信号不额外发包,而是复用业务流的统计。这一点很重要:如果为了测丢包而额外发包,在低带宽链路上反而会加重拥塞,测出来的丢包是自己造成的。
03
延迟优先:比什么、和谁比
延迟优先的实质是「相对优势」而不是「绝对最小」。客户端保存过去 24 小时的每小时基线,用它判断当前线路是否变差。
比较对象是基线
每个节点每小时生成一个中位延迟基线,当前读数与基线比较。基线在 24 小时后过期,避免用昨天的好成绩判断今天。
确认周期是 2 轮
延迟优势必须连续 2 个周期(40 秒)成立才允许切换。这条规则把「地铁进隧道」这类瞬时抖动挡在切换之外。
回退条件独立
切换后若连续 3 次读数落后,立即回退到切换前的节点,不等待确认周期,避免用户在劣化状态里停留过久。
| 场景 | 触发次数占比 | 平均确认时长 | 切换后延迟变化 |
|---|---|---|---|
| 晚高峰跨境拥塞 | 41% | 44 秒 | 下降 22 至 38 ms |
| 本地无线干扰 | 27% | 38 秒 | 下降 9 至 15 ms |
| 运营商路由变更 | 18% | 52 秒 | 下降 31 至 70 ms |
| 节点侧负载升高 | 14% | 41 秒 | 下降 18 至 26 ms |
04
丢包优先:为什么把丢包单独拎出来
丢包与延迟是两种不同的伤害:延迟让人等,丢包让人断。TCP 遇到丢包会减速重传,视频遇到丢包会花屏,会议遇到丢包会卡音。
2% 是临界点
实测在 2% 丢包以下,四种协议的吞吐差异主要由握手与数据面决定。超过 2% 后,Hysteria2 的相对优势开始指数级放大,3% 时是 WireGuard 的 1.8 倍。
确认周期只有 1 轮
丢包档不等待第二个周期,因为 20 秒的等待足以让一次视频会议掉帧 600 帧。代价是可能误判,因此回退条件也设得更宽松(60 秒内降到 0.5% 以下即回退)。
| 切换前协议 | 切换后协议 | 吞吐变化 | 丢包口径 |
|---|---|---|---|
| WireGuard | Hysteria2 | 318 → 588 Mbps | 3% 随机丢包 |
| Trojan | Hysteria2 | 241 → 588 Mbps | 3% 随机丢包 |
| OpenVPN | Hysteria2 | 132 → 588 Mbps | 3% 随机丢包 |
| Hysteria2 | 保持 | 无变化 | 3% 随机丢包 |
05
端口可用性:最后一道硬门槛
端口不可达时,任何优化都没有意义。端口探测只做一件事:确认 443 与 UDP 高位端口能否完成一次完整握手。
| 探测结果 | 含义 | 协议档位 | 典型网络 |
|---|---|---|---|
| 443 与 UDP 均通 | 无限制 | WireGuard 优先 | 家庭宽带、部分企业网 |
| 仅 443 通 | UDP 被封 | Trojan | 办公网、校园网、酒店 |
| 仅 UDP 通 | 443 被策略拦截 | Hysteria2 | 少数运营商定制网络 |
| 两者均不通 | 全端口受限 | OpenVPN TCP 兜底或断开 | 国际漫游、机场 Wi-Fi |
- 探测使用真实握手而非仅做 SYN,因为部分网络对 SYN 放行但对后续握手重置。
- 探测失败不等于永久不可用,客户端每分钟重试一次,恢复后自动回升。
- 端口探测结果与协议选择都会写入诊断日志,便于向网络管理员取证。
- 企业环境可以用配置文件固定端口,跳过探测,适合有明确策略的组织。
06
切换过程:5 秒平滑过渡
切换不是断开再连,而是新旧两条连接并行 5 秒,让已建立的会话有时间迁移。用户通常感觉不到切换,最多看到一次 200 毫秒的停顿。
- 第 0 秒:确认周期满足,客户端建立新连接并完成握手,旧连接保持不动。
- 第 1 至 4 秒:新连接接管新发起的请求,旧连接继续服务已存在的会话。
- 第 5 秒:旧连接关闭,路由表更新为新出口,DNS 缓存刷新一次。
- 第 6 秒起:新连接进入常规探测节奏,写入一条切换记录(原因、耗时、前后读数)。

平滑过渡的代价是切换期间双份带宽占用,实测约 3.4 MB 的额外流量。对按流量计费的移动网络,这个代价在设置里可以关掉,代价是切换时会有一次 1 至 2 秒的断流。
07
切换阈值表:可查、可调、可追溯
阈值集中在高级设置里,共 5 项。改动会写入诊断日志,便于事后复盘「为什么当时切了」。
| 判据 | 默认阈值 | 可调范围 | 确认周期 | 回退条件 |
|---|---|---|---|---|
| 延迟 | 优于当前 15% | 5% 至 40% | 2 个周期 | 连续 3 次落后 |
| 丢包 | 高于 2% | 1% 至 10% | 1 个周期 | 降到 0.5% 以下 60 秒 |
| 抖动 | 95 分位高于 12 ms | 6 至 40 ms | 2 个周期 | 回到 6 ms 以内 |
| 端口 | 三次全失败 | 固定 3 次 | 立即 | UDP 恢复可用 |
| 带宽 | 低于峰值 40% | 20% 至 60% | 3 个周期 | 回到 70% 以上 |
- 阈值总数
- 5 项
- 生效方式
- 下个探测周期
- 日志留存
- 本地 7 天
- 可导出
- CSV / JSON
- 默认值版本
- 4.8.0 / 2026-10-26
- 把延迟阈值调到 5% 会让切换次数从每小时 2 次升到 17 次。不建议在移动网络下调整。
- 把丢包阈值调到 5% 会让视频在 3% 丢包时仍留在 WireGuard,体感明显变差。
- 带宽判据只做提示不做切换,因为测速本身占带宽,频繁测速会拖慢体感。
08
与节点的关系:落地决定出口
节点决定流量从哪个城市的哪个 IP 出去,这影响了目标站点的地理判定与回程路径。选路的第二层会把节点的城市与上联一起计入。
| 区域 | 节点 | 中位延迟 | 上联线路 | 协议支持 |
|---|---|---|---|---|
| 中国香港 | 8 | 19 ms | CN2 GIA / BGP 双路 | WireGuard、Trojan、Hysteria2 |
| 日本东京 | 11 | 34 ms | NTT / IIJ 双上联 | 四协议全支持 |
| 新加坡 | 9 | 46 ms | Singtel / Telin | 四协议全支持 |
| 美国洛杉矶 | 14 | 138 ms | GTT / Cogent | 四协议全支持 |
| 美国圣何塞 | 7 | 146 ms | Cogent / HE | WireGuard、OpenVPN、Trojan |
| 德国法兰克福 | 8 | 176 ms | DE-CIX 直连 | WireGuard、Trojan、Hysteria2 |
| 英国伦敦 | 6 | 188 ms | LINX 对接 | 四协议全支持 |
| 阿联酋迪拜 | 4 | 172 ms | Etisalat | OpenVPN、Trojan |
同一城市通常有 2 至 3 个不同上联的入口。以香港为例,CN2 GIA 与 BGP 两条回程在晚高峰的丢包差异可达 1.3 个百分点。选路会优先选择历史上更稳的那一条,而不是延迟更低的那一条。
09
与线路的关系:跳数与丢包的分工
线路是跨境段实际走的骨干。跳数影响延迟,丢包影响稳定,两者的修复手段完全不同。

跳数决定延迟下限
香港 CN2 GIA 到上海 4 跳,BGP 回程 9 至 11 跳,延迟差 11 至 19 毫秒。这个差值无法靠协议弥补。
丢包决定体验上限
同一线路在晚高峰的丢包从 0.1% 升到 1.4%,WireGuard 吞吐从 928 掉到 640 Mbps。换协议比换线路更快见效,因为线路侧的拥塞无法在客户端解决。
- 线路标签分三类:直连、普通、绕行。绕行线路只在直连不可用时启用。
- 海缆维护期会提前写入线路黑名单,选路自动绕开,无需用户操作。
- 线路健康度每小时汇总一次,异常线路会连续 3 小时降权,直到恢复正常。
10
故障演练:人为断掉一条腿
选路的可靠性不能只靠线上验证。本站每月做一次演练,人为切断一条链路,看切换是否在承诺时间内完成。
- 演练一:切断香港出口的 UDP,预期 30 秒内切到 Trojan,实际中位 24 秒完成。
- 演练二:注入 3% 随机丢包,预期 20 秒内切到 Hysteria2,实际中位 19 秒完成。
- 演练三:让主节点 CPU 打满,预期吞吐降至 40% 时触发提示,实际在 51 秒时触发。
- 演练四:同时切断 UDP 与 443,预期提示用户检查网络,实际在 15 秒内给出明确提示而非静默失败。
演练记录可查
每次演练的输出都归档在公告页,包含注入方式、观察到的切换时间与最终档位。2026 年 1 月至 10 月共完成 10 轮。
失败也算结果
演练中若切换超过 60 秒,会作为缺陷进入下一版修复队列。4.7.x 曾有一次因确认周期叠加导致 78 秒才切换,4.8.0 已修正。
11
已知边界:不做什么
选路能解决链路选择问题,解决不了下面四件事。把它们写清楚,比含糊地承诺「智能加速」更有用。
不能突破物理带宽
家里 100 Mbps 的宽带,任何协议与节点都只能接近 100 Mbps。选路不改变上限,只让上限被更充分地利用。
不能绕过应用层封锁
目标站点对出口 IP 做了策略限制时,换节点才有用;换协议在这一层无效。
不能修复本地故障
路由器过热、无线干扰、网卡驱动问题都不在选路的解决范围内,诊断页会尝试区分但无法修复。
不做静默重试欺骗
连不上就明确提示,不用反复重试制造「能动」的假象。重试 3 次后给出可执行的建议。
- 选路日志只记录协议、端口与三档读数,不记录访问目标与内容。
- 任何阈值调整都会在诊断页顶部显示一行提示,避免用户忘记自己改过。
- 不提供「锁定节点」的隐藏开关来规避自动劣化,也不做后台静默改协议。
13
五个现场问题
这些问题来自 2026 年 9 月至 10 月的工单,答案都指向本页的某一节。
为什么在两个节点之间来回跳
两个节点的历史基线接近,导致延迟差在 15% 阈值附近反复穿越。处理办法是把阈值调到 20%,或直接固定其中一个节点。
为什么手动选的节点更快却更容易断
手动固定绕过了稳定性过滤,选中的节点可能丢包偏高。诊断页第二行能看到该节点最近 30 分钟的丢包曲线。
为什么切换后速度反而慢
新节点可能与当前协议不匹配,例如切到只放行 443 的节点上还留在 WireGuard。日志里会显示 port=udp 状态。
为什么日志里没有切换记录
只在确认周期满足时才写记录,单次抖动不算切换。若想看到每次读数,可以打开详细日志模式。
为什么企业网里的切换更频繁
企业网关常对 UDP 做时断时续的限速,导致端口探测在可用与不可用之间摆动。建议固定 Trojan 并关闭端口探测。
12
诊断与日志:出问题时有据可查
选路的所有判断都留下记录。用户不需要读懂它,但把日志发给支持人员,就能复现当时的判断过程。
- 日志字段
- 时间、协议、端口、RTT、丢包、抖动、档位、原因
- 采样频率
- 每 20 秒一条
- 留存
- 本地 7 天,约 40 MB
- 导出
- CSV / JSON 两种
- 包含访问目标
- 否
| 日志片段 | 含义 | 是否需要处理 |
|---|---|---|
| switch=loss 3.1%→hy2 | 因丢包切到 Hysteria2 | 无需处理,自动恢复 |
| port=udp fail x3 | UDP 三次探测失败 | 如需 UDP 请联系网络管理员 |
| hold=sticky 2/2 | 延迟优势待确认 | 无需处理 |
| mtu=1280 pmtud | 路径 MTU 被下调 | 如频繁出现请检查隧道层 |
| cpu=88% ovpn | OpenVPN 单核接近打满 | 建议切换协议 |

最后提醒一句:日志里的读数永远比感觉可靠。觉得「今天特别慢」时,先导出前两个小时的记录,看是某一档位持续劣化,还是几次短促抖动被体感放大了。这两种情况的处理方式完全不同。