机场推荐网

VMess 和 VLESS 的区别,同一串 UUID 的两种用法

两种协议都拿一串 UUID 认用户。VMess 自己带加密,认证时要核对系统时间,设备的钟偏了会整组超时。VLESS 不加密也不看时间,只能跑在 TLS 或 REALITY 里面。

更新于 10 分钟读完作者 阿量参考了 19 份一手资料

两个协议认用户靠的是同一样东西,一串 UUID。节点详情里 uuid 那一行,VMess 节点有,VLESS 节点也有,格式一模一样。差别出在这串 UUID 上了线路以后怎么用。我把 V2Fly 的 VMess 协议规范和 Xray 的 VLESS 协议文档找出来,两种请求头摆在一起,设计思路差得很远。

VMess 把 UUID 和当前时间揉成一段认证信息

V2Fly 的开发者文档管 VMess 叫无状态协议。客户端不用先跟服务器打招呼,发出去的头一个包就带着全部信息。按最初的格式,包的最前面是 16 个字节的认证信息。

16 字节   认证信息   HMAC(MD5, 用户 ID, UTC 时间)
不定长    指令部分   AES-128-CFB 加密,里面有目标地址、数据的加密方式和密钥
不定长    数据部分   按指令部分指定的方式加密

认证信息的算法是拿用户 ID 当密钥,对当前的 UTC 时间做一次 HMAC,时间还要在前后 30 秒的范围里随机偏一下。服务器想认出这 16 个字节,只能拿自己存的 UUID 和自己的时钟照同样的办法算一遍,算出来对得上,才知道来的是哪个用户。指令部分的密钥也从 UUID 推出来,初始向量则从时间推出来。

VMess 怕时钟不准,根子就在这里。客户端和服务器的时间差得太远,服务器怎么算也对不上那 16 个字节,连接只能丢掉。V2Fly 的配置文档给的容差是 90 秒,指系统 UTC 时间的误差,Xray 文档放宽到 120 秒,两家都注明和时区无关。排查的时候这是一条省事的线索,VMess 那几个节点一起超时,别的类型的节点没事,多半是设备的钟走偏了。完整的排查顺序见机场连不上怎么查

MD5 和 AES-CFB 这套算法后来被换掉了。2020 年 9 月 12 日发布的 v2ray-core v4.28.1 规定,客户端把 alterId 设成 0 就启用新的 VMessAEAD 头部。V2Fly 文档里还有一个日期,自 2022 年 1 月 1 日起,服务器端默认不再兼容 MD5 认证。开发者文档的那一节如今直接标着 MD5 认证方式已弃用。

节点里的 alterId 就是这段历史留下来的字段。mihomo 文档解释它只用了半句话,不为 0 则启用旧协议。sing-box 列了张小表,0 代表 AEAD,1 代表旧协议,比 1 大的值和 1 等效。到了 Xray 这边,VMess 出站那一页压根不列这个字段。Surge 的处理不一样,它用一个叫 vmess-aead 的开关,手册里写的默认值是 false。

日本 01 = vmess, jp01.example.net, 443, username=这里填 UUID, tls=true, vmess-aead=true

机场的订阅转换通常会替你带上这个开关。自己手写 Surge 配置的人要记得加,按 V2Fly 的默认设置,2022 年以后的服务器已经不收旧头部。

VMess 节点里另一行 cipher 管的是数据部分用什么算法加密,订阅里一般写 auto。V2Fly 和 Xray 的文档对 auto 的解释相同,运行在 AMD64、ARM64 或 s390x 上选 aes-128-gcm,其余平台选 chacha20-poly1305。V2Fly 还顺手给了建议,前一个适合电脑,后一个适合手机。这一栏留着 auto 就行,手动改成服务端不收的算法反而会连不上。

VLESS 的请求头是几十个字节的明文

Xray 的协议文档给出的 VLESS 请求格式是下面这样。

1 字节    协议版本
16 字节   UUID
1 字节    附加信息长度 M
M 字节    附加信息(ProtoBuf)
1 字节    指令
2 字节    端口
1 字节    地址类型
不定长    地址

UUID 原样躺在第 2 到第 17 个字节上,不做哈希,不掺时间,整个头部也不加密。服务器收到以后查一下这 16 个字节是不是自己的用户,是就开始转发。用不着附加信息时长度填 0,文档特意说明这种情况下没有 ProtoBuf 序列化的开销。从指令往后的那几项,文档说和 VMess 的写法完全一致。Xray 还允许 id 填一段 30 字节以内的任意字符串,内核按 UUIDv5 的规则把它映射成 UUID,文档说两种写法等价,所以个别节点的这一栏看上去不像 UUID 也不用奇怪。

头部是明文,VLESS 就不能单独上路。Xray 文档给它定了一条硬规矩,外面一定要有传输安全层。例外只有两种,服务器在私有地址上并且整条链路可信,或者打开了后面要讲的 VLESS Encryption。V2Fly 那边的提醒更短,VLESS 没有自带加密,请用于 TLS 这样的可靠信道。

配置里那行 encryption 是专门为这件事设的。V2Fly 文档规定它只能填 none,还不许留空,并且解释了为什么非写不可,一来让用的人清楚这一层没有加密,二来以后真加了加密方式,老配置不至于出错。所以在 Clash 格式的订阅里看 VLESS 节点,总能找到 tls: true,走 REALITY 的还会多出一段 reality-opts。那一套参数怎么读,放在 REALITY 与 Vision 那篇里。

明文头部加上外层 TLS,还带来一个 VMess 没有的功能,叫回落。Xray 文档的说法是,TLS 解密之后,首包不足 18 个字节、协议版本无效或者身份认证失败的流量,会被转交给事先指定的另一个服务,比如一台普通的网站服务器。18 这个数正好是版本号、UUID 和附加信息长度三项加起来的字节数。拿着错误 UUID 来试探的人,看到的就是那个网站。文档把它的用处概括成两条,高强度的防主动探测,以及一个端口给多种服务共用。回落只在 TCP 加 TLS 的组合下可用,Trojan 也支持。

VMess 节点一旦开了 TLS,数据就被加密两遍,VMess 自己一遍,TLS 再一遍。V2Fly 给 VMess 的 security 留过两个不加密的选项,none 不加密但保留校验,zero 连消息认证也省掉,后者是 v4.35.0 加进来的。VLESS 走得更远,协议里干脆不设加密这一层。

2020 年下半年的三个发布日期

两个协议后来各走各路,从三个日期能看出个大概。

2020 年 8 月 6 日,v2ray-core 发布 v4.27.0,更新说明的功能栏头一条写着 VLESS PREVIEW 1.3。同年 9 月 12 日的 v4.28.1 让 VMessAEAD 在 alterId 为 0 时自动启用。11 月 9 日,XTLS 组织名下的 Xray-core 仓库创建,VLESS 此后的新功能都加在了这一边。

今天去翻两家的文档,态度正好相反。V2Fly 在 VLESS 那一页的开头放了一则声明,说 VLESS 已被弃用、可能被移除,建议考虑拿 Trojan 代替。Xray 的 VLESS 出站文档里,flowxtls-rprx-visionxtls-rprx-vision-udp443 两个取值,还多了一套叫 VLESS Encryption 的加密,握手方式写作 mlkem768x25519plus,文档称它支持抗量子算法,服务端可以用 xray vlessenc 命令生成配置。mihomo 的 VLESS 文档已经有对应的 encryption 字段,sing-box 的 VLESS 出站文档里目前没有这一项。

查 VLESS 的资料前,先弄清自己的客户端跑的是哪个内核,再去翻那一家的文档。拿 V2Fly 的页面去对 Xray 的节点,字段会对不上。

各家客户端认哪一个

下面这张表只写我在官方文档里查到的内容。

内核或客户端 VMess VLESS 查的是哪份文档
Xray 支持 支持,含 flow 与 VLESS Encryption Xray 出站文档
mihomo 支持 支持,flow 可填 xtls-rprx-vision mihomo 节点文档
sing-box 支持 支持,flow 可填 xtls-rprx-vision sing-box 出站文档
Stash 支持 支持,含 Vision 和 REALITY Stash 协议页
Loon 支持 支持,含 Vision 和 REALITY Loon 节点文档
Surge 支持 手册目录里没有这一页 Surge 手册

安卓上的 v2rayNG 用的是 Xray 内核,v2rayN 的 README 写的是同时支持 Xray 和 sing-box,Clash Verge Rev、FlClash 这一批跑的是 mihomo,Hiddify 和 Karing 跑的是 sing-box。它们对两种协议都没有障碍。要留神的只有 Surge 用户,买之前先问清机场发不发 VLESS 以外的节点。Shadowrocket 的 App Store 介绍里没有列协议清单,我没法从官方页面核实它的支持范围,这里不写。

两种节点里还可能有一行 packet-encoding,管的是 UDP 怎么打包。sing-box 文档在两个取值后面各注了出处,packetaddr 对应 v2ray 5 及更新的版本,xudp 对应 xray,VLESS 出站默认用 xudp。这一栏由机场按自己的服务端来定,用户不用改。

本站的机场资料里 VLESS 有 6 家,VMess 是 0 家

本站收录的 28 家机场,协议一栏有记录的是 8 家。写 VLESS 的有 6 家,星岛梦、Sogo云、灵动云、梯子云、飞为和微风网络,其中灵动云还记了 Trojan,星岛梦还记了 AnyTLS。写 VMess 的一家也没有。这些记录来自机场自己的说法和我整理的资料,核对时间多数是 2026 年 8 月 8 日和 9 日,星岛梦是 9 月 19 日,我没有逐家抓包验证过。

另外 20 家的资料里没提协议,所以这组数字说明的是机场愿意把什么写进介绍。VLESS 是眼下机场愿意写出来的名字,VMess 已经没人拿来宣传。订阅里实际有哪几种节点,导入客户端后看类型那一栏。六种协议放在一起的对照,在机场常见协议总览里。

常见问题

Surge 能导入 VLESS 节点吗

按 Surge 手册目前的内容,不能。手册的协议目录里有 VMess、Trojan、Hysteria 2、AnyTLS 等十几种,没有 VLESS 这一页。机场如果只发 VLESS 节点,iPhone 上可以换 Stash 或 Loon,两家的文档都写明支持 VLESS 和 REALITY 参数。

VLESS 节点里写着 encryption none,数据是不是没加密

VLESS 这一层确实不加密,加密由外面的 TLS 或 REALITY 负责。V2Fly 文档规定这一行必须填 none 且不许留空,用意就是提醒使用者协议本身没有加密。只要节点同时开着 TLS 或带着 REALITY 参数,线路上看到的就是密文。

机场只给了 VMess 节点,我能自己改成 VLESS 吗

不能。用哪种协议是服务端定的,客户端只能照着订阅里的类型去连。把配置里的 type 从 vmess 改成 vless,服务器那头没有对应的入站,结果只会是连接失败。想用 VLESS 就挑节点里本来带 VLESS 的机场。

VMess 和 VLESS 哪个更快

本站没有做过两种协议的对照测速,给不出数字。从协议本身看,VLESS 的请求头只有几十个字节而且不再加密一遍,VMess 开着 TLS 时数据要加密两次。这点差别落到日常看视频、刷网页上很难察觉,机场之间的速度差距主要还是线路带来的。

节点的 UUID 被别人看到了会怎样

对方拿到 UUID 和服务器地址就能用你的流量。两种协议认用户都只靠这一串 UUID,没有第二道密码。节点截图、配置文件和订阅链接一样不能外传,已经泄露的话去机场后台重置订阅,让旧的凭据作废。

参考来源

  1. V2Fly 开发者文档,VMess 协议规范
  2. V2Fly 文档,VMess 配置
  3. V2Fly 文档,VLESS 页面及其弃用声明
  4. Xray 文档,VLESS 协议规范
  5. Xray 出站文档里的 VLESS 一页
  6. Xray 文档,VLESS 入站
  7. Xray 文档,VMess 出站
  8. v2ray-core v4.27.0 发布说明(2020-08-06)
  9. v2ray-core v4.28.1 发布说明(2020-09-12)
  10. GitHub API,XTLS/Xray-core 仓库创建时间
  11. mihomo 文档,VMess 节点
  12. mihomo 文档,VLESS 节点
  13. sing-box 文档,VMess 出站
  14. sing-box 文档,VLESS 出站
  15. Surge 手册,VMess 策略
  16. Surge 手册目录
  17. Stash 文档,支持的代理协议
  18. Loon 文档,节点格式
  19. v2rayN 仓库 README

更新记录

  • 首次发布