Check the server’s full configuration before choosing a client core. Existing VMess nodes that work reliably can stay as they are. For new connections where both ends support Xray, consider VLESS with TLS or REALITY. Trojan may suit setups with an established certificate and domain management workflow; Shadowsocks is an option when you want a simpler encrypted proxy configuration. This guide is for subscription users and people configuring their own nodes. It explains the roles of protocols, security layers, transports, and routing—and how to avoid a successful import that still won’t connect.
1. How the four protocols differ: authentication, encryption, and transport security
The four protocols can’t be ranked simply as old versus new. VMess and Shadowsocks have built-in data encryption. Common VLESS configurations don’t encrypt payloads at the protocol layer, so they need an outer secure channel. Typical Trojan deployments rely on TLS. To compare security, consider the protocol and its outer protection together; don’t compare bare VLESS directly with an encrypted VMess connection.
| Protocol | Authentication and encryption | Typical setup | Fields to check |
|---|---|---|---|
| VMess | UUID identity; modern deployments use AEAD, with payload encryption determined by the configuration | TCP;WebSocket + TLS | UUID, encryption method, and transport settings; legacy alterId is usually 0 |
| VLESS | UUID identity; encryption is commonly set to none, with the connection protected by TLS or REALITY | TCP + TLS; TCP + REALITY; enable Vision if required by the server | UUID, flow, security layer, serverName; REALITY public key and shortId |
| Trojan | Password authentication; relies on TLS for channel encryption and server authentication | TCP + TLS | Password, port, serverName, certificate verification |
| Shadowsocks | Password or key; protected by the configured encryption method | Direct TCP/UDP; additional transport combinations depend on the implementation | method, password or key, UDP support, and whether it uses the 2022 series |
alterId: 0 is a common compatibility field in modern VMess AEAD configurations; it doesn’t mean encryption is disabled. For Shadowsocks, “supports SS” isn’t enough detail either: legacy AEAD methods and the 2022 series have different key-format and core-version requirements. If the core doesn’t recognize the imported method, changing its display name won’t fix the problem.
2. Choose by use case: start with the server’s requirements
Subscription users usually don’t need to change protocols themselves. A VMess server won’t accept a connection just because you change the client’s protocol to VLESS. When setting up your own server, account for certificate management, open ports, transport support, and client versions. The recommendations below are for new connections where you control both ends and can use the required configuration—not a speed ranking for every network.
VLESS + TLS / REALITY
Best forVision can be used with supported Xray configurations. TLS and REALITY are distinct security setups, not interchangeable labels; configure all parameters to match what the server provides.
Best for: new connections where you control both configurations and can maintain core versions
VMess + WebSocket + TLS
Keeping a proven setup can save troubleshooting time. If you’re using a reverse proxy, make sure the WebSocket path, Host, TLS domain, and backend listening address all match.
Best for: keeping existing VMess nodes and reusing a tested reverse proxy setup
Trojan + TLS
The key settings are the password and TLS. If you have a domain, a valid certificate, and a renewal process, the operational requirements are straightforward. An expired certificate or mismatched domain will still prevent connections.
Best for: deployments with an established TLS workflow that use password authentication
Shadowsocks AEAD
There are fewer basic settings, but you still need to confirm the exact encryption method. If your apps need UDP, check that the server, client, and network path all support UDP forwarding.
Best for: connections with a supported encryption method when you want to keep basic configuration simple
Bottom line: document the full server setup before migrating
Record each node as “protocol + transport + security layer + flow”—for example, “VLESS + TCP + REALITY + Vision.” Migration only makes sense if the target client supports the entire combination; a VLESS support label alone doesn’t tell you whether it will work.
3. Handshake overhead and speed: there’s no universally fastest protocol
Handshake overhead affects how long it takes to establish a new connection. Sustained throughput depends more on bandwidth, packet loss, server load, and device performance. TCP setup, the TLS handshake, and the HTTP Upgrade for WebSocket can each add round trips. Connection reuse and TLS session resumption also affect real-world latency, so there’s no fixed millisecond figure that applies to all four protocols.
Common VLESS configurations don’t repeat payload encryption at the protocol layer, but that doesn’t mean they’re always faster than VMess or Shadowsocks. When nodes use different data centers or network egress, results mostly reflect network differences. Vision isn’t a “double your bandwidth” switch; understand its role and requirements from the core documentation and the configurations at both ends.
- Keep test conditions consistent. Use the same server, egress, and test resource wherever possible. If you can’t control these factors, treat the results as a comparison of node performance, not of the protocols themselves.
- Measure connection setup and downloads separately. Record the time to first response, then measure average throughput over at least 30 seconds of continuous transfer. A single latency test doesn’t predict how video or large downloads will perform.
- Run each test three times. Use the median and note the time, whether connection reuse was enabled, and whether other downloads were running. Record failures too—not just the best result.
- Keep routing consistent. Confirm that test requests actually use the outbound you’re testing. If a direct-connection rule matches during a test, the measured speed doesn’t represent a proxy connection.
Evaluate multiplexing separately too. It can reduce overhead for some short-lived connections, but in unsuitable configurations or lossy networks, it can increase interference between connections. Start with settings already verified for your client and server; change them one at a time only when there’s a specific problem. Avoid changing the protocol, multiplexing, and DNS settings all at once.
4. TLS, REALITY, and transports: each setting has a different role
TLS secures the channel and verifies the server’s identity. WebSocket is a transport wrapper. REALITY is a security mechanism provided by Xray, not a fifth proxy protocol. TCP, WebSocket, and the security layer are separate configuration dimensions. If the server provides TCP + REALITY, changing it to WebSocket + TLS won’t preserve the connection.
- TLS: Check
serverNameagainst the certificate’s domain. You can connect to an IP address, but certificate verification still requires the correct server name. SNI and the WebSocket Host are separate fields. - REALITY: Check the server public key,
shortId, allowedserverName, and fingerprint settings. The public key is the server’s key—not an arbitrary piece of text from a website certificate. - Vision: A common flow value is
xtls-rprx-vision. Set it only when the server and transport combination support it; don’t add it to every VLESS node. - WebSocket: The path must match exactly, including capitalization and the leading slash. If you get an HTTP 404 or the handshake fails, check the reverse proxy forwarding and path first—not the UUID.
This is an example VLESS + TCP + TLS outbound in Xray JSON. example.net is a documentation domain, and the UUID is also illustrative; this configuration doesn’t provide a working node. Use the address, identity, and certificate domain assigned by your server. Don’t use this TLS configuration as-is for a REALITY node.
{
"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
}
}
}
]
}
Here, outbounds describes only the outbound; it doesn’t include a complete local inbound or routing setup. If you manage nodes in v2rayN, edit their settings in the node editor. Don’t overwrite the runtime configuration generated by the client—it may be regenerated on startup or during a subscription update. For details on each field, see the JSON Configuration Guide.
5. Clients and cores: the same protocol name doesn’t guarantee the same support
v2rayN is a desktop client; its protocol support depends on the core and version it actually uses. On Android, v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. Project V, V2Fly, and Xray have technical roots in common, but their configuration fields and feature support aren’t interchangeable—especially for REALITY, Vision, and newer transports.
| Client | What to check | First steps when a connection fails |
|---|---|---|
| v2rayN | The core selected for the node, core version, transport, and security settings | Open the node editor to check the full configuration, then review the core details in the startup log |
| v2rayNG | The Xray version bundled with the client and the node’s settings | Check TLS/REALITY and flow in the node editor. After updating, verify the imported settings again. |
| v2flyNG | V2Fly support for the specific protocol and transport | Check support for Xray-specific configurations such as REALITY first; don’t force-convert the link |
A subscription link carries node settings; it isn’t a fifth proxy protocol. Even when import succeeds, subscription conversion can drop some extended fields. If the same node works in one client but not another, compare the protocol, port, transport, security layer, SNI, flow, and authentication details before blaming differences in core support.
6. Ports, UDP, and routing: separate the layers of a connection
The server port, local proxy port, and destination port used by an app serve different purposes. The three numbers below are examples to help identify settings—not defaults for every node or performance recommendations. Use the listening address and port in the client’s current configuration.
Setting the server port to 443 doesn’t enable TLS by itself; the protocol handshake and security layer still need to be configured correctly. Likewise, a browser connecting to a local SOCKS port and the client connecting to a remote server on port 443 are separate steps. The system proxy only affects apps that honor system proxy settings; it doesn’t prove that all traffic uses the proxy.
- Websites work, but real-time apps fail: Check whether the app uses the proxy and whether UDP forwarding is allowed by the client inbound, remote outbound, and firewall.
- Domains fail, but some IP addresses are reachable: Check the DNS query path, resolution results, and routing rules instead of assuming the protocol is unstable.
- Some sites show your local egress: Check whether a direct-connection rule matched. Switching from VMess to VLESS won’t change routing policies.
Bottom line: test websites, UDP, and egress separately
First, use a regular website to verify the TCP connection. Then test an app that needs UDP. Finally, check which route the request used. Recording each result separately helps avoid mistaking an app that bypasses the proxy for a protocol problem.
7. FAQ: troubleshooting after a successful import
My VMess node still works. Do I need to switch everything to VLESS?
No migration is required. First, confirm that your VMess node uses a modern AEAD configuration; for legacy setups, alterId is usually 0. Keep your system clock synchronized. Only test a new configuration if the server provides the full settings and your client supports them. Duplicate the node for comparison instead of changing the original node’s protocol type.
A VLESS node keeps timing out. Which setting should I check first?
First, make sure the remote address and port are reachable, then check the security settings in the node editor. For REALITY, verify the public key, shortId, serverName, and flow; for TLS, check the certificate domain. Review the logs to distinguish a network timeout from authentication or handshake failure—a timeout alone doesn’t prove the UUID is wrong.
Trojan reports a certificate error. Can I just disable certificate verification?
First check the device date and time zone, serverName, certificate validity, and server certificate chain. If you connect by IP address, use the certificate domain specified by the server. Disabling verification weakens server authentication and isn’t a suitable everyday fix.
My Shadowsocks password is correct. Why can’t I connect?
Check the server port and the full method name too: aes-128-gcm and the 2022 series use different configurations. Some methods require an encoded key of a specific length; an arbitrary password won’t work. If the log says the encryption method isn’t supported, check your core version and ask the node provider for a compatible configuration.
Will switching protocols automatically change routing between mainland China and other destinations?
No. The protocol defines how the connection works; routing determines which outbound handles each request. In v2rayN, check Settings → Routing Settings. Menu names can vary by version; also check the system proxy status. If rules point to a specific outbound tag, make sure it still points to the new node.