Sep 9, 2026 · Protocols · About 10 min read

VMess vs. VLESS vs. Trojan vs. Shadowsocks: Choosing the Right Proxy Protocol

Compare encryption, handshake overhead, transports, and client support for four popular proxy protocols, plus when to use REALITY or TLS.

At a glance

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 for

Vision 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

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.

ClientWhat to checkFirst steps when a connection fails
v2rayNThe core selected for the node, core version, transport, and security settingsOpen the node editor to check the full configuration, then review the core details in the startup log
v2rayNGThe Xray version bundled with the client and the node’s settingsCheck TLS/REALITY and flow in the node editor. After updating, verify the imported settings again.
v2flyNGV2Fly support for the specific protocol and transportCheck 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.

443
Example TLS server listening port
10808
Example local SOCKS listening port
8388
Example Shadowsocks server port

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.

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.

Download v2rayN