Skip to content

Clash 订阅格式详解:YAML 订阅结构、节点字段与 Header 流量解析 ​

直接答案:Clash 的“订阅”本质上是一个遵循标准 HTTP 传输协议与 YAML 数据序列化规范的远程配置接口。主流机场下发的订阅主要分为两种形态:包含完整端口、DNS、策略组与分流规则的**“整站配置订阅(Full Profile)”,以及仅包含 proxies: 节点列表供外部解耦引用的“节点集订阅(Provider Payload)”**。此外,客户端通过解析 HTTP 响应标头中的 Subscription-Userinfo 字段,可实时读取用户的已用流量、剩余总额与到期时间戳。


一、整站配置订阅 vs 节点集订阅实测对比 (一手实测数据) ​

在客户端拉取订阅时,返回的 YAML 结构直接决定了它的加载模式与生命周期:

评估维度整站配置订阅 (Full Profile)节点集订阅 (Proxy Provider 格式)
顶级数据结构包含 port, dns, proxies, proxy-groups, rules仅包含顶级键 proxies: [...] 数组
客户端导入方式作为独立的“配置配置(Profile)”直接激活在主配置中的 proxy-providers 字典内被 use 引用
自定义规则兼容性差 (每次更新订阅会直接覆盖掉用户自己手写的分流规则)极佳 (更新节点完全不干扰用户自定义的分流规则与策略组)
响应体积较大 (50KB ~ 300KB,包含数千行规则)极小 (10KB ~ 50KB,仅纯节点元数据)
推荐适用人群新手小白、开箱即用用户进阶玩家、多机场聚合、高可用路由架构

二、HTTP 响应头 Subscription-Userinfo 深度解析 ​

当 Clash 客户端向订阅 URL 发起 GET 请求时,合规的服务端会在 HTTP Response Header 中返回关键的用户配额元数据:

http
HTTP/1.1 200 OK
Content-Type: application/yaml; charset=utf-8
Content-Disposition: attachment; filename="clash_config.yaml"
Subscription-Userinfo: upload=1288490188; download=34359738368; total=214748364800; expire=1780444800
profile-update-interval: 24

1. 流量字段含义与单位换算 ​

标头中的数值全部以**字节(Bytes)**为最小基本单位:

  • upload:当前计费周期内已产生的上传流量(Bytes)。 1,288,490,188 B / (1024^3) ≈ 1.20 GB
  • download:当前计费周期内已产生的下载流量(Bytes)。 34,359,738,368 B / (1024^3) ≈ 32.00 GB
  • total:该订阅计划的总流量配额(Bytes)。 214,748,364,800 B / (1024^3) = 200.00 GB
  • expire:套餐到期日的 Unix 秒级时间戳(Timestamp)。 例如 1780444800 对应北京时间 2026-06-03 00:00:00。

客户端正是通过捕获该 Header,并在 UI 界面顶部动态渲染出“已用 33.2GB / 总计 200GB (剩余 83.4%),2026-06-03 到期”的进度条与指示卡片。


三、原生 YAML 订阅单节点数据结构规范 ​

无论是哪种订阅形态,proxies: 数组内部的单个节点必须遵循严格的数据结构规范。以下展示主流协议的标准字段定义:

1. 现代 VLESS + Reality 节点字段示例 ​

yaml
proxies:
  - name: "🇭🇰 香港 IEPL 01 - Reality"
    type: vless
    server: hk01.example.com
    port: 443
    uuid: 8f24b22c-a6a9-4673-95cf-010488fbe6c1
    udp: true
    tls: true
    servername: gateway.icloud.com
    flow: xtls-rprx-vision
    reality-opts:
      public-key: b_3zD-j10P9_Kk12Lm45No67Pq89Rs01Tu23Vw45Xy6
      short-id: 0123456789abcdef
    client-fingerprint: chrome

2. 传统 Shadowsocks 节点字段示例 ​

yaml
proxies:
  - name: "🇯🇵 日本 BGP 01 - SS"
    type: ss
    server: jp01.example.com
    port: 8388
    cipher: 2022-blake3-aes-128-gcm
    password: "SecretPassword123"
    udp: true

3. Hysteria 2 高速 UDP 节点字段示例 ​

yaml
proxies:
  - name: "🇺🇸 美国 4K 01 - Hy2"
    type: hysteria2
    server: us01.example.com
    port: 443
    password: "MyHy2Password"
    sni: mydomain.org
    skip-cert-verify: false
    up: "50 Mbps"
    down: "500 Mbps"

四、订阅更新失败常见 HTTP 状态码与排障实录 ​

在拉取或刷新订阅时,若客户端日志报红,对照以下状态码可快速定界故障根因:

1. HTTP 401 Unauthorized ​

  • 根因:订阅 Token 失效或被重置。通常是因为在机场后台重置了订阅密钥,而客户端仍在使用旧的 URL。
  • 解决:在机场用户中心重新复制最新的订阅链接并粘贴至客户端。

2. HTTP 403 Forbidden ​

  • 根因:
    1. 订阅套餐已过期或流量耗尽,被服务端鉴权系统切断;
    2. 客户端请求头未携带合规的 User-Agent,触发了机场反爬虫 WAF 防护。
  • 解决:检查套餐是否欠费;或在订阅设置中添加标准 UA(如 ClashforWindows/0.20.39)。

3. yaml: unmarshal errors (语法解析崩溃) ​

  • 根因:URL 返回的根本不是 YAML 格式,而是被国内运营商拦截返回的运营商劫持 HTML 页面,或者返回了 Base64 纯文本却没有经过转换。
  • 解决:在浏览器直接打开订阅链接,检查下载下来的文件是否以纯文本 HTML 标签开头;若是 Base64 编码字符串,则需经过订阅转换后方可喂给原生 Clash。

五、常见问题解答 (FAQ) ​

Q1: 为什么我的订阅链接在浏览器打开是一长串没有换行的乱码? ​

A: 这是传统的 Base64 编码订阅(常见于早期 Shadowrocket 或 V2Ray 客户端)。Clash 无法直接解析未解密的 Base64 密文,必须通过服务端的 &flag=clash 参数请求原生 YAML,或者借助订阅转换工具将其反序列化为合规的 Clash YAML 配置。

Q2: 机场下发的订阅节点名字里包含 Emoji 表情,会导致配置报错吗? ​

A: 只要文件编码为标准的 UTF-8,包含 Emoji 旗帜(如 🇭🇰, 🇯🇵)在现代 Clash 内核中完全合法且能正常解析。但若文本保存时被错误编码为 GBK 或 ANSI,就会导致 Unicode 截断并引发 YAML 语法解析失败。


六、延伸阅读与相关资源 ​