VMess 與 VLESS 的差異:一般使用者需要知道的四個重點

兩個協定在設定檔裡的欄位差異不大,實際使用時的取捨卻集中在四個地方。以下依身分驗證、傳輸層依賴、加密開銷與用戶端相容性逐項對照,說明哪些差異會影響日常使用,哪些在新版用戶端裡已經可以忽略。

本文速覽

VMess 與 VLESS 都是 V2Ray 生態裡的傳輸協定,差別集中在身分驗證欄位、是否內建加密、加解密開銷與用戶端核心要求四點。本文依這四點逐項對照,並給出自建伺服器與使用他人訂閱兩種情境下的選型判斷。

身分驗證:同一個 UUID,VMess 多一個 alterId

兩個協定都用 UUID 標示使用者身分。伺服器在 clients 陣列裡寫死一串 UUID,用戶端設定裡的 id 必須逐字元一致,差一個字元就是驗證失敗。單看這一點,VMess 與 VLESS 沒有差別。

差異來自 VMess 早期多出的 alterId 欄位。它由 UUID 衍生出一組臨時識別碼,搭配時間戳記抵抗重放攻擊,舊版預設值為 64。代價是用戶端與伺服器的時間差必須控制在 90 秒以內,系統時間漂移或跨時區使用時經常因此連不上。

對照項目VMessVLESS
身分欄位UUID + alterId(舊版)僅 UUID
防重放機制alterId 衍生識別碼 + 時間戳記;AEAD 後由協定本身保證交給傳輸層
時間同步要求alterId > 0 時需與伺服器時間差在 90 秒內無要求
新版設定alterId 填 0無此欄位

2022 年 1 月發布的 V2Ray v4.35 把 alterId 標記為棄用,v5 直接移除該欄位。現在 v2rayN 6.x 新增 VMess 節點,alterId 預設就是 0,走 AEAD 驗證,不再檢查時間戳記。只要兩端都填 0,這一項差異就幾乎不存在。

VLESS 從設計之初就沒有 alterId,防重放交給傳輸層處理,伺服器不需要維護工作階段狀態,協定標頭也更短。所以第一點可以總結成一句話:新版本裡兩者一樣簡單,只有遇到 alterId 非 0 的舊節點時,才需要額外留意時間同步。

傳輸層依賴:VLESS 不做二次加密

VMess 協定自帶加密層。即使不套 TLS,VMess 流量本身也是加密的,設定裡的 security 欄位可以填 autoaes-128-gcmchacha20-poly1305none。這讓它可以裸跑 TCP,也可以搭配 mKCP 這類不依賴 TLS 的傳輸方式。

VLESS 反過來:協定本身只做驗證與轉發,一個位元組都不加密,設定裡固定寫 "encryption": "none",負載明文交給傳輸層。裸跑 TCP 的 VLESS 等於明文傳輸,實際部署必須套 TLS、XTLS 或 REALITY。

{
  "outbounds": [{
    "protocol": "vless",
    "settings": {
      "vnext": [{
        "address": "node.example.com",
        "port": 443,
        "users": [{
          "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
          "encryption": "none",
          "flow": "xtls-rprx-vision"
        }]
      }]
    },
    "streamSettings": {
      "network": "tcp",
      "security": "reality"
    }
  }] // VLESS 出站:加密交給 REALITY 傳輸層
}

注意

節點資訊裡沒有 TLS、REALITY、XTLS 字樣時,先確認傳輸層是否安全。VLESS 本身不提供加密備援。

常見的 VLESS 部署組合有三類:

REALITY 與 XTLS Vision 目前只有 VLESS 有對應實作,VMess 沒有。節點資訊裡出現 flow: xtls-rprx-visionsecurity: reality,那它一定是 VLESS。

加密開銷:雙層與單層的實際差別

把差異換算成 CPU 開銷更直觀:VMess 走 TLS 時是兩層加解密——外層 TLS 一次,協定內建一次;VLESS 只有外層 TLS 一次。每一次加解密都要占用 CPU 週期,連線數越多,差距越明顯。

這個差別在什麼裝置上能感覺得到?桌機的現代處理器基本上測不出來;單核低規伺服器、舊款手機或路由器上,VLESS 省下的那層開銷會反映在連線數與吞吐量上。

0
新版 VMess alterId 必填值
1 層
VLESS 加解密層數
2 層
VMess 疊上 TLS 後的層數
443
TLS 部署常用埠

結論:換協定之前先看裝置

桌機與正常網路下,VMess 和 VLESS 的速度差在測量誤差範圍內;只有當裝置效能吃緊或並行連線數高時,VLESS 省掉的這層加解密才值得作為切換理由。

用戶端相容性:核心版本決定能不能用 VLESS

VLESS 能不能用,取決於用戶端內建的核心版本。v2rayN 6.x 預設使用 Xray 核心,VMess 與 VLESS 全系列支援;v2rayNG 同樣基於 Xray 核心;v2flyNG 使用 v2fly 核心,從 v4.27 起支援 VLESS,但不支援 REALITY。

Xray 核心

推薦

v2rayN 6.x 預設核心、v2rayNG 使用。VLESS 與 XTLS Vision、REALITY 全支援,VMess 也完整相容。

適合:新裝用戶端、要用 REALITY 節點

v2fly 核心

v2flyNG 使用。v4.27 起支援 VLESS,REALITY 不在支援範圍內,VMess 與 WebSocket 相容性穩定。

適合:只用 VMess 與 WebSocket 的既有節點

版本號是硬門檻。V2Ray 核心 v4.26 及以前不認得 vless:// 連結,訂閱裡混入 VLESS 節點時匯入會直接失敗。查看方式:v2rayN 主介面「設定」→「參數設定」→「Core: 基礎設定」,Xray 核心版本號是 1.x,v2fly 核心是 4.x 或 5.x。

分享連結的前綴也能用來區分:vmess:// 後面是 base64 編碼的 JSON,vless:// 是 URI 查詢字串形式,形如 vless://uuid@位址:埠?參數#備註。一條訂閱裡兩種連結可以混存,用戶端依前綴分別解析,節點列表裡只是多幾筆記錄。

結論:協定跟著伺服器走

節點用什麼協定在伺服器端就定死了,用戶端能選的只有核心與傳輸方式。拿到 VMess 節點照用即可,不需要為了「更新」去轉換。

什麼時候需要留意

把四個對照點落到日常使用,真正需要留意協定差異的情境只有三類。

依情境選型:新部署走 VLESS,既有節點維持原樣

自建伺服器
  • Xray 核心 + VLESS + REALITY
  • 埠 443,flow 填 xtls-rprx-vision
  • 不需要自備網域與憑證
使用他人訂閱
  • 伺服器端給什麼協定就用什麼協定
  • VMess 節點無需轉成 VLESS
  • alterId 一律填 0

協定在伺服器端定死,用戶端改不了;一條訂閱裡兩種節點混存不會互相影響。

剩下兩類的判斷更直接:裝置效能吃緊時優先選 VLESS,少一層加解密;需要 CDN 中轉或相容舊用戶端時,VMess + WebSocket + TLS 的適用範圍更廣。

訂閱裡同時有 vmess:// 和 vless:// 連結,會衝突嗎?

不會。用戶端依連結前綴分別解析,一條訂閱裡兩種節點可以共存,節點列表裡只是多幾筆記錄。

VLESS 節點連不上,日誌顯示 invalid user 是什麼原因?

UUID 不符。核對用戶端 id 與伺服器 clients 裡的 UUID 是否逐字元一致,或重新更新一次訂閱。

VMess 的 alterId 到底要填多少?

新版一律填 0。v2rayN 6.x 新增節點時預設就是 0;訂閱裡回傳非 0 值代表伺服器核心較舊,兩邊保持一致即可。

換成 VLESS 會更快嗎?

協定不決定速度,線路品質占大部分。VLESS 省掉一層加解密,在低規裝置上有可感知的差別,桌機在正常網路下差距很小。

協定是伺服器與用戶端之間的約定,不是可以隨手切換的開關。分清這四點差異,足夠應付日常的節點使用與連線問題排查。

下載 v2rayN

Windows、macOS、Linux 桌面版與 v2rayNG Android 版的入口都在下載頁。

下載用戶端