Xray and V2Fly cores: what's the difference? Version history and client selection guide

This article traces the history of the V2Fly and Xray core branches in the Project V ecosystem, compares their protocol support and release cycles, and explains which cores power v2rayNG and v2flyNG and when to use each.

At a glance

This guide is for users comparing v2rayNG, v2flyNG, and v2rayN. Rather than ranking the two cores, it explains configuration formats, protocol capabilities, client-to-core relationships, and upgrade risks, so you can choose the right core for your node parameters and build a repeatable compatibility-check process.

How Xray and V2Fly versions relate

V2Fly and Xray both continue the proxy configuration model established in the Project V ecosystem. Both handle inbound and outbound connections, routing, DNS, and transport settings, using structured configurations to describe connection parameters. They share many terms, but they are now separate core branches with independent development and releases. Their version numbers should not be read as a single timeline.

For example, the larger number in Xray 25.3.6 versus V2Fly 5.28.0 does not mean V2Fly is newer, nor does it indicate broader protocol support or better performance. Xray versions often have date-like numbering, while V2Fly has long used semantic versioning. Compare releases within each project, and check the client’s bundled core version and configuration-change notes.

2 items
Independent release branches
25.3.6
Xray version example
5.28.0
V2Fly version example
10808
Common local SOCKS port

From the user’s perspective, the client handles the interface, subscription management, system proxy, and configuration conversion; the core actually establishes connections and applies routing. When you tap Connect in v2rayNG, the interface assembles the current node, DNS, per-app proxy, and routing settings into a runtime configuration the core can read, then starts the local proxy service. That is why the same subscription node may work differently across clients: compatibility depends on whether the client generates every field required by its core.

  1. First, distinguish the client from the core: v2rayNG, v2flyNG, and v2rayN are the clients you operate directly, while Xray and V2Fly are the core programs that handle connections.
  2. Next, distinguish version sequences: do not compare version numbers across projects; determine what is newer within the release sequence of the same core.
  3. Finally, check node capabilities: matching protocol names do not guarantee matching extension parameters. Verify flow control, security layers, and transport methods field by field.

Protocol support and configuration differences

Names such as VMess, VLESS, Shadowsocks, SOCKS, and HTTP can make the two sides appear fully equivalent. In practice, the base protocol is only the first layer. A connection also depends on transport methods such as TCP, WebSocket, and gRPC, plus TLS, REALITY, flow control, and the handshake parameters required by the server. Any mismatch in a critical field can appear as a timeout, handshake failure, or a connection that cannot reach the destination.

VMess over TCP or WebSocket is a common compatibility combination across the two core branches. When migrating these nodes, check the server address, port, user ID, alterId, transport, Host, and path. In newer configurations, alterId is usually 0. If a subscription still supplies the legacy parameter, the client may import it successfully, but the actual connection should still be validated against the server configuration.

Xray core

Recommended

Best for nodes using VLESS, XTLS flow control, or REALITY parameters, as well as everyday setups where v2rayNG handles subscription parsing and routing configuration directly.

Best for: newer protocol nodes and primary v2rayNG use

V2Fly core

Best for existing configurations built around VMess, standard VLESS, TCP, WebSocket, TLS, and conventional routing, while v2flyNG keeps the V2Fly runtime boundary explicit.

Best for: established configurations and V2Fly environment validation

REALITY is a key area where the cores can differ. If a subscription includes fields such as publicKey, shortId, serverName, fingerprint, or spiderX, do not look only at the word “VLESS.” The client must preserve every parameter, and the selected core must implement the corresponding capability. A missing shortId, an incorrect serverName, or a flow value changed to empty when the server requires one can all cause the connection to fail.

Routing syntax also evolves between versions. Common rules match domain, ip, port, network, or inboundTag, then send traffic to the specified outboundTag. Similar basic structures do not mean an old configuration can be reused unchanged forever. After a major upgrade, check deprecated fields, DNS query policies, and rule-matching behavior rather than merely confirming that the configuration parses.

Bottom line: check extension fields before comparing core names

Protocol labels such as VMess and VLESS are not enough to choose a core. When a subscription uses REALITY, XTLS flow control, or specific fingerprint parameters, Xray should be the first choice. For existing VMess, WebSocket, and TLS configurations, start by retesting them in the original environment.

How v2rayNG, v2flyNG, and v2rayN fit together

v2rayNG is an Android client that runs on the Xray core by default. It is well suited to sharing links or subscriptions with newer Xray parameters, and provides mobile features such as routing controls, per-app proxying, LAN bypass, and local DNS. For VLESS with REALITY nodes, first check the v2rayNG version and its bundled Xray version, then verify that all node fields are present.

v2flyNG also targets Android, but uses the V2Fly core. Its purpose is not to imitate v2rayNG’s interface; it provides a clearly defined V2Fly runtime environment. When maintainers need to reproduce a V2Fly server configuration or verify VMess and standard VLESS compatibility, v2flyNG reduces the ambiguity caused by identical-looking clients with different underlying implementations.

Recommended setup: align desktop and Android clients with node capabilities

Desktop (v2rayN)
  • Open “Settings” → “Parameters” and check the Core type and local ports
  • After updating the subscription, run a real connection test on the primary node
  • Keep a confirmed working configuration as an upgrade regression baseline
Android (v2rayNG)
  • Use the same working subscription to avoid re-entering parameters manually
  • Open “top-left menu” → “Settings” and check routing and DNS
  • Enable per-app proxying only when you need app-level traffic control

The two clients do not need identical core version numbers, but their protocols, security layers, transport parameters, and server requirements must match.

v2rayN is a Windows desktop client. Settings may vary slightly between versions, but local listeners, the system proxy, and Core options are usually available under “Settings” → “Parameters.” The common local SOCKS port is 10808; the HTTP port may be generated by the client according to its settings. If another program already occupies a port, the core may fail to start. Switch to an unused port first, then reconnect.

On macOS and Linux, when the selected core runs from a configuration file, the same principle applies: identify the capability set required by the server, then choose a core that can parse the configuration correctly. Do not downgrade REALITY to ordinary TLS just to standardize devices, and do not assume that importing a node means the client fully supports every subscription parameter.

How to verify whether a configuration can be migrated

Follow a fixed order when checking compatibility. Keep the original working client and node intact, then import the same subscription into the target client. Do not change the protocol, port, DNS, and routing at the same time; otherwise it is difficult to identify the cause of a failure. Changing one variable at a time is usually faster than repeatedly switching nodes.

After importing, open the node details first rather than treating a latency number as proof of a real connection. A latency test may check only TCP establishment or may include the core handshake, and implementations vary between clients. Compare results on the same network, during the same period, and against the same server node, with at least 3 consecutive tests.

  1. Check basic fields: confirm that the server address, port, user ID, encryption method, and protocol type were not truncated.
  2. Check transport fields: verify TCP, WebSocket, or gRPC, and confirm that Host, path, serviceName, and related fields are in the correct location.
  3. Check security fields: verify TLS or REALITY, serverName, fingerprint, publicKey, shortId, and flow.
  4. Check the local listener: confirm that local ports such as 10808 are available and that the system proxy points to the port actually used by the current client.
  5. Check logs in order: review configuration parsing first, followed by DNS, connection establishment, the TLS handshake, and routing matches. Do not capture only the final error line.
{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ]
}

This minimal structure illustrates only the relationship between a local SOCKS inbound, its port, and an outbound tag; it is not a remote node configuration. A real proxy outbound also requires the server, user, and transport parameters for its protocol. During testing, first confirm that the core can listen on 127.0.0.1:10808, then add the remote outbound. This separates “local port startup failed” from “remote handshake failed.”

Release cycles and upgrade risks

Xray and V2Fly maintain separate release schedules. An update may add protocol parameters or adjust DNS, routing, transport, or configuration validation. Clients also need time to integrate a new core, so “the core has been released” and “the client supports it” are two different points in time. In practice, rely on the client’s bundled version and its ability to generate the required configuration.

Frequent upgrades do not guarantee a more stable connection. Production systems and long-running devices benefit from a regression checklist: record the client version, core version, primary node protocol, local port, and routing mode. After upgrading, test subscription updates, TCP access, UDP requirements, DNS resolution, and rule matches in order. If one item fails, restore the original configuration first instead of changing nodes at the same time.

Bottom line: record the client and core versions together

When troubleshooting an upgrade, record at least the client version, core version, node protocol, and failure time. “It stopped working after the upgrade” does not reveal whether the cause was configuration conversion, core behavior, a subscription change, or the local network.

If an update is intended to fix a specific issue, first confirm that the change is related to that issue. For example, updating Xray and v2rayNG makes sense when the server requires new REALITY fields. If existing VMess, WebSocket, and TLS nodes have remained stable, migrating every device merely because a version number is larger usually offers benefits that are difficult to measure.

Choose a core and client by use case

For most Android users, start with the subscription contents. If node details include VLESS, REALITY, XTLS flow control, publicKey, or shortId, v2rayNG with Xray is the more direct combination. If the subscription mainly uses VMess, TCP, WebSocket, and TLS, and you need to reproduce a V2Fly environment, use v2flyNG for independent validation.

For v2rayN users, the priority is not repeatedly switching Core types in Settings, but identifying which capabilities the current node requires. After switching, regenerate the configuration and inspect the runtime logs. An unchanged node name, latency display, or subscription group does not mean the other core has accepted the underlying fields equivalently.

Can the same subscription be imported into both v2rayNG and v2flyNG?

Usually, yes—but successful import only means the subscription format was recognized. Whether a node connects depends on its protocol extensions, transport, and security parameters. Nodes using REALITY or specific XTLS flow control should be tested in v2rayNG first; conventional VMess, WebSocket, and TLS nodes are better suited to compatibility testing on both clients.

Is Xray always faster than V2Fly?

Core names alone cannot determine speed. Results depend on server load, round-trip latency, packet loss, congestion control, transport, TLS settings, and device performance. The proper comparison is to hold the configuration constant on the same network and node, run at least 3 consecutive tests, and observe connection stability as well.

Do I need to buy a new subscription when switching from v2flyNG to v2rayNG?

Usually not. Import the existing subscription into v2rayNG, then check each node’s protocol and extension fields. If a node does not work, ask the configuration provider to confirm the server parameters instead of guessing publicKey, shortId, flow, or serverName manually.

Why does the latency test pass but the webpage still won’t load?

First check that the system proxy points to the correct local port, then review DNS and routing rules. A successful latency test proves only that part of the path is reachable; it does not prove that name resolution, the remote outbound, and traffic splitting are all correct. On Windows, check listeners such as 10808. On Android, review the routing mode and the scope of per-app proxying.

The final choice can be summarized in one sentence: follow the server’s configuration requirements and stay within the capabilities bundled by the client. Use v2rayNG, or select the matching Core in v2rayN, when Xray extensions are required; use v2flyNG when you need to preserve a V2Fly runtime environment. Both branches handle mature baseline proxy and routing tasks—the key is complete parameters, matching versions, and consistent validation.

Go to Download Center Choose the right client for your platform