机场实测室JICHANGTUIJIAN.MOM
搜索线路 / 教程/
协议知识

VLESS和VMess区别:为什么新协议砍掉了加密

一句话结论

VMess 自带一层加密和基于时间的校验,握手复杂、对系统时间敏感;VLESS 把这层加密交给外层 TLS,自身只做轻量的身份识别与转发。结果是 CPU 开销和延迟更低,但必须搭配可靠的传输层,单独裸用并不合适。

VMess 和 VLESS 不是两家人做的两个东西,而是同一套软件先后设计的两代协议。理解它们之间的差别,不需要读协议文档,只需要抓住一个变化:第一代想把安全性全部自己扛下来,第二代决定把这件事交出去。

VMess 诞生时的假设是,外层传输可能什么防护都没有,所以协议自身必须完整:一层内容加密,一套基于时间的身份校验,再加上用来打散特征的 alterId 机制。这套设计在当年是合理的,代价是握手复杂、参数多、对环境敏感。

后来的现实是,几乎所有部署都套了一层 TLS。既然外层已经提供了完整的加密和身份验证,内层再来一遍就是纯粹的重复计算。VLESS 由此把内层加密整个拿掉,只保留「你是谁」和「要连到哪」这两件必要的事——它变成了一层薄薄的路由标识,而不是一个独立的安全体系。

差别落在哪一层

把一次连接拆成三层来看,分歧的位置就很清楚了:

层次VMess 的做法VLESS 的做法
外层传输TCP / WS / gRPC,可选 TLS同样是这些,但 TLS 或 Reality 基本是必选
加密与鉴权协议自带内层加密 + 时间校验不做内容加密,只用 UUID 做身份识别
内层负载加密后的目标地址与数据明文的目标地址与数据(受外层保护)

一句话概括:VMess 是「自带保险箱的快递盒」,VLESS 是「一张写着收件人的标签」。标签本身不防偷看,但它永远被放在一个加密的信封里寄出。

alterId 和时间校验为什么被淘汰

这两个机制解决的是同一个年代的同一类问题,后来都被更好的方案替代了。

  • alterId 的原意是为一个用户额外派生出若干组备用 ID,让每次握手用的标识不完全一样,以此打散可被统计的特征。副作用是服务端要为每个用户维护一大批 ID,用户数一多内存占用明显上升,而带来的抗识别收益在外层套上 TLS 之后已经很有限。新版本把它废弃,统一填 0。
  • 时间校验把当前时间戳纳入握手的验证材料,用来阻止把旧数据包录下来重放的攻击。它的代价是双方系统时间必须接近,偏差超过容忍窗口就直接连不上——这是很多人第一次遇到「昨天还好好的今天全断」的真实原因。TLS 自身已有防重放机制,这一层校验也就没有必要保留。

如果你手上还有写着 alterId: 64 之类数值的老配置,不要直接照搬到新客户端。服务端早已按 0 运行,填错会导致握手对不上,而报错信息通常只显示为普通的连接失败。

去掉内层加密后,谁来兜底

答案是外层,而且必须有外层。VLESS 的安全模型可以写成一个简单的依赖关系:

应用数据
  └── VLESS(身份识别 + 目标地址,不加密)
        └── TLS 或 Reality(加密、证书校验、抗篡改)
              └── TCP / QUIC(网络传输)

这段是分层结构示例,不是配置文件。要点在于:如果把中间那一层拿掉,VLESS 传的目标地址和数据就是明文的。所以「VLESS 不加密」这句话单独拿出来会引起误会——它准确的说法是「VLESS 不重复加密」。

机场下发的节点默认都带外层,风险几乎只出现在一种情况:有人手动改配置,把 tls 关掉去试速度。这种改法确实能少几毫秒,但把整条链路的保护也一起关了。

传输层怎么和协议搭配

VLESS 和 VMess 都能挂在多种传输方式上,组合是自由的。常见几种的取舍如下:

传输方式特点适合的场景
TCP + TLS结构最简单,开销最小网络环境宽松,追求低延迟
WebSocket + TLS可经 CDN 中转,兼容性好需要套 CDN 或走 80/443 的环境
gRPC + TLS多路复用,长连接表现好并发请求多、连接频繁的使用方式
TCP + Reality借用真实站点证书完成握手对主动探测敏感的严格网络

一份典型的 VLESS 节点配置结构示例如下(地址不可用):

{
  "protocol": "vless",
  "address": "node-jp-02.example.invalid",
  "port": 443,
  "id": "示例UUID",
  "encryption": "none",
  "network": "ws",
  "path": "/示例路径",
  "tls": true,
  "sni": "node-jp-02.example.invalid"
}

encryption 字段固定填 none,这不是「关掉加密」的开关,而是 VLESS 协议规定的取值——它表示内层不加密,和外层的 tls: true 并不冲突。很多人在这里误删或误改,导致节点直接不可用。

老客户端连不上新节点,卡在哪一步

这类问题的报错往往含糊,但对应关系其实比较固定:

现象大概率原因处理方向
导入订阅后 VLESS 节点整批不显示客户端版本不认识该协议名升级客户端,别改订阅
节点显示但一连就断,日志提示解析失败客户端不支持 Reality 或新传输参数升级客户端,或临时改用 WS 节点
提示 encryption 参数无效客户端要求该字段而配置里被删掉补回 none
VMess 节点提示时间相关错误系统时间偏差超出容忍窗口打开自动对时,检查时区
手机能连电脑不能连两端客户端版本差距大以版本新的一端为准统一

遇到「整批节点消失」时,先看客户端版本号再看订阅。订阅内容通常是对的,是本地解析不了新字段——这一步搞反会白白折腾很久。各平台的升级方式可以参考 v2rayN 使用教程

同一台服务器上,性能差多少

差距是真实存在的,但量级需要说清楚。VLESS 省掉的是内层的一次加解密和一套握手校验,体现在两个地方:每条新连接建立时少几毫秒,以及服务端在高并发下 CPU 占用更低。对个人用户来说,前者需要精确测量才分得出来,后者受益的其实是机场——同样的机器能扛更多人。

真正会让你察觉到的场景只有一个:短连接极其密集的使用方式,比如打开一个由几十个域名组成的网页,每个域名都要新建连接。这时握手成本被乘上几十倍,差距才浮出水面。日常看视频、下大文件这类长连接场景,两者几乎没有区别。

关于协议在总速度里到底占多大权重,速度归因的完整拆解里有更细的说明;至于把流量整体伪装成 HTTPS 的另一条技术路线,见 Shadowsocks 与 Trojan 的对比

订阅里两种都有,该优先用哪个

按这个顺序判断:

  1. 确认客户端版本。版本够新就直接用 VLESS,握手环节少,可能出错的地方也少。
  2. 确认外层是否带 TLS 或 Reality。带,就放心用;不带且是自己改出来的,改回去。
  3. 旧设备保留 VMess。路由器固件、老手机、公司发的受限设备,兼容性优先。
  4. 把两者当作同一台服务器的两个入口。VLESS 节点异常时切到同名的 VMess 试一次,能快速判断问题出在协议解析还是服务器本身。

小结

VMess 到 VLESS 的变化不是「更强的加密」,而是把加密的责任从协议内部移交给外层。移交之后,alterId 和时间校验这两个历史包袱失去了存在理由,配置项减少,时间不同步这类故障也随之消失。代价是 VLESS 不能脱离 TLS 或 Reality 单独使用,配置里的 encryption: none 属于协议规定而非风险项。性能收益主要落在服务端并发和短连接密集场景,个人日常使用中不足以作为选择理由。手上两种都有时,以客户端版本为准选新的,把旧的留作同机备用入口。

常见问题

VLESS 没有加密,是不是不安全?

VLESS 本身确实不做内容加密,但它在实际部署中总是跑在 TLS 或 Reality 之上,加密由外层完成。真正危险的是把 VLESS 配成不带任何 TLS 的裸传输,那种情况下数据是明文的。机场下发的节点默认都带外层,不要自己把它关掉。

alterId 现在还需要填吗?

新版本的服务端和客户端已经不再使用它,填 0 即可,这是当前的标准值。如果某个客户端强制要求填非零值,说明它的版本相当旧,建议先升级客户端而不是去改服务端参数。

VMess 节点提示「时间不同步」怎么办?

VMess 的握手校验依赖收发双方的系统时间接近一致,通常容忍几十秒的偏差。设备时间跑偏时会直接握手失败。把系统时间设为自动同步并确认时区正确即可,这个问题在 VLESS 上不存在。

订阅里同名节点既有 VMess 又有 VLESS,选哪个?

在客户端版本够新的前提下优先 VLESS,握手更简单、失败点更少。保留 VMess 的意义是给旧设备和旧客户端兜底,以及在 VLESS 节点异常时作为同一台服务器上的备用入口。