Xray vs. V2Fly Core: Protocol Support, Performance, and Configuration Compatibility

Compare Xray and V2Fly support for VLESS, XTLS, and REALITY, learn where configs are compatible, and choose between v2rayNG and v2flyNG for your nodes.

At a Glance

Check a node’s protocol, transport, security layer, and flow before choosing a core. For REALITY or XTLS Vision, use a compatible Xray build. For existing VMess, WebSocket, and TLS nodes, verify compatibility against the actual config. This guide covers desktop and Android client choices, JSON migration limits, and troubleshooting steps for connection failures after switching.

Know the Difference Between Clients, Cores, and Node Protocols

v2rayN, v2rayNG, and v2flyNG are clients for managing subscriptions, editing configs, viewing logs, and controlling connections. The core establishes proxy connections, applies routing rules, and handles traffic. VMess and VLESS shown in a node list are protocol names, not client names. Changing the client interface does not change which protocols the server accepts.

The V2Fly community maintains the V2Ray project; this article uses “V2Fly core” to refer to that implementation. Xray is an independent core developed as a fork of the V2Ray project. They share a history, but they are no longer two names for the same program. Protocol extensions, config fields, and version changes may differ.

Protocol Support: VLESS Isn’t REALITY, and XTLS Isn’t TLS

When comparing cores, it’s easy to conflate protocols with security layers. VLESS is a proxy protocol; TCP and WebSocket are transport options; TLS and REALITY are connection security settings; and xtls-rprx-vision is a flow value that requires a compatible implementation. To understand a node config, check each layer separately.

CapabilityXray CoreV2Fly CoreWhat to Check
VMessSupports common configurationsSupports common configurationsAlso verify transport, TLS, and server settings
Basic VLESSSupportedAvailable in some implementations; check version and config formatVLESS support does not imply support for every extension
XTLS VisionUse a version that supports this featureNot a drop-in replacement for Xray Vision configsFor xtls-rprx-vision, use a compatible Xray build
REALITYUse a version that supports this featureXray REALITY node configs are not directly compatibleThe public key, serverName, shortId, and other parameters must match
WebSocket + TLSSupports common combinationsSupports common combinationsCheck Host, path, SNI, and certificate validation

Basic VLESS does not provide transport encryption. Don’t skip the security layer just because a node uses VLESS, and don’t switch the REALITY setting to TLS as a compatibility workaround. If the server requires REALITY, the client must use a compatible implementation and the parameters supplied by the server.

Legacy XTLS configs and current Vision configs are not interchangeable either. Flow values, transport names, or security fields in older guides may no longer apply to current versions. When migrating, use the complete parameters from the node provider and check the core logs. Don’t assume similarly named settings are interchangeable.

Choosing a Client: Match Xray or V2Fly to Your Node

The recommendations below apply specifically when a node requires REALITY or Vision. They do not mean one core is faster on every connection or device. If the server already provides a working V2Fly config and you don’t need additional features, keeping the existing setup usually makes it easier to isolate variables than swapping cores.

Xray Core

Recommended

Use this for nodes that explicitly require REALITY, XTLS Vision, or similar features. On desktop, check the core settings used for the node’s protocol in v2rayN. On Android, choose v2rayNG and confirm its bundled core version supports the node parameters.

Best for: VLESS + REALITY and nodes that explicitly require Vision

V2Fly Core

Use this for connections deployed and tested with V2Fly config formats. Common VMess, WebSocket, and TLS combinations can be checked against the server settings; there’s no need to migrate just because the subscription name changed.

Best for: Existing V2Fly configs and standard protocol/transport combinations

  1. Check the fields: Open the node editor and look for security=reality or flow=xtls-rprx-vision. If either is present, start with an Xray config.
  2. Check desktop settings: In v2rayN, open Settings → Parameters and look for the core options in your version. If the version lets you assign cores by protocol, check the mapping for the node’s protocol. The option may be in a different place in other UI versions.
  3. Check the runtime: Save the node, set it as the active server, and check the logs for the core name, version, and startup errors. Don’t rely only on the selection shown in Settings.
  4. Check the Android app: In v2rayNG or v2flyNG, long-press the node in the list and open its settings. If the app cannot represent a required field, switch to a compatible client instead of removing the field.

Config Compatibility: Importing a Share Link Doesn’t Make JSON Configs Interchangeable

Importing a subscription and migrating a full config are two different things. A share link usually describes a single outbound node; after parsing it, the client generates local inbound, DNS, routing, and other settings. A full JSON config may also contain extensions specific to a particular core. Even if both clients can import the same VMess link, that doesn’t mean you can use either full JSON config in the other client unchanged.

Migration Plan: Separate Node Parameters from the Full Runtime Config

Node link or subscription
  • Keep the original address and access parameters.
  • After reimporting, check the protocol, port, and security layer.
  • Check whether the client ignored any unrecognized fields.
  • Set up local listeners and routing separately in the new client.
Full JSON config
  • Back up the original config, then create a separate test copy.
  • Review inbounds, outbounds, and routing one by one.
  • Check DNS format, tag references, and extension fields.
  • Confirm the target core supports the config format before starting it.

Migrate node parameters you can verify first. Revalidate the full config for the target core; changing only the program filename is not enough.

For example, the three fields below come from Xray REALITY and Vision configs. They illustrate what to look for; they are not a runnable config and should not be used to assemble a node:

"protocol": "vless"
"security": "reality"
"flow": "xtls-rprx-vision"

When migration fails, first distinguish a config parsing error from a remote handshake failure. Logs showing an unknown field, unknown security type, or unsupported flow point to a local config issue. If the core starts but the handshake fails, check the address, port, identity parameters, security layer, and system time. Don’t disable certificate validation as a substitute for diagnosing the problem.

Performance: Test Under the Same Conditions Instead of Ranking Core Names

Xray Vision optimizes a specific TLS traffic handling path, but that doesn’t guarantee the same gains for every protocol or workload. Network congestion, server load, transport encapsulation, device CPU, and network changes may matter more than the core. Comparing latency across two different nodes cannot establish which core performs better.

Start by using the same test entry points. The ports below are examples for troubleshooting, not client defaults; use the values shown in Settings and startup logs. A remote port of 443 does not necessarily mean the service uses standard TLS.

10808
Example local SOCKS port
10809
Example local HTTP port
443
Example server listening port

If only a REALITY node is available, there’s no valid way to switch to V2Fly while keeping the protocol the same. In that case, evaluate Xray’s connection stability and resource usage on your device instead of changing the server protocol just to make a comparison.

Troubleshooting After a Switch: Check Core Startup, Then Routing and DNS

A core starting successfully doesn’t mean app traffic is going through the proxy. On desktop, the system proxy affects only apps that follow that setting; on Android, the VPN connection and per-app rules determine which apps are routed through it. Changing routing, DNS, and proxy mode along with the core makes issues harder to reproduce. Change one thing at a time.

  1. Check startup logs: First rule out config parsing errors and address already in use. If an old process is using the example port 10808, stop it before starting the new config.
  2. Confirm the traffic entry point: On desktop, check the system proxy or the app’s manual proxy address. On Android, confirm VPN permission is granted and that the test app is included in the per-app list.
  3. Check routing tags: Outbound tags in a custom config must exist. After migration, rules that still reference old tags may cause startup failures or route traffic incorrectly.
  4. Check DNS: Verify the route to DNS servers and how domain rules interact with the DNS resolution policy. A DNS lookup failure cannot simply be blamed on VMess or VLESS.
  5. Test a single node: Temporarily disable automatic selection and complex routing. First use an explicit proxy outbound to access a fixed destination, then restore routing rules one at a time.

To understand how domains, IPs, and outbound rules work together, see the routing section of the protocol guide. To set up the proxy entry point again, check the client configuration in the Getting Started guide. Don’t overwrite the entire runtime config.

FAQ: Subscriptions, Handshakes, and Choosing an Android App

Why does the same subscription work in v2rayNG but not v2flyNG?

First, check the security layer and flow in the node editor. For a REALITY or Vision node, use v2rayNG, which supports those features. If it’s a VMess configuration supported by both, compare the transport, Host, path, and TLS parameters after importing, then check the startup logs. The same node count does not mean the configs are identical.

Can I change VLESS to VMess to make an older config connect?

Changing the protocol on only one side won’t work. The protocol is determined by both the server inbound and client outbound, and their identity parameter structures may differ. Restore the original value and ask the node provider for a separate config that explicitly supports VMess, then import it through a subscription or add the node manually.

The client is up to date, but it still says the flow isn’t supported. What should I check?

Stop the connection, restart it, and check the actual core version in the logs. On desktop, verify that v2rayN isn’t still using an old core file for the current protocol. On Android, check that the app matches the node requirements. Then compare the flow value with the one provided by the server and make sure you haven’t carried parameters from an older guide into a new node.

I entered the REALITY public key. Why is the handshake still failing?

Check the address, port, UUID, serverName, shortId, and fingerprint settings. Make sure there are no extra spaces and that you haven’t copied parameters from another server. Correct the device clock, then check the logs. Don’t clear shortId or switch the security layer to TLS in an attempt to work around a mismatch.

The choice comes down to two steps: first, make sure the client and core meet the node’s protocol requirements; then verify the connection and performance under the same conditions. REALITY and Vision are clear feature-based reasons to choose a core. For standard VMess or basic VLESS configs, also check the transport, security layer, and config format instead of choosing by core name alone.

Download the clientChoose a platform and installer