1. HTTP 响应头元数据:Subscription-Userinfo 规范
打开客户端,配置卡片下方清晰展示着「剩余 480 GB,还有 120 天到期」。这些信息并非玄学,而是遵循 RFC 标准的 HTTP 扩展响应头:
```http
HTTP/1.1 200 OK
Content-Type: text/yaml; charset=utf-8
Content-Disposition: attachment; filename="ClashConfig.yaml"
Subscription-Userinfo: upload=1073741824; download=21474836480; total=1073741824000; expire=1788739200
```
### 字段物理含义字典:
- **`upload`**:本计费周期内已上传的字节数(单位:Byte);
- **`download`**:本计费周期内已下载的字节数(单位:Byte);
- **`total`**:套餐包含的总可用流量字节数(1073741824000 Byte = 1000 GB);
- **`expire`**:套餐到期截止的 Unix 时间戳(秒),转换为北京时间即可精确显示具体到期年月日。
💡 若响应头中缺失 Subscription-Userinfo,客户端卡片将不显示流量使用百分比进度条。
2. 两种主流响应正文格式对比:Base64 文本 vs 完整 YAML
根据机场后端架构与传入的 User-Agent 不同,服务端通常返回两种截然不同的数据流:
### 1. 通用 Base64 编码流(单节点字符串)
- **特征**:文本呈现为一长串无意义的字母与数字(如 `dm1lc3M6Ly9leGFtcGxl...==`);
- **解密本质**:使用 Base64 解码后,展现为由换行符分隔的原始节点分享链接:
`ss://YWVzLTI1Ni1nY206cGFzc0AxLjEuMS4xOjgzODg=#香港01`
`vless://uuid@server:443?encryption=none&security=reality...#日本02`
- **适用性**:Shadowrocket(小火箭)、V2RayN 可直接读取。但原版 Clash 无法直接识别纯 Base64,必须依赖本地或远程订阅转换。
### 2. Clash 专属 YAML 结构流
- **特征**:直接返回经过精心编排的合法 YAML 文件;
- **核心模块**:包含完整的 `port`、`dns`、`proxies`、`proxy-groups` 和 `rules`。Clash Verge 可以直接将该文件交付给内核运行,无需额外二次加工。
bash
# Linux/macOS 终端一行命令解码 Base64 订阅并查看前 5 个原始节点
curl -s "https://your-sub-link.com" | base64 -d | head -n 5 3. 节点凭据安全性与传输防劫持
由于订阅内容包含了连接海外机房的全部 IP、端口与密码凭证:
- **严禁使用 HTTP 明文协议传输订阅**:所有生产级机场必须全站强制 HTTPS(TLS 1.3),防止沿途路由器嗅探提取节点密码;
- **防止 CDN 脏缓存**:机场服务端通常在响应头设置 `Cache-Control: no-cache, no-store`,强制客户端每次更新都向源站索取最新数据。
❓ 常见疑问与排查步骤
为什么用浏览器直接打开订阅链接看到的是一堆乱码?
因为浏览器默认未携带 Clash 专属的 User-Agent,机场后端判定为通用客户端,返回了 Base64 密文。使用 Base64 在线解码工具解码后即可看到节点明文。
订阅中的 expire 为 0 代表什么?
代表该订阅为「不限时长(永久不过期)」流量包,或者机场管理员未在后台设置具体的到期时间。
订阅文件里的密码会随时间变化吗?
只要服务商没有执行大规模的密码重置,通常密码保持不变。但节点的入口 IP 和端口可能会因应对网络审查而动态轮换。