2026-08-27 · 协议科普 · 约 10 分钟

ss://、vmess://、vless://、trojan:// 分享链接格式解析:单节点链接与订阅链接的区别

拆解四种分享链接的字段结构与编码方式,说明单节点链接和订阅地址在导入方式与更新机制上的不同,示例全部使用假值。

本文速览

单节点分享链接保存连接参数,订阅地址指向可重新获取的节点集合。本文适合已经拥有服务商与订阅、需要核对导入格式的用户:先辨认链接类型,再检查编码、地址、端口与 TLS 字段,最后区分导入成功、连接成功与规则生效。所有域名、密码、UUID 与 token 均为演示假值,不能用于实际连接。

[URI] 先区分参数链接与订阅入口

Shadowrocket(小火箭)中的单节点条目与订阅分组不是同一种数据。以 ss://、vmess://、vless:// 或 trojan:// 开头的分享链接,通常携带一个节点的连接参数;以 https:// 开头的订阅地址,则需要客户端请求服务器,读取返回内容后生成节点列表。不能仅凭链接长短判断它是哪一种。

4 种
本文解析的 URI scheme:ss / vmess / vless / trojan
8388
本文 Shadowsocks 示例端口,不是固定要求
443
本文 TLS 示例端口,实际值由已有服务参数决定

分享链接是一份参数快照。导入后,远端更换地址或密码,不会自动修改这份独立条目。订阅地址则保留了一个获取入口,执行更新时可以取回当前列表;但它也不是持续推送,列表是否变化取决于返回内容与更新是否成功。

[Encoding] Base64、百分号编码与分隔符

Base64 是编码,不是加密。拿到分享链接的人通常可以还原其中的密码或 UUID;订阅 URL 中的 token 也应当作为凭据保管。不要把完整链接、二维码或解码结果交给陌生网站处理,排查时只记录字段是否存在,并遮盖敏感内容。

符号或编码常见用途核对方法
://分隔 scheme 与其后内容保留半角符号,不插入空格或换行。
@分隔凭据与主机部分密码里的字面量 @ 通常需写成 %40。
? 与 &引入并分隔查询参数复制原始链接,避免把网页源码里的 & 当作参数分隔符。
#引入 fragment,常用于备注备注中的空格可编码为 %20,不参与服务器认证。
Base64包裹凭据、JSON 或订阅正文区分标准与 URL-safe 字母表,不对整条 URI 盲目解码。

标准 Base64 可能包含 +、/ 和结尾的 =;URL-safe 形式可能使用 - 与 _,部分实现还会省去末尾填充。百分号编码处理的是另一层语法,例如 %2F 表示斜杠。两种编码不能互相替代,也不能把所有 + 都替换成空格。

[Check]

先按对应格式定位编码区域,再解码一次。把 %2F 二次编码成 %252F,或把整条链接中的分隔符都编码,都会改变解析结果。

[Shadowsocks] ss:// 的凭据与服务器字段

常见的 SIP002 形式把加密方法与密码编码在 userinfo 中,服务器地址和端口保持可读。以下例子中的 Base64 内容是 aes-128-gcm:test,其中 test 只是演示密码。端口 8388 是示例值,不代表 Shadowsocks 必须使用这个端口。

ss://[email protected]:8388#Demo%20SS
  1. scheme:ss 指定 Shadowsocks,不应在导入后改成其他协议。
  2. userinfo:解码得到加密方法 aes-128-gcm 与密码 test,两者由冒号分隔。
  3. 主机与端口:example.com:8388 表示连接目标;实际使用时必须与用户已有参数一致。
  4. 备注:Demo%20SS 解码为 Demo SS,只用于辨认条目。

旧式分享格式还可能把包含主机与端口的整段内容一起做 Base64,因此不能要求每条 ss:// 链接都出现可读的 @example.com。带有 plugin 参数的链接还需要核对插件及其选项;识别出 Shadowsocks 并不等于附加传输参数一定完整。遇到 IPv6 字面地址时,主机部分通常使用方括号包围地址,避免与端口分隔冒号混淆。

[VMess] vmess:// 中常见的 Base64 JSON

常见的 vmess:// 分享方式,是在 scheme 后放置经过 Base64 编码的 JSON。下面展示的是解码后的示例,不是可以直接粘贴导入的完整 URI。字段值刻意使用假域名与演示 UUID,重点是辨认字段职责。

{
  "v": "2",
  "ps": "Demo VMess",
  "add": "example.com",
  "port": "443",
  "id": "00000000-0000-4000-8000-000000000001",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.com",
  "path": "/demo",
  "tls": "tls",
  "sni": "example.com"
}

JSON 的 v 是分享格式字段,不是 Shadowrocket 的应用版本;ps 是备注,不是密码。不同导出实现可能采用不同字段集合,不能把这一份示例当作所有 VMess 链接的唯一结构。若导入后协议正确但路径丢失,应回到节点编辑页核对传输参数,而不是只检查 UUID。

[VLESS / Trojan] 可读 URI 中的认证与 TLS

VLESS 与 Trojan 的常见分享格式都采用可读的 URI 结构,但 @ 前面的凭据含义不同:VLESS 通常是 UUID,Trojan 通常是密码。VLESS 本身不提供与 TLS 等价的传输加密;本例通过 security=tls 描述 TLS,不能仅凭协议名推断连接安全设置。

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fdemo&sni=example.com#Demo%20VLESS

trojan://demo%[email protected]:443?security=tls&type=tcp&sni=example.com#Demo%20Trojan

分两层核对:认证字段与传输字段

认证与连接目标
  • VLESS 的 UUID:本例为演示用的完整 UUID。
  • Trojan 密码:demo%40pass 解码为 demo@pass。
  • 两例均连接 example.com:443,端口不是固定值。
TLS 与承载方式
  • sni 对应 TLS 握手的服务器名称。
  • type=ws 的示例还需要核对 Host 与 /demo 路径。
  • type=tcp 不应照搬 WebSocket 路径设置。

连接地址、TLS SNI 与 WebSocket Host 可以承担不同职责;是否相同必须依据已有参数,不能看到域名就全部替换。

VLESS 示例中的 encryption=none 不表示本例关闭了 TLS;它与 security=tls 属于不同层次。Trojan 示例中的密码包含特殊字符,所以对 @ 做了百分号编码。不要为了让链接“看起来正常”而删除编码,也不要通过关闭证书校验来掩盖 SNI 或证书名称不匹配的问题。

查询参数的命名与扩展支持可能随分享实现不同而变化。若已有链接包含额外字段,应保留原值,并在导入后逐项核对 Shadowrocket 节点编辑页中的对应设置;仅仅看见条目名称,不能证明全部参数都被接受。

[Subscribe] 单节点导入与订阅更新分别处理

以下订阅地址仅展示 URL 结构,不是可用服务入口。这里的 token=xxxx 是明显假值,实际地址里的 token 不应公开。一个普通网页 URL 也可能以 HTTPS 开头,只有返回内容符合订阅解析要求时,才能用于生成节点列表。

https://example.com/sub?token=xxxx
  1. 已有单节点链接:完整复制一条 URI,通过应用提供的链接导入入口处理;导入后到 Home 打开该节点的编辑页,核对类型、地址、端口和传输参数。
  2. 已有订阅地址:进入 Home → Add Server,选择 Subscribe,填写已有订阅 URL 并保存,再检查订阅分组及其节点列表。
  3. 已有服务参数变化:对订阅分组执行更新;对独立导入的条目,重新导入新链接或按新参数手动修改。
  4. 更新前有本地修改:先保存需要保留的参数。订阅更新可能重新生成服务端管理的节点,不要把本地改名或字段修改当作永久覆盖。

订阅返回内容可能是一组分享链接,也可能是对整组文本进行 Base64 编码后的内容。订阅响应编码与单节点内部编码是两层独立处理:外层解码后,里面的 vmess:// 仍可能携带自己的 Base64 JSON。不要把订阅正文当作一个密码字段,也不要把已经解码的一组链接再次拼成一条 URI。

结论:远端参数变更时,先确认条目来源

属于 Subscribe 分组就先更新并核对返回列表;属于独立节点就使用新的分享链接。反复切换连接开关不会重新获取一个独立 URI 的最新参数。

[Routing] 导入成功之后,再确认连接与规则

链接导入解决的是“保存了哪些连接参数”,不负责决定所有请求如何路由。Home 用于查看节点与连接状态,Config 用于管理配置,Settings 用于应用设置。排查时先检查 Home 中选中的节点,再核对 Global Routing;不要因为条目出现在列表里,就断定请求一定通过了它。

Global Routing → Config

推荐

对需要按现有规则使用的连接,选择 Config,并检查当前生效配置。规则通常按顺序匹配,最终去向取决于命中的策略。

适合:已有配置,需要验证日常规则分流

Global Routing → Proxy

用于临时检查代理路径,避免把 Config 中的直连命中误认为节点不可用。测试完成后,恢复原来的使用模式。

适合:隔离规则影响,核对选中节点的连接情况

Global Routing → Direct

采用直连路径,不能用它证明刚导入的代理节点可用。直连网页能打开与该节点认证成功是两件事。

适合:对照本地网络的直接访问情况

Global Routing 中的 Scene 应结合已配置场景核对,不能直接等同于 Proxy 或 Config。下面是用于理解顺序的 [Rule] 片段,不是完整配置,也不应直接覆盖现有文件。域名与 IP 网段均为演示内容。

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

Settings → On Demand 管理按条件触发连接的行为,不会替代节点认证,也不会修复错误的 URI。若当前目标只是验证导入结果,先明确连接是否已建立、选中节点是否正确,再检查自动触发条件,避免同时改变多个变量。

[Troubleshooting] 分享链接解析与更新常见问题

复制了链接,为什么没有导入出节点?

先看开头是否为完整 scheme,再检查复制内容是否带有说明文字、引号、空格或聊天软件插入的换行。只复制一条完整 URI;若来源给的是 HTTPS 订阅地址,应通过 Subscribe 处理,而不是当作单节点密码粘贴。

节点已经出现,为什么还是连不上?

到 Home 核对选中节点的地址、端口与认证值,再检查 TLS SNI、WebSocket Host 和路径。随后确认 Global Routing;Direct 模式下的访问结果不能验证代理节点。若参数与已有服务资料一致,继续检查服务端状态,而不是随机改协议类型。

订阅更新后为空,原来的链接还能用吗?

先保留原始订阅地址,核对 token 与查询参数是否完整,再确认返回的是节点内容而不是登录页面、错误页面或空响应。旧节点是否仍可连接取决于服务器是否继续接受旧参数,不能从列表为空直接推断。

把订阅里的一个节点分享出去,对方也会自动更新吗?

通常不会。分享单个节点得到的是当前参数快照,不包含原订阅的更新关系。只有保存并更新对应的订阅入口,才有机会获取远端列表变化;分享前还应确认有权披露其中的认证信息。

改了链接里 # 后面的名字,会影响连接吗?

在本文展示的 URI 形式中,fragment 用于备注,修改名称不会替换服务器地址、密码或 UUID。若修改后无法导入,检查是否误删了前面的参数,或把备注中的特殊字符写成了未编码的分隔符。

最后按“链接类型 → 编码完整性 → 认证字段 → 传输与 TLS → 当前路由模式”的顺序检查。每次只改一项,并记录原值。这样可以区分解析失败、服务器拒绝、TLS 校验失败与规则未走代理,避免用反复重新导入掩盖真正的问题。

App Store 正版核对