很多用户说「这个客户端不支持某协议」,实际可能有三种情况:UI 没有入口,core 版本太旧,或者配置字段没有正确传进去。理解 core 和 UI 的区别,可以少走很多弯路。
四个部件
| 部件 | 负责什么 | 常见例子 |
|---|---|---|
| UI | 导入、展示、切换、日志、系统设置 | Clash Verge Rev、Mihomo Party、v2rayN |
| core | 连接、协议、DNS、路由、规则执行 | Mihomo、sing-box、Xray-core |
| 配置文件 | 告诉 core 怎么运行 | YAML、JSON、订阅导出 |
| 规则集 | 给分流判断提供数据 | rule-provider、geosite、geoip |
一个桌面客户端通常把这些包装在一起,所以看起来像一个软件。但出了问题时,必须拆开看。
UI 不等于 core
UI 负责让人操作。它会保存订阅、显示节点列表、提供开关、调用系统代理接口,还可能帮你下载或切换内核。UI 做得好,能减少配置成本;UI 做得差,也可能把本来正确的字段写错。
core 负责真正的网络行为。DNS 怎么查、规则怎么命中、协议怎么握手、TUN 怎么建路由,最终都由 core 执行。UI 显示「已连接」不代表 core 的每条连接都成功;core 日志里有 error,也不一定是 UI 问题。
同名协议也要看 core
比如一个配置写了 Reality、Hysteria2、TUIC 或某个新字段。A 客户端能用,B 客户端不能用,原因可能是:
- B 的 core 版本更旧。
- B 使用的 core 不是同一个项目。
- UI 导入时丢了字段。
- 配置格式针对另一个 core。
- 规则集路径或缓存目录不同。
所以不要只说「订阅坏了」,导出最终配置,看它被 UI 转成了什么样。
配置是 UI 和 core 的合同
配置文件是两者之间的合同。UI 可以生成配置,core 按配置执行。合同写错,双方都可能看起来正常,但实际不能工作。
典型例子:
proxy-groups:
- name: Auto
type: url-test
use:
- provider-a
proxy-providers:
provider-a:
type: http
url: https://example.com/provider.yaml
这里 UI 只负责把文件交给 core。core 会检查 provider-a 是否能拉取、是否能解析、组引用是否存在。provider 返回错误页时,UI 可能只显示「更新失败」,真正原因要看 core 日志。
规则集不是节点
规则集决定流量如何分类,不提供节点本身。新手常把 rule-provider、proxy-provider、订阅节点混在一起:
- proxy-provider:提供节点列表。
- rule-provider:提供规则列表。
- proxy-group:决定节点如何被选择。
- rules:决定一个连接走哪个组。
节点可用但规则错,表现为分流不对;规则正常但 provider 空,表现为组里没有节点。这是两类问题。
选择客户端时看什么
如果你正在选客户端,不要只看截图。更实用的是看这些:
- 使用哪个 core,更新是否及时。
- 能否查看和导出最终配置。
- 日志是否能筛选 debug、info、warn、error。
- 是否支持你的系统平台。
- 是否把系统代理、TUN、DNS 设置讲清楚。
- 配置目录和缓存目录是否容易找到。
对经常排障的人来说,能看到最终配置和 core 日志,比界面漂亮更重要。
排障时怎么描述问题
建议按这个格式说明:
UI:Clash Verge Rev x.y.z
core:Mihomo x.y.z
系统:macOS / Windows / Linux
配置来源:远程订阅 / 本地 YAML / 手写 JSON
故障动作:更新订阅 / 切换策略 / 打开 TUN / 访问某域名
日志级别:info 或 debug
关键日志:已脱敏的 20-60 行
这样别人能快速判断问题属于 UI、core、配置还是规则集。