VMess, VLESS, Trojan and Shadowsocks Compared: Choosing the Right Proxy Protocol

Compare popular proxy protocols by handshakes, traffic camouflage, overhead, and client compatibility, with practical guidance for different networks and devices.

Quick Overview

This guide is for users reviewing subscription node names, preparing a server deployment, or troubleshooting protocol compatibility. The focus is on separating the roles of the protocol, transport, and security layer, then deciding whether VMess, VLESS, Trojan, or Shadowsocks fits the available devices and network.

First, separate the protocol, transport, and security layer

VMess, VLESS, Trojan, and Shadowsocks are all protocols for exchanging proxied data between a client and server. Node names often include WebSocket, gRPC, TCP, TLS, and Reality, but these are not all protocol names. WebSocket, gRPC, and TCP describe how data is carried; TLS and Reality handle connection security or handshake behavior; domains, ports, and paths are connection parameters.

A single protocol can use different transports. For example, VMess can run over TCP or WebSocket, while VLESS can be combined with TCP, gRPC, and different security layers. Ignoring these combinations when comparing protocols can make it easy to attribute WebSocket's extra encapsulation overhead to VMess itself, or to blame VLESS for every characteristic of a particular security layer.

Typical Trojan deployments rely on TLS. When a handshake fails, check the domain, server time, certificate status, and port first instead of immediately assuming the node is dead. Shadowsocks uses its own encryption method to protect proxied data, but it is not designed to imitate a complete website visit. Its configuration is small and its implementation is mature; suitability mainly depends on the server's encryption method and the client's core support.

Protocol Identity and handshake focus Common combinations What to check first
VMess User ID, time synchronization, and AEAD data handling TCP, WebSocket, or gRPC; TLS can be added User ID, system time, and transport parameters
VLESS Lightweight identity verification; the protocol itself does not encrypt content TCP, WebSocket, or gRPC; can use TLS or Reality Security layer, flow control value, and server/core support
Trojan Password verification and TLS connection Usually TCP with TLS Domain, port, TLS handshake, and server time
Shadowsocks Pre-shared password and the specified encryption method Usually runs directly over TCP or UDP Encryption method, password, and UDP settings

Handshake behavior and compatibility across the four protocols

VMess uses time-based validation and a user ID within the V2Ray ecosystem. Modern configurations generally use AEAD mode; older guides that set alterId to a large value should no longer be used as a baseline for new setups. If the client reports an authentication failure and the same node also fails on other devices, check for a significant system-time difference between the server and client, then verify whether the user ID changed after the subscription update.

VLESS simplifies data handling at the protocol layer and delegates security to an external security layer. That does not mean an “unencrypted connection”: actual security depends on the complete combination. For public-network connections, verify TLS, Reality, or any other server-specified security parameters in full. Copying only the address, port, and user ID while omitting serverName, publicKey, shortId, or flow will cause the handshake to fail.

Trojan has a relatively straightforward configuration structure. Its usual core fields are the server address, port, password, domain, and TLS options. It is sensitive to DNS resolution and TLS configuration. Shadowsocks instead centers on the server, port, password, and encryption method; if either the client or server does not support the method specified by the subscription, startup may fail or the connection may close immediately.

VMess

It remains widely supported in existing subscriptions, making it suitable for VMess nodes that already run reliably. There is no need to migrate solely because the protocol name is older.

Suitable for: existing services, WebSocket deployments, continued compatibility

VLESS

Recommended

Its protocol layer is streamlined and can be combined with the security layers and flow-control features provided by the Xray core, making it a suitable baseline for new deployments when support is confirmed.

Suitable for: new deployments, controlled parameters, shared desktop and Android subscriptions

Trojan

Its connection structure is built around TLS and its fields are relatively easy to understand, but the domain and TLS settings must remain consistent.

Suitable for: existing domain and TLS environments, preference for simple configuration

Shadowsocks

With few settings and a mature implementation, it suits lightweight scenarios where the server clearly specifies a supported encryption method.

Suitable for: resource-constrained devices, simple proxying, clear UDP requirements

Camouflage cannot be judged from the protocol name alone

“Which protocol looks most like normal traffic?” cannot be answered without considering the configuration. When VMess or VLESS uses WebSocket with TLS, an outside observer sees the corresponding TCP, TLS, and HTTP upgrade behavior; common Trojan combinations are built on TLS connections; Shadowsocks focuses more on encrypted proxy transport. Actual behavior also depends on the port, domain, handshake parameters, server response, and network path.

A port number cannot prove the traffic type by itself. Port 443 is commonly used for TLS, but moving any protocol to 443 does not automatically create a valid TLS handshake. Conversely, if the server explicitly listens on 8443, 2053, or another port, the client must use the exact value supplied by the subscription. Changing the port to 443 yourself usually results in a refused connection or an interrupted handshake.

On a controlled server, the operator can choose a combination based on the available conditions. Subscription users should preserve all delivered parameters instead of deleting paths, domains, fingerprints, flow-control values, or security-layer fields for the sake of “optimization.” When a node already works, the protocol name is usually not the first thing to adjust; latency, packet loss, server load, and route detours have a more direct effect on the experience.

Recommended setup: one compatible subscription shared across both devices

Desktop (v2rayN)
  • Use the Xray core configuration specified by the subscription
  • Run a real connection latency test once after updating the subscription
  • Confirm in the log that the security layer and flow-control parameters loaded
Android (v2rayNG)
  • Import the same subscription and preserve all fields
  • Test the node with the same name first, then compare results on mobile data
  • Set the proxy scope by app when needed

This assumes the subscription service returns compatible nodes to both clients; nodes with the same name may still show different latency and packet loss on different networks.

Conclusion: verify the complete combination before comparing protocols

The protocol name determines only part of the connection. A mismatch in the domain, port, transport, security layer, or core version is enough to turn a working node into a failed handshake.

Measure protocol overhead on the same route

Protocol performance cannot be judged from a single speed test. Server location, ingress bandwidth, peak-hour congestion, TCP congestion control, transport encapsulation, and device processing power all affect the result. To compare the four protocols, keep the nodes on the same server or in the same data center, use the same outbound route, test file, and time window, and repeat several rounds using the median.

Here is a controlled baseline to illustrate the testing method: the client connects over Ethernet, access bandwidth is capped at 300 Mb/s, unloaded round-trip latency to the server is 41 ms, average packet loss is 0.2%, and each protocol transfers data continuously for 10 minutes. The test combinations are VMess + WebSocket + TLS, VLESS + TCP + Reality, Trojan + TLS, and Shadowsocks 2022.

300 Mb/s
Client access limit
41 ms
Unloaded server round-trip latency
0.2%
Average packet loss during testing
10 minutes
Transfer duration for each combination

In this environment, the median download speeds for the four combinations were 268 Mb/s, 286 Mb/s, 281 Mb/s, and 289 Mb/s. This only shows that all four configurations approached the access limit under specific conditions with low packet loss and unsaturated bandwidth; it does not prove that Shadowsocks will always be fastest on other routes. The WebSocket encapsulation in the VMess combination, the security layer in the VLESS combination, and the different server implementations all contributed to the final results.

Real connection latency should also be distinguished from ICMP ping. Ping reflects only network-layer round-trip time, while real connection latency includes the proxy handshake, security-layer negotiation, and target connection. A node with 45 ms ping and 92 ms real connection latency is not unusual. If real connection latency stays above 800 ms or times out, use the core log to determine whether the issue is the handshake, name resolution, or the server response.

Conclusion: do not switch protocols when the gap is smaller than normal network variation

If the throughput difference across three tests on the same route is below 10%, prioritize a node with a stable connection, complete client support, and well-maintained subscription parameters instead of migrating based on a single peak result.

Choose by use case, not by protocol-name rankings

For a subscription that already runs reliably, the most direct approach is to update it first, then run real connection latency tests on nodes in the same region. If a VMess node remains available for days, has stable latency, and meets bandwidth needs, there is no reason to change it solely to use another protocol. A protocol migration often also involves the server, firewall, DNS, and subscription-generation rules, so the cost of change belongs in the decision.

For a new deployment where both ends use a recent Xray core, start by evaluating VLESS with a suitable security layer. If a properly configured TLS environment already exists, Trojan's parameter structure is easy to verify. Shadowsocks remains useful for resource-constrained setups with simple configuration and a clearly supported encryption method. When an older V2Ray server configuration must be retained, VMess is easier to carry forward with the existing parameters.

  1. In v2rayN 7.x, update the subscription group and confirm that the node name, address, port, and protocol fields have refreshed.
  2. Choose nodes using different protocols in the same region and run a real connection latency test on each, repeating it at least three times.
  3. Open the core log and rule out authentication failures, TLS handshake failures, DNS resolution failures, and occupied ports.
  4. Use the same target file for a sustained download and record the stable speed after one minute instead of the peak at startup.
  5. Test once more on your everyday network. Fixed broadband and mobile data use different routes, so desktop results cannot directly substitute for Android results.
Local SOCKS listener: 127.0.0.1:10808
Local HTTP listener: 127.0.0.1:10809
Test rounds: 3 per node
Timeout per test: 10 seconds
Record: real connection latency, median download speed, disconnections, and core log errors

Use the local port shown in the current client interface. To verify it, open “Settings” → “Parameter Settings” and check the local listener configuration. 10808 and 10809 are common examples; different versions or existing configurations may use other ports. The port entered in the browser or system proxy must match the port actually listened to by the client.

Common choices and troubleshooting questions

Protocol selection should ultimately become an executable checklist: can the client parse the subscription fields, does the core support the combination, can the current network complete the handshake, and does sustained transfer remain stable? These questions are more useful in daily operation than asking which protocol is “best.”

All four protocols appear in the subscription. Which one should I choose first?

Filter by region first, then choose one node for each protocol and run three real connection latency tests. After removing nodes that time out, download the same target continuously for three minutes and choose the node with low latency variation, no disconnections, and sufficient speed for the intended use.

The VLESS node imports successfully but always times out. What should I do?

Expand the node configuration and check the port, transport, security layer, serverName, publicKey, shortId, and flow one by one. Then inspect the core log. Update the client core if it reports unsupported parameters; if the handshake fails, check the server time and domain settings.

Trojan connects, but web pages will not open in the browser. What should I do?

First confirm that the v2rayN system proxy is enabled, then open “Settings” → “Parameter Settings” and check the local listener port. If the log shows that 10808 or 10809 is already in use, close the conflicting application or switch to an unused port, then restart the core.

Shadowsocks says the encryption method is unsupported. What should I do?

Do not replace the encryption method yourself because the server must use the same setting. Update the subscription and client core first. If it is still unrecognized, choose a node in the subscription that the current core can handle, or use a compatible configuration explicitly provided by the server.

It works on desktop, but the same node fails on Android. Why?

Confirm that both clients have the same subscription update time and compare all node fields. v2rayNG and v2flyNG use different cores, so newer security layers or flow-control parameters may have different version support. Also disable mobile data restrictions before testing again.

The simplified rule is: keep a stable existing configuration; for a new deployment, confirm both cores' capabilities; evaluate Trojan when the TLS conditions are complete; and consider Shadowsocks when the configuration is lightweight and the encryption method is clear. Confirm any protocol using real connection latency, sustained downloads, and logs together—not the node name alone.

Download v2rayN