VMess vs. VLESS vs. Trojan vs. Shadowsocks: Which Proxy Protocol Should You Choose?

Compare VMess, VLESS, Trojan, and Shadowsocks by encryption, transport, setup complexity, and client support. Find the right protocol for your setup.

At a glance

Start by separating the proxy protocol from the transport and security layers, then check the server settings and client core. This guide is for users choosing a subscription node, moving configurations between desktop and Android, or setting up their own server. By the end, you’ll know which fields each protocol requires, which combinations aren’t interchangeable, and what to check first when a connection fails.

1. Proxy Protocol, Transport, and Security Are Different Layers

VMess, VLESS, Trojan, and Shadowsocks define how a client authenticates with a proxy server and how requests are encapsulated and forwarded. TCP, WebSocket, and gRPC describe the connection or transport. TLS and REALITY are security mechanisms. Node names often combine details from several layers, so the protocol name alone doesn’t tell you everything about the configuration.

For example, VLESS + WebSocket + TLS and VLESS + TCP + REALITY both use VLESS, but they require different server entry points, handshake parameters, and network conditions. Changing the transport on the first node to TCP won’t turn it into the second. Without a matching server listener, the client will simply fail to connect.

2. Encryption and Configuration Differences

When comparing encryption, ask two questions: Does the proxy protocol encrypt the payload, and is there an additional layer such as TLS? A field set to none doesn’t necessarily mean the whole connection is unencrypted. Likewise, using port 443 doesn’t prove that TLS is enabled.

Protocol Authentication and encryption Common combinations Fields to check
VMess Identifies users with a UUID; modern configurations use VMess AEAD, with payload encryption determined by the security setting TCP;WebSocket + TLS UUID, security, alterId, transport, security layer, system time
VLESS Identifies users with a UUID; the protocol itself does not encrypt the payload TCP + TLS; WebSocket + TLS; TCP + REALITY with Xray UUID, encryption, flow, TLS or REALITY parameters
Trojan Password authentication; typical deployments rely on TLS to protect the connection TCP + TLS; other transports require support on both ends Password, port, server name, certificate verification, transport
Shadowsocks Encryption uses a method and password or key material; AEAD and the 2022 series have different requirements Native TCP and UDP forwarding; additional transports require extra support method, password or key format, port, UDP support

VMess: Check AEAD and legacy fields

Modern VMess configurations typically use alterId: 0 for AEAD. Don’t copy a non-zero alterId from an older guide into a current configuration. VMess authentication also depends on the system clock. If the time on Windows or Android is significantly off, enable automatic time synchronization before assuming the UUID is wrong. Whether to add TLS depends on the server setup.

VLESS: No built-in payload encryption doesn’t mean it should run in the clear

encryption: "none" is a common VLESS setting; TLS or REALITY provides connection protection. Don’t remove the security layer from a typical public-facing setup just because “VLESS has low overhead.” xtls-rprx-vision is a flow value for specific combinations. Don’t copy it to every WebSocket node or enable it on the client alone.

Trojan and Shadowsocks: More Than a Password Must Match

With Trojan, the TLS handshake can fail before authentication even if the password is correct, for example when the TLS server name is wrong. Shadowsocks requires an exact match for the encryption method: aes-128-gcm and 2022-blake3-aes-128-gcm are not interchangeable. The latter has specific key-format requirements; a regular password won’t do.

Bottom Line: Check the Security Layer Before Comparing Protocol Names

Check the node editor’s TLS or REALITY settings and certificate verification status. Don’t disable the security layer because VLESS uses encryption set to none, and don’t treat disabling certificate verification as a long-term fix for Trojan.

3. Choose by Use Case, Not by a Speed Ranking

With a subscription, the provider determines which options are available. If two nodes use different protocols and also differ in server, route, load, or exit, a speed test can’t show that one protocol is universally faster. For a self-hosted setup, first consider your certificate, domain, and network entry point, then choose a transport combination.

VLESS: For a New Xray Setup

Recommended

Choose TLS or REALITY based on your deployment, provided both the server and client support it. Check the UUID, security parameters, and flow. Don’t mistake “fewer parameters” for “the security layer is optional.” This recommendation applies to new configurations where you control the server.

Best for: Xray users who manage the server and can maintain the complete set of connection parameters

VMess: Keep a Proven Node

If an existing VMess AEAD node is stable and imports correctly on both desktop and Android, there’s no need to replace it. Before changing protocols, check legacy fields and time settings. Don’t rebuild a working server just to change its protocol name.

Best for: Existing subscriptions, WebSocket + TLS deployments, and compatibility with existing configurations

Trojan: When You Have a Domain and Certificate

A standard TCP + TLS setup has a relatively straightforward configuration, but you still need to maintain the certificate, DNS records, and server name. Troubleshooting should cover the TLS handshake as well as the password.

Best for: Users who can maintain certificates and have a Trojan server entry point

Shadowsocks: For Straightforward Encrypted Forwarding

Native connections keep the main settings in one place: method, key, and port. If you need UDP, verify server-side forwarding and network access separately. A webpage loading successfully isn’t enough to confirm UDP works.

Best for: Users with a matching server who want native TCP/UDP forwarding

None of these four protocols guarantees anonymity. Server operations, DNS routing, app sign-in status, and client routing settings can all affect the results. Choose based on your deployment constraints, not assumptions about security based on a protocol’s name.

4. Support Boundaries in v2rayN, v2rayNG, and v2flyNG

v2rayN is a desktop client, v2rayNG is an Android client that uses the Xray core, and v2flyNG uses the v2fly core. Clients manage nodes and generate configurations; the core actually implements the protocols. A client recognizing a subscription entry doesn’t guarantee that its current core supports every extension in it.

Client Where to check What to consider
v2rayN Protocol, transport, and security settings in the node editor; core details in the startup log Check the core actually in use on desktop; VLESS + REALITY requires a compatible Xray core and matching parameters
v2rayNG Long-press a node → Edit; check startup errors on the log screen The four basic protocols work when configured accordingly; newer extensions depend on the Xray version bundled with the app
v2flyNG Node editor, app version, and startup log Check what the v2fly core actually supports; Xray-specific REALITY and Vision parameters can’t be carried over as-is

Migration: Check the Protocol Family, Then the Extension Fields

Desktop: v2rayN
  • After importing, open the node editor and verify the address, port, transport, and security layer.
  • For REALITY, check the public key, shortId, server name, and fingerprint settings.
  • After startup, check the core log. Fix configuration parsing errors before testing a webpage.
Android: v2rayNG or v2flyNG
  • Use a core that matches the server parameters; don’t compare only the protocol names shown in the app.
  • Before switching to v2flyNG, check for Xray-specific extensions.
  • Check system VPN permission and per-app settings so you don’t mistake a traffic capture issue for a protocol problem.

Using the same subscription URL avoids duplicate entry, but whether both clients can use the same node depends on core support. Update the subscription separately in each client.

5. Use Ports and Logs to Pinpoint Connection Failures

The three port numbers below illustrate different port roles. They aren’t defaults for every client or deployment requirements. The server’s inbound port and the local proxy listening port are at opposite ends of the connection and can’t be used interchangeably. Check the node configuration and the actual local listening port before entering a value.

443
Example server-side TLS inbound port
10808
Example local SOCKS proxy port
1080
Example alternate SOCKS proxy port
  1. First, confirm the core starts. If the log shows a configuration parse error, an unknown field, or a port conflict, fix the configuration first. Testing protocol speed at this point is meaningless.
  2. Next, confirm the app is capturing traffic. On desktop, check that the system proxy points to the active listening port. On Android, check that the VPN is connected and the target app isn’t excluded.
  3. Check that the server is reachable. For a connection timeout, verify the address, inbound port, firewall, and that the service is running. A timeout alone doesn’t mean the UUID is wrong.
  4. Separate the security handshake from user authentication. For certificate errors, check the system time, server name, and certificate chain first. For authentication errors, verify the UUID, password, key, and encryption method.
  5. Finally, check the transport parameters. For WebSocket, verify path and Host; for gRPC, check serviceName; for REALITY, check the server-provided public key, shortId, and other fields.

For example, if the local SOCKS listener is confirmed as 127.0.0.1:10808, use the command below to test whether a request passes through the client. It uses a domain-based test page and contains no subscription credentials. If your port differs, use the actual value.

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 https://example.com/

socks5h means the SOCKS proxy resolves the destination domain. This test bypasses system proxy settings, but not the core’s routing rules: if the domain is routed directly, a successful response doesn’t prove that the remote proxy can reach the internet. Check the matched rule and outbound in the logs before drawing a conclusion.

6. How to Make a Fair Performance Comparison

Between different routes, latency, congestion, packet loss, and server load often matter more than protocol overhead. The names VMess, VLESS, Trojan, and Shadowsocks can’t be translated directly into throughput. Results also depend on hardware encryption acceleration, extra transports, and whether test traffic uses the same outbound route.

Bottom Line: Keep Stable Setups and Change One Variable at a Time

Export a recoverable configuration first, then change only one setting at a time—and only when the server supports it. Consider replacing your everyday node only after 3 consecutive tests show improvement and the logs confirm the same outbound route.

7. Protocol Choice FAQs

VLESS encryption is set to none. Should I change it to AES?

No. This VLESS field isn’t an encryption method selector like the ones used by VMess or Shadowsocks. Open the node editor and check that the security layer is set to TLS or REALITY as required by the server, then verify the relevant parameters. Don’t enter an algorithm from another protocol in the encryption field.

Why does Trojan report a certificate error on port 443?

The port doesn’t verify identity. First enable automatic time synchronization, then compare the TLS server name with the domain covered by the server certificate. Check whether the certificate has expired and whether the chain is complete. The connection address and server name can differ, but the latter must match the deployment requirements. Don’t leave certificate verification disabled as a long-term workaround.

The same subscription works in v2rayNG but not v2flyNG. What should I do?

Open the node editor and check whether the configuration includes REALITY or xtls-rprx-vision. These Xray extensions aren’t generic VLESS parameters you can carry over. Use a compatible node provided by the server or a matching core. Don’t simply delete fields that trigger errors; the server may require them.

Shadowsocks loads webpages, but game traffic fails. Did I choose the wrong protocol?

First check whether the game uses UDP. Then verify that UDP forwarding is enabled on the server, the relevant ports are allowed through the firewall, and the client’s traffic capture covers the app. A successful TCP webpage test doesn’t replace a UDP test. Compare other protocol combinations offered by the server only after checking these conditions.

My existing VMess node is stable. Should I switch everything to VLESS?

There’s no need to migrate based on the protocol name alone. First verify that the current configuration uses modern AEAD, the system time is correct, and the security settings match the deployment. If you need new features or easier maintenance, add a matching VLESS server configuration and test it before migrating. Don’t overwrite your only working node.

Download v2rayNDesktop and Android clients