2026-09-09 · 协议选型 · 约 10 分钟

VMess、VLESS、Trojan、Shadowsocks 对比:四种代理协议的场景选型

从加密方式、握手开销、传输层搭配与客户端支持度横向比较四种主流协议,并说明 REALITY、TLS 等组合在不同场景下的取舍。

本文速览

先核对服务端提供的完整组合,再选择客户端内核。已有稳定 VMess 节点可以继续使用;新建且两端支持 Xray 的连接,可优先评估 VLESS 配合 TLS 或 REALITY;已有证书与域名运维流程时可考虑 Trojan;需要较简洁的加密代理配置时可考虑 Shadowsocks。本文面向订阅使用者与自行配置节点的用户,重点解释协议、安全层、传输方式和路由各自负责什么,以及如何避免导入成功却连接失败。

一、四种协议的差别:认证、加密与外层保护

四种协议不能只按“新旧”排列。VMess 与 Shadowsocks 自带数据加密机制;VLESS 的常见配置不在协议层加密载荷,需要外层安全通道;Trojan 的常见部署依赖 TLS。比较安全性时,必须把协议与外层保护一起写出来,不能把裸 VLESS 与 VMess 的加密连接直接比较。

协议 认证与加密 常见部署组合 需要核对的字段
VMess UUID 身份;现代部署采用 AEAD,具体载荷加密由配置决定 TCP;WebSocket + TLS UUID、加密方式、传输参数;旧字段 alterId 通常为 0
VLESS UUID 身份;常见 encryption 为 none,由 TLS 或 REALITY 保护通道 TCP + TLS;TCP + REALITY;按服务端要求启用 Vision UUID、flow、安全层、serverName;REALITY 的公钥与 shortId
Trojan 密码认证;依赖 TLS 提供通道加密与服务端身份验证 TCP + TLS 密码、端口、serverName、证书验证
Shadowsocks 密码或密钥;由指定加密方法提供保护 直接 TCP/UDP;扩展组合取决于实现 method、密码或密钥、UDP 支持;是否为 2022 系列

VMess 的 alterId: 0 是现代 AEAD 配置中常见的兼容字段,不表示没有加密。Shadowsocks 也不能只写“支持 SS”:传统 AEAD 方法与 2022 系列对密钥格式、内核版本的要求不同。导入时若方法名不被内核识别,改一个显示名称不能解决问题。

二、按场景选型:先满足服务端条件

订阅用户通常没有必要自行改协议。一个 VMess 服务端不会因为客户端把类型改成 VLESS 就接受连接。自行部署时,才需要把证书管理、端口开放、传输支持与客户端版本一起纳入选型。下面的“推荐”针对新建、两端可控且支持对应配置的连接,并非所有网络环境的速度排名。

VLESS + TLS / REALITY

推荐

可在支持的 Xray 组合中使用 Vision。TLS 与 REALITY 是不同的安全配置路线,不能只切换一个名称;应按服务端提供的参数完整配置。

适合:新建连接、两端配置可控、能够维护内核版本

VMess + WebSocket + TLS

已有成熟配置时继续使用更省排查成本。若经过反向代理,需要同时对齐 WebSocket 路径、Host、TLS 域名和后端监听地址。

适合:保留现有 VMess 节点、沿用已验证的反向代理配置

Trojan + TLS

配置重点是密码与 TLS。具备域名、有效证书及续期流程时,运维边界较清楚;证书过期或域名不匹配仍会导致连接失败。

适合:已有 TLS 运维流程、希望使用密码认证的部署

Shadowsocks AEAD

基础参数较少,但必须确认具体加密方法。若应用需要 UDP,还要核对服务端、客户端和中间网络是否完整支持 UDP 转发。

适合:已提供匹配加密方法、希望简化基础参数管理的连接

结论:先列出服务端的完整组合,再决定迁移

把节点记录为“协议 + 传输 + 安全层 + flow”,例如“VLESS + TCP + REALITY + Vision”。只有目标客户端支持整条组合时,迁移才有意义;单看支持 VLESS 的标记不足以判断可用。

三、握手开销与速度:没有通用的最快协议

握手开销影响新连接建立时间,持续吞吐则更多受线路带宽、丢包、服务端负载与终端性能影响。TCP 建连、TLS 握手以及 WebSocket 的 HTTP Upgrade 都可能产生额外往返;是否复用连接、是否恢复 TLS 会话,也会改变实际耗时。因此不能给四种协议套一个固定毫秒数。

VLESS 在常见配置下不重复做协议层载荷加密,但这不意味着它一定比所有 VMess 或 Shadowsocks 节点快。不同节点若位于不同机房、使用不同出口,结果主要反映线路差异。Vision 也不是“开启后带宽翻倍”的开关,其作用与适用条件应按内核文档和两端配置理解。

  1. 固定测试条件。尽量使用同一服务端、同一出口与同一测试资源;无法控制这些条件时,只把结果当作节点体验比较,不归因于协议本身。
  2. 分开测建立连接与下载。记录首次响应时间,再观察持续传输至少 30 秒的平均速率。一次延迟测试不能代表视频或大文件体验。
  3. 每组重复 3 次。使用中位数,并记录测试时间、是否启用复用及是否存在后台下载。保留失败次数,不只保留最好的一次。
  4. 保持路由一致。确认测试请求确实经过待测出站。若某轮被直连规则命中,测得的速度就不属于代理连接。

多路复用也应单独评估。它可能减少部分短连接开销,但在不适合的组合或丢包环境中,也可能扩大连接间的相互影响。先保留客户端与服务端的已验证设置,出现明确问题后再单独调整,避免一次更改协议、复用和 DNS 三项参数。

四、TLS、REALITY 与传输层:配置不能互相替代

TLS 保护通道并验证服务端身份;WebSocket 是一种传输封装;REALITY 是 Xray 提供的安全机制,不是第五种代理协议。TCP、WebSocket 与安全层属于不同配置维度。服务端提供 TCP + REALITY 时,不能自行改成 WebSocket + TLS 并期待继续连接。

以下是 Xray JSON 中的 VLESS + TCP + TLS 出站结构示例。example.net 是文档示例域名,UUID 也是演示值,这段内容不提供可连接节点。实际使用须采用服务端分配的地址、身份和证书域名;REALITY 节点不能直接套用这段 TLS 配置。

{
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "example.net",
            "port": 443,
            "users": [
              {
                "id": "6e7d180b-486c-4f4a-89c4-574ca70b83d2",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.net",
          "allowInsecure": false
        }
      }
    }
  ]
}

这里的 outbounds 只描述出站,不包含完整的本地入站与路由。由 v2rayN 管理节点时,应优先在节点编辑界面维护参数;不要直接覆盖客户端生成的运行配置,以免下一次启动或订阅更新时被重新生成。更多字段职责可查阅JSON 配置手册。

五、客户端与内核:名称相同不代表组合相同

v2rayN 是桌面客户端,协议能力取决于它实际调用的内核与版本。Android 上的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。Project V、V2Fly、Xray 存在技术渊源,但不同项目的配置字段与扩展能力不能直接画等号,尤其是 REALITY、Vision 与较新的传输方式。

客户端检查重点遇到失败时先做什么
v2rayN节点所选内核、内核版本、传输与安全参数打开节点编辑界面核对组合,再查看启动日志中的内核信息
v2rayNG随客户端提供的 Xray 版本与节点字段检查节点编辑页的 TLS/REALITY 和 flow,更新后重新检查导入内容
v2flyNGV2Fly 对具体协议和传输的支持对 REALITY 等 Xray 特定组合先确认支持情况,不强行改写链接

订阅链接是分发节点参数的载体,不是第五种代理协议。即便成功导入,订阅格式转换也可能丢失某些扩展字段。遇到“同一节点在一个客户端可用、另一个不可用”,先逐项比较协议、端口、传输、安全层、SNI、flow 与认证信息,再判断是否为内核能力差异。

六、端口、UDP 与路由:区分连接的不同层级

服务端端口、本地代理端口与应用目标端口承担不同职责。下面三个数字仅用于辨认配置位置,不是所有节点的默认值,也不是性能建议。实际监听地址与端口以客户端当前配置为准。

443
示例 TLS 服务端入口端口
10808
示例本地 SOCKS 监听端口
8388
示例 Shadowsocks 服务端端口

把服务端设为 443,并不会自动开启 TLS;协议握手与安全层仍须正确配置。同样,浏览器访问本地 SOCKS 端口,与客户端向远端 443 发起连接,是两个不同阶段。系统代理只影响遵循系统代理设置的应用,不能证明所有流量都经过了代理。

结论:网页、UDP 与出口地址分开验证

先用普通网页确认 TCP 连接,再测试需要 UDP 的应用,最后核对目标请求命中的路由。三个结果分别记录,能避免把应用未接入代理误判为协议缺陷。

七、常见问题:导入成功之后如何排查

VMess 节点还能用,有必要全部换成 VLESS 吗?

没有必须迁移的要求。先确认当前 VMess 使用现代 AEAD 配置,旧式配置中的 alterId 通常应为 0,并保持系统时间同步。只有服务端提供新的完整配置、且客户端支持对应组合时,再复制节点做对照测试,不要直接修改原节点的协议类型。

VLESS 导入后一直超时,先看哪个参数?

先确认远端地址和端口可达,再打开节点编辑界面核对安全层。REALITY 节点重点检查公钥、shortId、serverName 与 flow;TLS 节点重点检查证书域名。随后查看日志,区分网络超时、认证失败和握手失败,不能只凭“超时”判断 UUID 有误。

Trojan 出现证书错误,打开跳过验证就行吗?

应先检查设备日期与时区、serverName、证书有效期以及服务端证书链。使用 IP 连接时,仍需按服务端说明填写证书对应域名。跳过验证会削弱服务端身份验证,不应当作为日常修复方案。

Shadowsocks 密码没错,为什么仍然连不上?

同时核对服务端端口与完整 method 名称,例如 aes-128-gcm 与 2022 系列不是同一套配置。部分方法要求固定长度的编码密钥,不能用任意口令代替。若日志提示不支持加密方法,检查所用内核版本,再向节点提供方确认兼容配置。

换协议之后,国内外分流会自动调整吗?

不会。协议负责连接方式,路由决定请求进入哪个出站。在 v2rayN 的「设置」→「路由设置」检查当前规则,菜单名称可能随版本变化;同时确认系统代理状态。若规则绑定了特定出站标签,还要检查标签是否仍指向新的节点。

下载v2rayN