VMess 與 VLESS 都是 V2Ray 生態裡的傳輸協定,差別集中在身分驗證欄位、是否內建加密、加解密開銷與用戶端核心要求四點。本文依這四點逐項對照,並給出自建伺服器與使用他人訂閱兩種情境下的選型判斷。
身分驗證:同一個 UUID,VMess 多一個 alterId
兩個協定都用 UUID 標示使用者身分。伺服器在 clients 陣列裡寫死一串 UUID,用戶端設定裡的 id 必須逐字元一致,差一個字元就是驗證失敗。單看這一點,VMess 與 VLESS 沒有差別。
差異來自 VMess 早期多出的 alterId 欄位。它由 UUID 衍生出一組臨時識別碼,搭配時間戳記抵抗重放攻擊,舊版預設值為 64。代價是用戶端與伺服器的時間差必須控制在 90 秒以內,系統時間漂移或跨時區使用時經常因此連不上。
| 對照項目 | VMess | VLESS |
|---|---|---|
| 身分欄位 | 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 欄位可以填 auto、aes-128-gcm、chacha20-poly1305 或 none。這讓它可以裸跑 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 部署組合有三類:
- VLESS + TCP + TLS:443 埠,最簡部署,需要自有網域與憑證
- VLESS + XTLS Vision + REALITY:Xray 核心支援,不需要自備網域和憑證
- VLESS + WebSocket + TLS:走 CDN 中轉時使用,與 VMess 的同類組合結構一致
REALITY 與 XTLS Vision 目前只有 VLESS 有對應實作,VMess 沒有。節點資訊裡出現 flow: xtls-rprx-vision 或 security: reality,那它一定是 VLESS。
加密開銷:雙層與單層的實際差別
把差異換算成 CPU 開銷更直觀:VMess 走 TLS 時是兩層加解密——外層 TLS 一次,協定內建一次;VLESS 只有外層 TLS 一次。每一次加解密都要占用 CPU 週期,連線數越多,差距越明顯。
這個差別在什麼裝置上能感覺得到?桌機的現代處理器基本上測不出來;單核低規伺服器、舊款手機或路由器上,VLESS 省下的那層開銷會反映在連線數與吞吐量上。
結論:換協定之前先看裝置
桌機與正常網路下,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 省掉一層加解密,在低規裝置上有可感知的差別,桌機在正常網路下差距很小。
協定是伺服器與用戶端之間的約定,不是可以隨手切換的開關。分清這四點差異,足夠應付日常的節點使用與連線問題排查。