· Core Engines · About 10 min read

Xray vs. V2Fly Core: VLESS, XTLS Vision, and REALITY Compared

Compare how the two cores evolved within the Project V ecosystem, including support and configuration for VLESS, XTLS Vision, and REALITY, to help you choose between v2rayNG and v2flyNG.

At a glance

Choose a core based on what your node requires, not just the client’s name. This guide separates clients, protocols, transports, and security layers; explains why VLESS is not REALITY and XTLS Vision is not standard TLS; and covers Android choices, desktop configuration checks, and migration troubleshooting. Existing VMess users can also use it to decide whether switching cores is necessary.

1. Xray and V2Fly: Shared Roots, Different Configuration Boundaries

Project V is the starting point for understanding this ecosystem. V2Ray is its core proxy tool, with the V2Fly community maintaining its development. Xray-core forked from the V2Ray project and went on to develop its own features and configuration system. The two share concepts such as inbounds, outbounds, and routing, but that does not mean every JSON file can be used interchangeably.

The client handles the node list, subscription updates, interface settings, and startup; the core processes connections, protocol handshakes, and routing. v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. On desktop, the cores available in v2rayN and how they are invoked depend on the distribution and configuration type. When troubleshooting, check the executable and version shown in the startup log.

2. VLESS, XTLS Vision, and REALITY Support Compared

VLESS does not provide transport encryption on its own; it is commonly paired with TLS or REALITY. V2Fly also implements VLESS, so “VLESS always requires Xray” is not accurate. What you need to check is the specific combination of flow control, security layer, and transport. Do not assume that an Xray extension with a given name is also supported by V2Fly.

Configuration featureXray coreV2Fly coreWhat to check
VMessSupportedSupportedCheck the transport, TLS, and server settings
Basic VLESSSupportedImplementation availableNot every extension combination is supported as a general-purpose configuration
XTLS VisionSupports the corresponding flow controlDoes not support Xray Vision flow controlFor xtls-rprx-vision, use a compatible Xray environment
REALITYSupportedDoes not support Xray REALITY configurationCheck the key material, SNI, shortId, and fingerprint settings
RoutingSupports routing rulesSupports routing rulesCheck the configuration format, rule semantics, and data files

XTLS Vision is a flow-control mechanism, commonly configured with the value xtls-rprx-vision. It is not a transport, and you cannot enable it by renaming a node’s TLS setting to Vision. REALITY is an Xray security mechanism that requires matching parameters on both the client and server. It is not a subscription encoding format or a standalone client.

Standard TLS typically relies on a certificate and domain validation. REALITY uses a different handshake and authentication parameters; disabling certificate validation is not a substitute. The server’s allowed serverName must match the client’s key material and shortId. A reachable port alone does not mean the proxy handshake will succeed.

3. Configuration: Know Where to Set flow and security

The Xray outbound example below shows how to identify configuration fields and combines VLESS, Vision, and standard TLS. The domain is reserved for examples, and the UUID is illustrative; this is not a working node. For an actual deployment, replace them with the server address, user ID, and certificate domain provided by your server, and confirm that the server enables the required flow control.

{
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "e1dd2b67-68ca-4c8f-a92b-27eb305d91e7",
                "encryption": "none",
                "flow": "xtls-rprx-vision"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        }
      }
    }
  ]
}

In this example, encryption: "none" is a VLESS user field; it does not mean the entire connection is sent in plaintext. The outer security: "tls" provides transport security. flow belongs inside the user object, while security belongs inside streamSettings. Putting either field at the wrong level can cause errors or prevent the settings from taking effect.

4. Choosing Between v2rayNG, v2flyNG, and v2rayN

If your existing subscription explicitly uses VLESS with Vision and REALITY, v2rayNG with the Xray core is the preferred choice on Android. Use v2flyNG if your configuration is built around V2Fly and does not rely on those Xray features. There is no need to migrate a working VMess configuration just because the client names differ.

Xray core environment

Recommended

For the VLESS, Vision, and REALITY scenarios covered here, use v2rayNG on Android. On desktop, check which Xray core the relevant node actually uses in v2rayN.

Best for: Nodes whose server explicitly requires Xray extensions.

V2Fly core environment

Use v2flyNG on Android to keep the same workflow as your existing V2Fly configuration. Whether a basic protocol connects still depends on matching transport and parameters.

Best for: Existing working V2Fly configurations that do not rely on Vision or REALITY.

Verification checklist: Test on desktop and Android

Desktop: v2rayN
  • After importing, check the protocol, transport, security mode, and flow.
  • Connect and check the core name and version in the logs.
  • Confirm that the system proxy points to the current local listening port.
Android: Choose by core
  • Use v2rayNG for REALITY or Vision nodes.
  • Check the imported settings for V2Fly configurations in v2flyNG.
  • Allow the VPN connection, then check the per-app proxy scope.

The same subscription can be used on both devices, but seeing the same node name does not mean both clients parse identical fields or support the same features.

5. Core Switch Connection Failures: Check from Port to Handshake

First distinguish between “the core did not start” and “the core started but the remote connection failed.” For startup failures, check the JSON, field support, file paths, and local port conflicts. For remote connection failures, check the server address, security parameters, network connectivity, and system time. Blaming every failure on core speed can distract from configuration issues you can actually fix.

443
Remote TLS port used in this example
10808
Example port for checking the local SOCKS proxy
127.0.0.1
Local loopback listening address

The local address and ports above illustrate how to check the connection; they are not defaults for every client. First check the SOCKS listening port shown in your client. If it is not 10808, update the command below. Remote port 443 and the local proxy port belong to two separate connections and cannot be substituted for each other.

curl --proxy socks5h://127.0.0.1:10808 https://example.com/
  1. Check the local listener: If the local proxy connection fails immediately, confirm that the core started successfully, the port matches, and no old instance is using the same port.
  2. Check the imported node: Compare it with the original node parameters and verify the UUID, server port, flow, SNI, and REALITY settings. Base64 is only an encoding; it cannot fill in missing fields.
  3. Check the remote handshake: For TLS or authentication errors, check the system time, domain, and key material. Disabling validation is not a general fix.
  4. Check proxy coverage: If commands work but your browser does not, check the system proxy, per-app proxy settings, routing rules, and DNS. Changing the server protocol should not be your first step.

To compare cores, use the same node, network, destination, and roughly the same time. Disable variables such as Mux first, then review the logs and connection results. Node load, network routes, server-side throttling, and the destination’s response can all affect speed. Broader protocol support does not guarantee higher throughput on every route.

6. Core Selection FAQ

My subscription says VLESS. Why doesn’t it work in v2flyNG?

Expand the node details first and check for REALITY or xtls-rprx-vision. These extensions are not interchangeable with basic VLESS. If the node requires them, import the original link into v2rayNG and check that all fields are present.

I replaced the core files in v2rayN. Why does it still fail to start?

Read the startup log first to confirm that the executable and version actually changed, then inspect the generated configuration. Older clients may still generate JSON using outdated fields. Replacing the executable alone does not guarantee that the client’s configuration generator is compatible with the new core.

REALITY connects to the port, but web pages keep timing out. What should I do?

A reachable port only confirms that the basic network connection works. Check SNI, shortId, key material, fingerprint, and flow, then review the remote handshake logs. If a direct proxy test succeeds but an app fails, check the system proxy and routing rules.

My existing VMess node works. Do I need to migrate to Xray?

The protocol name alone is no reason to migrate. Keep the working configuration. Consider testing a migration one node at a time only if the server provides a new node, your current client lacks a required feature, or you have identified a specific compatibility issue.

The decision comes down to a simple checklist: confirm what the server requires, what fields the client can generate, and whether the running core accepts those fields. Keeping these three layers separate is more reliable than guessing compatibility from the client’s name.

Download clientsv2rayN / v2rayNG