0摘要
有些网络会封锁 VPN 协议;另一些网络则允许连接建立,然后在几十秒后悄悄停止传输流量。在这样的网络上,“能响应 ping”与“能传输流量”并不是一回事。Colitu Adaptive Connect 2.0 是 Colitu 应用针对这一问题所使用的一组机制:兼顾距离与隐私的服务器排序、仅保存在设备上的按网络记忆、由匿名计数器构建的网络提示、基于真实流量的连接时检查、服务器回退、在运行中的连接内保持就绪的热备用,以及覆盖每种传输方式的监视器。在服务器端注入 11 次故障的一小时测试中,98.8 % 的流量探测成功;当正在使用的服务器被切断 101 秒时,VPN 保持开启,用户感受到约 5 秒的停顿。
1问题与故障模型
VPN 应用的首要任务是以正确的连接模式连上正确的服务器。Colitu 服务器提供来自四个协议系列的五种连接模式:Hysteria2 (UDP/QUIC)、VLESS Reality、VLESS XHTTP、Trojan 和 Shadowsocks 2022(参见协议中心)。
传统做法是按 ping 对服务器排序,并选择响应最快的一个。但 ping 只是一个提示:在某些网络上,服务器会响应 ping,却不传输任何流量。更棘手的情况是静默冻结:连接建立了,应用显示“已连接”,过一会儿流量停止,而 TCP 连接看起来仍然是打开的。对用户来说,VPN 是开着的,但互联网没了。
Adaptive Connect 2.0 的目标是:在连接时找到真正可用的路径,在连接期间发现路径出现故障,尽可能在不关闭 VPN 的情况下把用户转移到另一条路径,并且在这一切的过程中不收集有关用户的信息。下面的故障类型基于在某些网络和某些移动运营商处观察到的行为,而不是针对任何特定的国家或地区。
| 故障 | 网络上发生什么 | 用户看到什么 |
|---|---|---|
| 协议封锁 | 某个协议的连接始终无法建立 | 无法连接 |
| 静默冻结 | 连接建立,N 秒后流量停止,TCP 保持打开 | “已连接”,但网页加载不出来 |
| UDP 封锁 | 基于 UDP 的模式 (Hysteria2) 无法工作,TCP 可以 | 在 UDP 模式下无法连接 |
| 服务器故障 | 无论使用哪种协议都无法访问某台服务器 | 该服务器上无法连接 |
| 网络切换 | 在 Wi-Fi 和移动数据之间切换、Wi-Fi 掉线 | 短暂中断;另一个网络上的封锁情况不同 |
由此得出三点假设:“可用”是网络的属性,而不是服务器的属性;网络可能会把同一台服务器的所有 TCP 模式一并冻结,因此同一台服务器上的另一种 TCP 模式作为备用没有用处;设备自身的互联网也可能中断,这种情况下不应归咎于任何模式。
2设计
服务器排序
你选定的位置会原样使用;Colitu 绝不会自行更改手动选择。在自动模式(“最快的服务器”)下,排序如下:
| 排名 | 标准 |
|---|---|
| 1 | 在你当前所用网络上最近一次可用的服务器(记忆 24 小时) |
| 2 | 实测 ping 最低;超过 10 分钟的 ping 或在其他网络上测得的 ping 不计入 |
| 3 | 其他国家/地区的服务器排在你所在国家/地区的服务器之前,较近的国家/地区优先(尚无 ping 时也按此顺序) |
| 4 | 没有响应 ping 的服务器排到最后 |
| 5 | 最近 30 分钟内在该网络上失败过的服务器排在最末 |
服务器列表中的“推荐”始终显示自动模式将要连接的服务器。隐私:为了对列表排序,面板会根据这一次请求的 IP 地址推算出你所在的国家/地区和你的互联网服务商的网络。不会存储任何内容。当请求通过 VPN 发出时,面板无法得知这些信息,应用会保留它最近一次获得的值。
按网络记忆
“网络”是连接类型(Wi-Fi、移动数据、以太网)与你的互联网服务商的网络的组合,因此家里的 Wi-Fi 和移动数据会被分别记忆。这些记忆只保存在设备上:最近可用的服务器(24 小时)、每台服务器上最近可用的模式(24 小时)、没有传输流量的模式(“停滞标记”,6 小时)以及所有模式都失败的服务器(30 分钟)。旧条目会被删除,最多保留 200 条。因此,在移动数据上被封锁的模式,在家里的 Wi-Fi 上仍会被优先尝试。
网络提示,不识别任何人
单个设备的记忆只了解该设备自己的经历。网络提示则共享其他设备在同一网络上看到的情况:
- 已签名的网络令牌。面板向应用提供一个包含国家/地区和网络编号 (ASN) 的令牌,使用 HMAC 签名,有效期 48 小时。应用凭它按协议上报结果;请求的 IP 地址从不用于观测(连接期间它本来就是 VPN 服务器的地址)。
- 匿名的每小时计数器。面板只保存按国家/地区、网络和协议统计的每小时计数器:成功次数、失败次数和不同设备的数量。设备使用每小时的带密钥化名进行计数,化名在该小时结束时删除;计数保留 7 天。
- 阈值。当一个协议在 24 小时内至少有 5 台设备尝试且成功率低于 20 % 时,它被视为在该网络上被封锁;数据太少时,使用国家/地区层面的数据(至少 20 台设备,成功率低于 10 %)。所提供的所有协议不会被同时标记为被封锁。
- 使用。应用会最后尝试被封锁的协议,除非该设备在过去 24 小时内在此网络上成功使用过其中某个协议。
健康检查与验证路径
只有真实流量在流动,才算某种模式可用。检查通过隧道访问常见的连通性测试地址(Cloudflare、Google、Microsoft),绝不访问 Colitu 自己的服务器,每种模式大约需要 4–6 秒。在归咎于某种模式之前,应用会先检查设备本身是否在线。时间预算:每种模式约 8 秒,每台服务器约 20 秒,一次完整连接最多约 45 秒;通常几秒钟就足够了。
验证路径。每次 VPN 内核启动时,一个只能从设备本身访问的私有检查入口(随机端口和凭据)会按第一条规则直接路由到主路径。因此,连接时检查只测量主路径本身:损坏的主路径无法躲在备用路径后面,并且下次连接时会避开它。
服务器回退
在自动模式下,如果某台服务器的所有模式都没有通过检查,应用会转向列表中的下一台服务器,每次连接最多 3 台,并显示“正在尝试其他服务器…”。失败的服务器在该网络上会在 30 分钟内保持在末尾。开启断网保护 (kill switch) 时,Windows 和 Linux 会沿着列表重试,而不是重试同一台服务器。如果你自己选择的服务器上所有模式都失败,错误提示会提供一键“尝试最快的服务器”。
热备用
连接期间,应用会在运行中的连接内保持第二条路径就绪。流量通过一个均衡器:主路径正常时,所有流量都使用主路径;一旦它停止工作,新的流量会自动转移到备用路径。VPN 保持开启,也不会出现“正在重新连接”的界面。由于切换发生在连接内部而不是应用界面中,所以在后台也能工作。更多内容见帮助中心:热备用。
| 情形 | 备用 |
|---|---|
| 自动模式,某种传输方式在此网络上已被证实可用(过去 24 小时内在任一服务器上可用) | 排序中下一台服务器上的同一种传输方式 |
| 自动模式,尚无已证实可用的方式 | 下一台服务器上的另一系列(UDP ↔ TCP) |
| 手动选择服务器 | 同一台服务器,另一系列;跳过已停滞的模式,Shadowsocks 排在最后;你的位置不会改变 |
| 多跳路线或单模式服务器 | 无备用 |
在此网络上失败过的模式和服务器绝不会用作备用。附带备用时,TCP 路径使用 10 秒的 TCP 用户超时 (RFC 5482),使失效的连接被关闭而不是挂起。检测并切换通常平均需要:电脑上约 8 秒,手机上约 10–13 秒(最坏情况约 23 秒)。检查主路径的开销为:手机上每小时约 0.3–2 MB,电脑上每小时 4–7 MB;备用路径本身只在被使用时才会连接。备用路径还会通过其自己的检查入口大约每分钟检查一次;失效的备用路径只会在隧道空闲时被替换,绝不会在通话期间替换。热备用默认开启,可在高级模式中关闭(简易模式与高级模式)。
监视器与感知备用的规则
连接期间会监视每一种传输方式(Adaptive Connect 1.x 只监视 Hysteria2):前 90 秒每 5 秒一次,之后每 30 秒一次。设备在线的情况下连续三次失败,即认为主路径已失效。附带备用时,监视器会单独检查主路径,并另外检查常规路径:
| 主路径 | 常规路径(含备用) | 结果 |
|---|---|---|
| 正常 | 正常 | 不执行任何操作 |
| 失效 | 正常:备用路径承载流量 | 不重新连接;标记该主路径,下次以备用路径的传输方式和服务器为先 |
| 失效 | 失效 | 重新连接 |
手机在意外掉线后(约 2、5 和 15 秒后,之后才显示错误)以及网络恢复时也会自动重新连接,但在你按下断开连接、退出登录,或者套餐或设备被暂停时绝不会重新连接。
不会锁死网络的停滞标记
错误的停滞标记可能会让一个网络无路可试。两条规则可以防止这种情况:如果这些标记会使所提供的传输方式只剩下不超过一种,则在本轮中忽略它们;而在所有方式都失败的一轮中发现的标记,仅持续 10 分钟。6 小时的有效期只适用于另一种传输方式随后在同一网络上承载了流量的情形,也就是问题确实出在该模式上的情形。
并行连接
连接时,最好的两个候选项会同时被检查,最先传输流量的获胜,这遵循 RFC 8305 的 Happy Eyeballs 思想。
服务器负载
每台服务器都会上报有多少人连接到它,这样就不会选中已满的服务器,基于负载的分配使用的也是真实数字。只使用完整的上报;如果上报不完整,则保留之前的值。
3评估
方法
| 项目 | 详情 |
|---|---|
| 设备 | 一部 Android 11 手机 |
| 网络 | 一个启用了深度包检测 (DPI) 的家庭 Wi-Fi 网络 |
| 日期 | 2026 年 10 月 9 日至 10 日 |
| 故障注入 | 在服务器端,仅丢弃该客户端的数据包:在所有服务器上禁用某一种协议,或整台服务器 |
| 安全性 | 规则带有标签,并由自毁定时器移除;不会影响其他用户 |
| 流量探测 | 每 5–10 秒通过隧道发出一个 HTTP 请求 |
设备实验
排序。用户所在国家/地区的一台服务器 ping 最低(13–15 毫秒),但被正确地排在了一台附近的外国服务器(16–17 毫秒)之后。在 Adaptive Connect 1.x 中,列表按数据库顺序给出,一台位于另一个大洲、约 222 毫秒的服务器被显示为“推荐”。
静默冻结。在这个网络上,到一台附近服务器的每一种 TCP 传输方式(VLESS Reality、VLESS XHTTP、Trojan)都在连接后约 30–50 秒冻结,而 Hysteria2 一直正常工作。只覆盖 Hysteria2 的旧监视器仍显示“已连接”,却没有流量。新的全传输方式监视器检测到了冻结,并在约 1.3 秒内切换了传输方式。
| # | 配置 | 结果 |
|---|---|---|
| 1 | 同一台服务器,备用为 Trojan,Hysteria2 被切断 | 备用路径在 +12 秒时承载了流量;随后旧监视器重启了连接并将其中断。通过感知备用的规则修复 |
| 2 | 同一台服务器,修复之后 | 在此网络上,该服务器上没有任何 TCP 路径能存活;封锁结束后约 48 秒恢复,因为封锁期间不存在可用的路径 |
| 3 | 自动模式,备用为下一台服务器上的“另一系列”(Trojan) | Trojan 也被冻结;促成了“已证实传输方式”规则 |
| 4 | 自动模式,已证实的传输方式:服务器 A 上的 Hysteria2,服务器 B 上的备用 Hysteria2,主路径被切断 120 秒 | 在 +5 秒时有一次探测失败,从 +10 秒到结束都有流量,没有重新连接,VPN 保持开启。中断 ≈ 5–10 秒 |
一小时故障注入测试
2026 年 10 月 10 日,一个包含所有 2.0 机制的构建在同一部手机和同一网络上以自动模式运行了 60 分钟。一个内部故障实验室工具以随机顺序在 8 台服务器上注入了 11 次故障,间隔 2–5 分钟,每次 60–120 秒:要么对该客户端在每台服务器上切断一种协议,要么完全切断一台服务器。每 5 秒通过隧道发出一个 HTTP 探测。750 次探测中有 741 次成功(98.8 %)。
| # | 故障 | 时长 | 最长中断 | 故障结束后流量恢复 |
|---|---|---|---|---|
| 1 | 在所有服务器上切断 VLESS Reality | 83 秒 | 1 秒 | |
| 2 | 完全切断德国的一台服务器 | 95 秒 | 3 秒 | |
| 3 | 完全切断正在使用的服务器(主路径) | 101 秒 | 5 秒 | |
| 4 | 在所有服务器上切断 Shadowsocks | 102 秒 | 4 秒 | |
| 5 | 在所有服务器上切断 VLESS Reality | 86 秒 | 4 秒 | |
| 6 | 完全切断芬兰的一台服务器 | 65 秒 | 1 秒 | |
| 7 | 在所有服务器上切断 Shadowsocks | 92 秒 | 2 秒 | |
| 8 | 在所有服务器上切断 Trojan | 65 秒 | 1 秒 | |
| 9 | 完全切断爱沙尼亚的一台服务器 | 120 秒 | 0 秒 | |
| 10 | 完全切断芬兰的另一台服务器 | 95 秒 | 1 秒 | |
| 11 | 在所有服务器上切断 Hysteria2 | 61 秒 | 2 秒 |
- 0 秒 · 正在使用的服务器被切断
- 约 5 秒停顿
- 流量经由热备用
- 101 秒 · 故障解除
VPN 保持开启;无重新连接
解读结果。故障 3 是关键案例:正在使用的服务器消失了 101 秒,用户感受到约 5 秒的停顿,VPN 全程保持开启。针对未在使用的协议和服务器的故障显示为 0 秒,这符合预期:其他位置的故障不会干扰当前会话。在故障 11 中,此网络上的每一种 TCP 协议已被 DPI 冻结,因此在各处切断 Hysteria2 后根本不存在可用的协议;故障结束 2 秒后流量恢复。
4局限性
- 评估范围狭窄。一台设备、一个网络、一小时;故障是在服务器端注入的,而不是由真实的过滤设备造成的。这些结果不能推广到所有网络。Wi-Fi 与移动数据之间的切换,以及在 iOS、Windows 和 Linux 设备上的单独测量,仍有待完成。
- 打开的 TCP 流。切换到备用路径期间,通话在短暂的故障后继续,网页和消息会自行重新连接,但此时正在进行的大文件下载可能会重新开始。
- 出口轮换会强制在一台服务器上使用一种协议,并关闭热备用;在测得的网络上,这意味着反复出现冻结。
- 无备用:多跳路线或单模式服务器上没有备用。
- 过期的网络密钥。VPN 开启期间,面板无法看到请求来自哪个网络;应用会使用它最近获得的网络,直到在关闭 VPN 的情况下再次获取列表。
5未来工作:CSL 会话层
Colitu 会话层 (CSL) 是计划建立在热备用之上的会话层草案;不承诺任何日期或结果。目前,备用路径转移的是新的连接;通过 TCP 进行的未完成下载可能会中断。有了 CSL,应用将打开一个会话,在下层隧道变化时该会话仍能保持。在实验室原型中,最长暂停为 0.08–1.75 秒,下载未中断地继续。一个 CSL 会话绑定到一台服务器,因此 CSL 处理的是服务器内部的问题(网络切换、被封锁的协议、短暂掉线),而服务器宕机仍由热备用负责;两者协同工作。它将作为高级模式中可选的“无缝会话(测试版)”推出。
6结论
路径是否可用由真实流量而不是 ping 决定,而这一答案取决于网络。兼顾距离与隐私的排序、保存在设备上的记忆、匿名的网络提示,以及只测量主路径的检查,用来找到正确的路径;热备用和了解它的监视器则把服务器的丢失变成几秒钟的停顿。
·参考资料
- RFC 8305, Happy Eyeballs Version 2: Better Connectivity Using Concurrency.
- RFC 9000, QUIC: A UDP-Based Multiplexed and Secure Transport.
- RFC 5482, TCP User Timeout Option.
- Hysteria2 项目文档。
- Xray-core 项目文档。
