Aug 12, 2026 · Core Engines · About 9 min

Xray vs. V2Fly Core: XTLS, REALITY Support, and Configuration Compatibility

Compare Xray and V2Fly cores by project history, protocol support, and configuration compatibility, with guidance on when to use v2rayNG or v2flyNG.

At a glance

If a node uses REALITY or xtls-rprx-vision, choose an Xray core that supports it. For VMess, standard VLESS, and TLS, check compatibility against the transport and specific configuration fields. This guide is for users choosing an Android client, switching desktop cores, or troubleshooting subscription imports. It covers the settings to check beyond the protocol name and how to tell a configuration issue from a network problem.

Project Background and Client Roles

Xray-core and the v2ray-core maintained by V2Fly share a common project history, but have since followed different development paths. Project V provides context for this proxy ecosystem. V2Fly maintains the community continuation of v2ray-core, while Xray has developed independently. Both are core programs that handle proxy connections, routing, and DNS—not client interfaces.

Clients manage subscriptions, let you edit nodes, start the core, and display logs. The core reads the final configuration and handles connections. So being able to import a node in the interface does not mean the core can run it. A subscription parser may recognize certain fields without passing them to the active core for processing.

Subscription parsing Configuration generation Core loading Route matching Outbound handshake

When troubleshooting, note both the client version and the core version currently running. Updating the interface does not necessarily update the core files, and replacing the core does not mean the client's editor can generate every new field.

Protocol Support: XTLS and REALITY

REALITY and XTLS Vision are not synonyms for VMess or VLESS. VLESS is a proxy protocol; REALITY belongs to the transport security configuration layer; Vision is a flow control mode used with specific connection setups. If a subscription lists VLESS, REALITY, and Vision together, check each configuration layer—not just whether VLESS is supported.

Feature or combinationXray coreV2Fly coreWhat to check
VMessSupportedSupportedAuthentication method, transport, and TLS settings
Standard VLESSSupportedSupportedDoes not imply Vision support
WebSocket + TLSCommon combinations supportedCommon combinations supportedPath, Host, SNI, and certificates
REALITYSupportedDoes not support Xray's REALITY configurationServer public key details, shortId, and serverName
xtls-rprx-visionSupported for compatible combinationsFlow control not supportedFlow control value and transport/security layer combination
Complete JSON configurationParsed using Xray configuration syntaxParsed using the corresponding V2Fly configuration formatThe entire file is not guaranteed to be interchangeable

Here, XTLS primarily refers to the commonly used Vision setup. Don't treat legacy flow control values such as xtls-rprx-direct from older guides as migrated simply by replacing them with xtls-rprx-vision. The server must also use a compatible combination; changing flow control on the client alone can cause the handshake to fail.

Bottom Line: Check the Security Layer and Flow Control First

If the node editor shows security=reality or flow=xtls-rprx-vision, start with the Xray core and then verify the transport settings. Don't remove these fields just to make the node work with V2Fly.

How REALITY and Vision Work in a Connection

During the handshake, REALITY lets the client verify key material held by the server and uses target-related settings to shape the TLS handshake. It does not route all proxy traffic through the target website or remove authentication. The server still needs correctly configured keys, a target, and allowed names, and the client must use matching settings.

Vision primarily handles how TLS traffic is identified and forwarded through the proxy tunnel, reducing redundant wrapping and processing overhead when conditions allow. It does not mean every connection skips encryption, nor can it eliminate physical link congestion, cross-region latency, or packet loss on the network. Any improvement in page load speed depends on the actual workload.

VLESS + REALITY + Vision

Proxy protocol
VLESS
Transport
TCP-based transport; confirm the name for your configuration version
Security layer
REALITY
Flow control
xtls-rprx-vision
Authentication details
User ID, public key details, shortId, and more

Enter the full parameter set provided by the server. Don't treat REALITY settings as ordinary TLS certificate options.

VMess + WebSocket + TLS

Proxy protocol
VMess
Transport
WebSocket
Security layer
TLS
Path example
/ws; must match the server
Name settings
Check the WebSocket Host and TLS SNI separately

Both cores have common implementations. The example path is not a universal default; use the value in the node configuration.

Configuration Compatibility and Field Migration

The traditional JSON configurations used by both cores share many structures, such as inbounds, outbounds, and routing. But fields that look alike may have different accepted values, defaults, or subfields. V2Fly also has multiple configuration formats, so identify the format your file uses before migrating it.

This example uses a common rule in traditional JSON routing to send private addresses through the direct outbound. It shows only the routing section, not a complete, runnable configuration. The actual file must include an outbound tagged direct and the data files required by the rule.

routing.json · Configuration snippet
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}

Also distinguish a configuration loading successfully from its settings actually taking effect. Unknown fields may trigger an error or be ignored. A running process alone doesn't prove the migration worked—check the logs, active outbound, and connection results in the target app. For details on related fields, refer to the protocol configuration guide.

Port Checks and Troubleshooting Order

When a connection fails, check the local connection separately from the remote handshake. The ports below illustrate what to check; they are not defaults for every client. Use the current inbound configuration and node port, and don't change a working listener just to match a tutorial.

10808
Example local SOCKS inbound port
443
Example remote TLS service port
  1. Check that the app is routed through the client. If the local SOCKS inbound listens on 127.0.0.1:10808, the app must use the matching address, port, and proxy type. The system proxy setting does not guarantee that every app will follow it.
  2. Check that the core loads correctly. If it exits immediately, reports an unrecognized field, or doesn't support the flow control mode, check the core selection and configuration format first—not DNS.
  3. Check remote reachability. If the local inbound works but the remote connection times out, check the node address, actual server port, network path, and server status. A reachable port does not guarantee successful authentication.
  4. Check the handshake settings. For REALITY, verify the public key details, shortId, serverName, and time settings. For standard TLS, check the SNI, certificate validity period, and trust chain. Don't hide errors by disabling certificate verification.
  5. Check routing and DNS resolution. If only some domains fail, inspect their DNS results and which outbound they match. Change one set of settings at a time during testing, and keep the original configuration so you can restore it.

Troubleshooting: Start the Core, Check the Handshake, Then Check Routing

First test the basic connection with a node whose settings are known and complete, then restore custom routing and DNS. This helps distinguish unsupported core features from authentication errors and routing issues, without changing so many settings at once that the cause gets lost.

Choosing a Client and Migrating Subscriptions

On Android, use v2rayNG if your nodes use REALITY or Vision. For standard VMess or VLESS nodes whose server documentation specifies V2Fly configuration, v2flyNG may be a better fit. On desktop, before choosing a core in v2rayN, check which features the node requires. The client name alone cannot tell you whether it's compatible.

When migrating a subscription, create a new group and keep the old one as a fallback. Import one node and verify its settings before updating the rest, then migrate routing. Subscription updates may overwrite manually edited node fields. If flow control or a security layer is missing after import, check the subscription format and the client's parsing support instead of repeatedly entering the settings by hand.

If the same VMess node works in two clients, does that mean the configurations are fully interchangeable?

It only shows that both clients can handle the protocol and transport combination used by that node. DNS, routing, inbound listeners, and the security layers used by other nodes may still differ. Even after exporting the full JSON, check each setting; a working single node does not prove that the entire configuration is compatible.

Can I keep using the original node if I remove flow or change REALITY to TLS?

Usually not. The client and server must use a compatible protocol combination. Removing a setting won't make the server switch modes automatically. The server must provide a separate working configuration, or you need to use a core that supports the original combination.

If a subscription imports successfully but every connection fails, should I switch cores first?

Check the logs and test one node first. If the logs point to an unsupported protocol, flow control mode, or security layer, then check the core selection. For timeouts, authentication failures, or certificate errors, check the network, account settings, or name configuration respectively. See the subscription import guide for the import process.

Download clientsChoose a platform and package