VMess vs. VLESS vs. Trojan vs. Shadowsocks: A Proxy Protocol Comparison

Compare VMess, VLESS, Trojan, and Shadowsocks by design, encryption, handshake overhead, and mobile battery use, with guidance for choosing a protocol by use case.

At a glance

A protocol name alone does not determine speed, reliability, or battery use. For users who already have a subscription and are choosing a node, this guide first separates proxy protocols from transport methods and security layers, then compares authentication and connection overhead across four protocols. Check that your client core supports the configuration, verify TLS, transport, and UDP settings, and test under the same network conditions.

Protocols, transport, and security layers

VMess, VLESS, Trojan, and Shadowsocks are proxy protocols; v2rayN is a desktop client, not a fifth protocol. The client manages nodes, subscriptions, system proxy settings, and routing, while the core handles the actual connection. On Android, v2rayNG uses the Xray core, while v2flyNG uses the v2fly core. Similar-looking interfaces do not guarantee identical feature support.

When reviewing node details, check three layers together. The protocol defines authentication and proxy requests; the transport determines how data is carried, such as over TCP or WebSocket; and the security layer protects the connection, for example with TLS. REALITY is a security mechanism in Xray, not a proxy protocol alongside VMess, nor a one-click speed boost for any node.

How the four protocols work and where encryption applies

VMess originated in the V2Ray project and includes user authentication and data protection. VLESS was initially designed to be leaner and avoid redundant work; common configurations rely on TLS or REALITY for connection security. Trojan carries proxy requests over a TLS tunnel. Shadowsocks uses a comparatively lightweight encrypted proxy design, with capabilities depending on the method and implementation.

Protocol Authentication and data protection What to check after importing
VMess Identifies users with a UUID. Modern configurations use VMess AEAD; payload encryption depends on settings such as security, and TLS can be added on top. UUID, alterId, security, and transport type; modern AEAD configurations typically use an alterId of 0.
VLESS Authenticates with a UUID. Deployments commonly set encryption to none and rely on an outer TLS or REALITY layer to secure the connection. UUID, encryption, flow, and security layer; support for additional encryption depends on the core versions at both ends.
Trojan Password-based authentication, usually with TLS protecting proxy requests and payloads. Password authentication does not replace server certificate validation. Password, port, server name, certificate validation, and transport method.
Shadowsocks Data is protected by the selected encryption method. Traditional AEAD and Shadowsocks 2022 use different keys and protocol details. method, password or key format, and UDP support; the “SS” in a node name is not enough to identify its capabilities.

“VLESS is unencrypted” describes only a common protocol-layer setting, encryption: none; it does not tell you whether the entire connection is encrypted. Likewise, enabling TLS does not mean you can enter arbitrary values: the server name, certificate chain, and server configuration must still match. Do not hide configuration errors by disabling certificate validation.

443
Common TLS server port, not a protocol requirement
16 bytes
Binary length of the UUID used by VMess and VLESS
0
Common alterId setting in modern VMess AEAD configurations

Handshake overhead: first connection vs. ongoing traffic

Handshake overhead affects how long a new connection takes to establish; it is not the same as download bandwidth. For a typical new TCP connection using TLS 1.3, TCP setup usually takes one round trip, and a full TLS handshake usually takes another. DNS, the proxy request, and the connection to the destination are additional. TLS session resumption, connection reuse, and packet loss all affect real-world results, so these round trips cannot simply be added up to predict page load time.

The HTTP upgrade for WebSocket adds an extra step. Connection reuse can let multiple logical connections share an underlying connection, but it also changes congestion behavior and how widely failures can affect traffic. So comparing “VMess over WebSocket over TLS” with “Shadowsocks over direct TCP” means comparing complete connection setups, not just protocol header sizes.

Takeaway: Check the transport stack before judging handshake costs

If short-lived connections are slow to start, check DNS, TLS setup, and repeated reconnects first. If large file transfers remain slow, look at route bandwidth, packet loss, and server load. These are different problems and should not be explained by the same “latency” figure.

Mobile battery use: radio wakeups matter more than the protocol name

There is no reliable, universal ranking of the “most battery-efficient protocol.” Encryption uses CPU, but results also depend on hardware AES acceleration, the ChaCha20 implementation, and traffic load. On cellular networks, repeatedly waking the radio, keeping connections alive, retransmitting under weak signal, and background app sync can all be major sources of battery drain.

TUN usually captures more traffic than a proxy configured for a single app; DNS requests, UDP, and background connections may also pass through the core. Any resulting change in battery use cannot be attributed entirely to VLESS or Trojan. For a fair test, avoid detailed logging, repeated speed tests, and large-scale node scans, which add their own workload.

  1. Keep the device, network type, and screen brightness constant. Before testing, record the battery level, signal status, and background apps.
  2. Use the same 20-minute routine for every run—for example, 10 minutes of browsing, 5 minutes of video at a fixed quality, and 5 minutes with the screen off. This is a test plan, not a benchmark conducted by this site.
  3. Keep TUN or app proxy mode, DNS, and routing rules the same. Change only one protocol configuration per run and record actual traffic.
  4. Repeat each candidate three times and check system battery usage and the core logs for reconnects. Do not draw conclusions from differences smaller than the battery indicator’s resolution.

Choose based on your nodes and client

The recommendations below apply only to everyday connections with the required server parameters already available and a compatible Xray core. They are not protocol rankings. If your subscription offers only one usable protocol, stick with the verified configuration; there is no need to rebuild the entire connection just to change protocol names.

VLESS: Complete security-layer parameters available

Recommended

Use the complete TLS or REALITY configuration provided by the server, and verify flow and core support. If parameters are missing, do not guess by repeatedly toggling options.

Best for: Users with an Xray core and a matching VLESS server configuration

VMess: Keep a verified connection

If an existing VMess AEAD node works, you can keep using it. When troubleshooting, check the system clock, UUID, alterId, and transport parameters before switching protocols.

Best for: Existing subscriptions that primarily use VMess and have a stable connection history

Trojan: TLS already configured

Connect using the password, server name, and certificate settings. TLS is an important part of the connection, so keep the certificate valid and the names consistent at both ends.

Best for: Servers already configured with a verifiable TLS tunnel

Shadowsocks: Confirm the method and UDP requirements

First check the encryption method and key format, especially the difference between traditional AEAD and 2022 methods. For gaming, voice calls, and similar use cases, verify UDP forwarding separately.

Best for: Configurations with clear parameters and a client that supports the required TCP or UDP proxy method

In v2rayN, select a node and open its edit window to check the protocol and transport parameters; field names may vary by version. On Android, when using v2rayNG or v2flyNG, first confirm that the core supports the protocol, encryption method, and security extensions. The same subscription will not necessarily behave identically with both cores.

Test under the same conditions: Tcping is not enough

Tcping mainly shows whether a TCP port is reachable and how long the connection takes to establish. It cannot verify the UUID, password, TLS server name, or proxy request, and it does not confirm UDP support. A real connection test is closer to an actual proxy request, but results still depend on the test target, DNS, routing, and connection reuse.

  1. Use the same entry point: In v2rayN, keep the system proxy or TUN setting consistent and check that the local listening port matches the app settings. For example, if the local port is set to 10808, the app must not still point to an old port. This is an example setting, not a default for every version.
  2. Confirm the routing rule: Make sure test traffic actually uses the selected proxy outbound. If a routing rule sends the target directly, the result says nothing about that node.
  3. Measure separately: Record results for the first request, repeated requests, large file transfers, and UDP apps. Do not combine different tests into a single score.
  4. Alternate and retest: Test in A, B, A, B order, with at least five requests per candidate. Record the median and failure count to reduce the impact of changing network conditions.

Takeaway: Start with a working configuration, then compare repeated results

First rule out candidates with authentication failures, certificate errors, or routing rules that do not match. Then compare repeated tests of the same task. If the protocols use different servers, record the result as a “node comparison,” not a protocol performance conclusion.

Protocol selection FAQ

Can I change a VMess node to VLESS and connect right away?

No. The server must also offer a VLESS inbound, and the UUID, security layer, and transport parameters must match. Import the VLESS configuration provided by the server instead of just changing the protocol dropdown in the client.

Tcping works for Trojan. Why does the actual connection fail?

Check the client logs first to distinguish a connection timeout from TLS validation or authentication failure. Then verify the port, password, server name, device clock, and certificate validity. A reachable TCP port does not mean TLS and proxy authentication have succeeded.

Shadowsocks opens websites. Why can’t my game connect?

First check whether the game uses UDP. Then verify that app traffic enters the proxy, the server allows UDP, and the current encryption method and core support the required forwarding. Successful TCP requests from a browser do not prove that the UDP path works.

My phone uses more battery after switching to VLESS. Should I switch back right away?

Compare TUN, routing, background restrictions, and log levels before and after the change, and check for repeated reconnects. Retest the same traffic load several times. If the route and transport method also changed, you cannot yet attribute the battery difference to VLESS.

Download v2rayN