This comparison is for users organizing subscriptions, adding nodes manually, or considering a protocol change. The goal is not to rank four protocols permanently, but to check whether the current client fully supports the node parameters, whether the network is stable, and which transport combination the server provides.
The short answer: the protocol name is not the only selection criterion
VMess, VLESS, Trojan, and Shadowsocks can all carry proxy traffic, but they solve the problem differently. VMess handles authentication, time validation, and encryption inside the protocol; VLESS keeps the protocol layer lightweight and relies mainly on outer security mechanisms such as TLS and REALITY for confidentiality; Trojan has always organized authentication and data transfer around a TLS connection; Shadowsocks is known for its simple design, mature implementations, and low resource usage.
When a subscription includes all four node types, do not judge speed by protocol name alone. Real-world performance also depends on bandwidth, round-trip latency, packet loss, transport method, TLS handshakes, server load, and the client core. On the same server, protocol overhead is usually only part of the total time; if the route itself has 180 ms of latency or persistent packet loss, switching from VMess to VLESS alone will not fix the connection.
VMess
Authentication and encryption are built into the protocol, with broad coverage across legacy subscriptions and existing deployments.
Best for: keeping stable existing nodes and maintaining compatibility with older configurations
VLESS
RecommendedThe protocol layer is lightweight and commonly paired with TLS or REALITY. When the parameter set is clear, it is a strong choice for new configurations.
Best for: Xray-based clients and newer transport combinations
Trojan
Relies on TLS for encryption and commonly uses standard TLS ports. Deployment requires correctly handling certificates, domains, and handshake parameters.
Best for: setups with an established domain and stable TLS deployment
Shadowsocks
Uses few configuration fields and mature AEAD encryption, making it easy to maintain on low-powered devices and in simple access scenarios.
Best for: lightweight access, low resource usage, and simple configurations
For a practical starting point, filter by client core first. With v2rayN using the Xray core, check VLESS, VMess, and Trojan nodes first; v2rayNG likewise handles common protocols through the Xray core. With v2flyNG using the v2fly core, follow the protocols and transport parameters supported by the core currently in use. A node importing successfully does not mean every extension field will be recognized, so check the logs before connecting.
A four-part comparison: encryption, overhead, transport, and compatibility
VMess authenticates with a user identifier and time information, while protecting data inside the protocol. It is sensitive to system time, and a large clock difference can cause authentication to fail. VLESS identifies users with information such as a UUID, but does not provide complete content encryption itself. Do not evaluate it separately from the secure transport layer; in practice, confirm fields such as security, flow, TLS, and REALITY together.
Trojan performs authentication and carries data over a TLS connection, so the server certificate, domain match, and system time all affect the handshake. Shadowsocks uses a pre-shared password and a selected encryption method. Modern configurations should use AEAD or a Shadowsocks 2022 method, and the method name must match exactly on the client and server. Older methods may still appear in legacy configurations, but they are not recommended as the default for new deployments.
| Comparison point | VMess | VLESS | Trojan | Shadowsocks |
|---|---|---|---|---|
| Protocol-layer encryption | Includes authentication and data protection | Primarily relies on outer TLS or REALITY | Relies on TLS | Provided by the selected AEAD method |
| Common identity information | UUID, alterId, and other legacy fields | UUID、flow | Password | Password and encryption method |
| Common transport combinations | TCP、WebSocket、gRPC | TCP、WebSocket、gRPC、REALITY | TLS over TCP, with support for specific transports | Native TCP/UDP; extended capabilities depend on the implementation |
| Configuration complexity | Moderate, with more legacy fields | Moderate; security-layer parameters must be checked | Moderate; TLS conditions must be handled | Low; few core fields |
| Time-sensitive factors | Authentication requires the correct system time | TLS or REALITY handshakes are affected by system time | Certificate validation is affected by system time | Usually does not depend on certificate time |
| Typical strengths | Broad compatibility with legacy configurations | Simple protocol layer and flexible combinations | A clear TLS deployment path | Lightweight, few parameters, and low resource overhead |
Bottom line: verify the complete parameter set before comparing protocol names
A VLESS node should be checked as a complete set of address, port, UUID, transport, security layer, and flow. A Shadowsocks node must match on port, password, and encryption method. Failures caused by missing fields are far more common than a few percentage points of theoretical overhead between protocols.
Choosing for desktop, mobile, and low-powered devices
Desktop work typically involves a browser, sync tools, and messaging apps running together for long periods, so stability matters more than a short speed test. If the subscription offers VLESS with TLS or REALITY and v2rayN is currently using the Xray core, try it as the primary connection; keep a VMess or Trojan node on the same route for comparison. When switching, do not change the server region, transport, and protocol at the same time, or you will not know which change affected the result.
Android devices often switch between Wi-Fi and mobile networks, so reconnect time, battery use, and UDP availability matter more than a single peak-speed result. v2rayNG can handle common Xray nodes and works well with a unified subscription containing VLESS, VMess, or Trojan. With v2flyNG, choose nodes compatible with the capabilities of the v2fly core. Sharing a subscription keeps the node list in sync, but routing rules, per-app proxy settings, and local ports are client-side settings and do not migrate automatically.
Recommended setup: assign primary and backup protocols
Desktop (v2rayN)
- Use a fully specified VLESS node as the primary connection
- Keep VMess or Trojan as a comparison option
- Watch handshake and reconnection records in the logs
Android (v2rayNG or v2flyNG)
- Use the same subscription to keep node names consistent
- Filter for nodes recognized by the current core
- Test Wi-Fi and mobile networks separately
Keep the server region and route fixed first, then switch only the protocol. Using each option continuously for a while makes it easier to identify a stable combination than looking at a single speed test.
On low-powered devices or with many concurrent short connections, test Shadowsocks first. Its core configuration usually consists of only the server, port, password, and encryption method, which makes troubleshooting shorter. If the workload requires complex routing, a specific flow control mode, or REALITY, use an Xray combination that supports those capabilities instead of forcing an incompatible protocol just to reduce a few fields.
- Primary desktop connection: compare sustained stability between VLESS and Trojan first, then keep a VMess node as a compatibility fallback.
- Frequent network switching: record the time to recover after each switch and verify that UDP applications work normally.
- Low-powered devices: measure Shadowsocks CPU usage and sustained throughput first, then decide whether a more complex transport layer is necessary.
- Existing subscriptions: do not replace a stable VMess node solely because the protocol is older; evaluate the route and the server's maintenance status first.
Replace one-off speed tests with repeatable testing
Keep the server, egress route, target file, and testing window fixed. A practical baseline is about 50 ms round-trip latency from client to server, under 1% idle packet loss, and a 100 Mbps local connection. Test each node three times and disable background sync before testing. The figures below illustrate a test record, not a fixed ranking across different networks.
Record at least four results: time to first connection, sustained download speed, reconnection count within 10 minutes, and UDP availability. Peak speed reflects only one moment and cannot show whether a protocol remains stable during network changes or under weak conditions. If the four nodes are not on the same server, label the result as overall route performance rather than attributing it to the protocol itself.
You can also run a simple cross-check: test VLESS, VMess, Trojan, and Shadowsocks in that order, then repeat in reverse. If the first node tested is always faster, background tasks, temporary server load, or network congestion may be changing. Compare averages only when the forward and reverse results are reasonably close.
- Speed gap under 8%: choose the node with fewer reconnects and cleaner logs.
- Latency gap over 30 ms: check the server region and route first; do not attribute it directly to the protocol.
- Packet loss over 5%: fix the network quality issue first; fine-tuning encryption usually offers limited benefit.
- Only UDP fails: check whether the node supports UDP, whether the client has enabled the relevant forwarding, and whether routing rules are blocking it.
Bottom line: stability metrics come before peak speed
On a 100 Mbps connection, staying connected for 10 minutes without reconnecting, recovering after a network switch, and showing the expected UDP behavior are usually more valuable than gaining 5 Mbps in one test.
Checking protocol parameters in v2rayN and Android clients
In v2rayN, first use the type column in the server list to confirm whether the node is VMess, VLESS, Trojan, or Shadowsocks, then open its server settings. For VLESS, verify the address, port, user ID, transport protocol, TLS or REALITY, and security flow. For VMess, check the user ID, transport, and security settings. For Trojan, check the password, server name, and certificate-related options. For Shadowsocks, verify the password and encryption method.
The local proxy ports must also match the browser or system settings. Common configurations use SOCKS port 10808 and HTTP port 10809, but users can change these values, so do not treat the examples as fixed for every installation. If an app cannot connect, open Settings → Parameters, check the current local listening ports, and compare them field by field with the proxy address in the app.
- VMess authentication failed: sync the system time first, then confirm that the UUID matches the server.
- VLESS handshake failed: check the fields that actually appear, such as security, flow, serverName, publicKey, and shortId.
- Trojan reports a TLS error: check the device time, server name, port, and certificate domain.
- Shadowsocks connects but carries no traffic: confirm that the client and server use exactly the same encryption method and password.
- The node type is wrong after importing a subscription: update the subscription and check whether the original node's extension parameters were ignored by an older core.
Troubleshooting on Android follows a similar order. In v2rayNG, open the node editor to check the protocol fields, then review DNS, handshake, and connection errors in the runtime log. With v2flyNG, also confirm that the node's capabilities are included in the current v2fly core. If the same subscription works on desktop but not on Android, compare the two cores and node fields before assuming the server is down.
Common misconceptions and the final selection checklist
“VLESS is always faster than VMess” is the most common oversimplification. VLESS has a lighter protocol layer, but in real connections, TLS, transport encapsulation, network round trips, and server load often account for more. Another misconception is treating Trojan as ordinary web traffic. It is built on TLS, but its observable network behavior also depends on handshake parameters, transport behavior, and deployment, so the protocol name alone cannot support an absolute conclusion.
Shadowsocks is not limited to simple web browsing either. Support for UDP, concurrent connections, and specific routing depends on the client, server, and configuration together. Conversely, more configuration fields do not automatically make a connection more reliable. Every protocol requires correct server parameters, an available route, and a compatible core.
Four protocols appear in the subscription. Which should be tested first?
Choose nodes in the same region and on the same carrier route, then test VLESS, Trojan, VMess, and Shadowsocks three times each. If the servers differ, filter by latency and packet loss first, then compare protocols.
Can a VMess node still be used?
Yes. If the client core recognizes the configuration, the server is maintained, and the connection is stable, there is no need to switch solely because of the protocol name. For new deployments, evaluate options such as VLESS based on the security layer and maintenance conditions.
What if VLESS imports successfully but cannot connect?
Check the port, UUID, transport, security, flow, and server name in order. With REALITY, also verify publicKey, shortId, and fingerprint parameters, then use the core log to locate the handshake stage.
Does using port 443 mean a Trojan configuration is definitely correct?
No. 443 is only a common port. You must also confirm the password, server name, TLS handshake, and server listening status. If another service occupies the port, the log usually shows a connection refusal or handshake failure.
Why does Shadowsocks connect but carry no traffic?
Compare the encryption method and password first, then check the local SOCKS or HTTP port. If only a particular app fails, review the system proxy, per-app proxy, and routing rules to see whether they cover that app.
The final choice can be reduced to three steps: first, check whether the current client and core fully support the node fields; second, test connection time, reconnections, and UDP on a fixed route; third, keep a backup node using a different protocol. For desktop use, start by evaluating VLESS with the Xray core. Stable existing VMess nodes can remain in service; choose Trojan when TLS deployment conditions are mature; and test Shadowsocks first on low-powered devices or in simple access scenarios.
A protocol is not a permanent setting chosen once and forgotten. After a provider changes its server, a client core is upgraded, or the network environment shifts, the best combination may change. Keep test records and retest under the same conditions instead of chasing a single protocol name.