Xray vs. V2Fly: Version History, Core Differences, and Which Client to Choose

Learn how Xray and V2Fly differ, trace their shared Project V roots, and choose the right core for v2rayN, v2rayNG, or v2flyNG.

Quick overview

This guide helps users choosing v2rayN, v2rayNG, or v2flyNG understand the version relationship between Xray and V2Fly, protocol coverage, configuration compatibility, and practical selection criteria. You’ll learn how to identify the right core from VMess, VLESS, Reality, WebSocket, and other subscription parameters, then switch cores with a repeatable verification process.

First, understand how Xray, V2Fly, and V2Ray are related

V2Ray began as a core component of the Project V ecosystem. It reads JSON configuration, establishes inbound and outbound connections, and applies DNS, routing, and transport settings. The project was later maintained by the V2Fly community, so the “V2Fly core” discussed today generally means the V2Ray Core maintained by V2Fly—not a wholly unrelated new protocol. VMess, SOCKS, HTTP, Shadowsocks, routing rules, and multiple transport methods remain its main capabilities.

Xray-core emerged from the same code lineage in late 2020. It initially inherited much of V2Ray’s configuration structure, then developed into an independent release line. Xray is not a replacement for v2rayN: Xray handles network connections, while v2rayN is a graphical client that manages subscriptions, nodes, the system proxy, and core processes. When a desktop user clicks Connect, the client converts the node into a configuration and launches the selected core.

Once the two projects began separate maintenance, their version numbers cannot be compared directly. Xray 1.x and V2Fly v5 represent separate release sequences; the numbers do not indicate which project is newer or more mature. To determine whether a connection will work, check the protocol, transport, security layer, and server parameters—not the size of the version number.

2020
Xray independent release line begins
1.x
Common Xray major release line
v5
V2Fly’s new configuration-generation mainline
4 platforms
Windows、macOS、Android、Linux
  1. Project V era: V2Ray Core established a configuration structure that separates inbound, outbound, routing, DNS, and transport layers.
  2. Community maintenance era: V2Fly continued V2Ray Core development and advanced new configuration interfaces and internal modules in the v5 series.
  3. Independent evolution: Xray-core retained many familiar configuration conventions while focusing on features such as VLESS and Reality.
  4. Client integration: v2rayN manages desktop core processes, while v2rayNG and v2flyNG follow different Android core paths.

Protocol and feature differences determine compatibility

For most users, the first practical difference is whether the core can fully recognize a node. VMess over TCP or WebSocket is a baseline combination supported across both release lines, so ordinary subscriptions usually convert successfully on either side. VLESS, Reality, and XTLS Vision combinations are more closely associated with Xray; when these fields appear in a subscription, choosing Xray reduces the risk of parameters being lost during client conversion.

“Imported successfully” does not mean “ready to connect.” A subscription link only supplies node data to the client; the client must still map that data into a configuration the core accepts. A client may display a node name yet fail to start because the selected core does not recognize its security type or transport fields. During troubleshooting, inspect the original subscription parameters, the configuration generated by the client, and the runtime log together.

Xray core

Recommended

Strong coverage for VLESS, Reality, and XTLS Vision, with support for common VMess, TCP, WebSocket, and gRPC configurations. A good default core for new subscriptions.

Best for: daily use, VLESS nodes, Reality configurations

V2Fly core

Continues the modular design of V2Ray Core and suits established environments built around VMess, WebSocket, TCP, and standard routing rules.

Best for: existing VMess nodes, V2Fly servers, compatibility testing

Dual-core troubleshooting

Keep the same node parameters, change only the core, and compare startup logs to distinguish unsupported protocols from unreachable networks.

Best for: migration checks, unusual subscription fields, issue diagnosis

Check Xray focus V2Fly focus Recommendation
VMess + TCP Standard support Standard support Choose based on the existing client and server versions
VMess + WebSocket + TLS Standard support Standard support Check the path, hostname, and TLS domain first
VLESS + Reality Feature focus Do not treat it as a generally compatible combination Choose Xray and preserve the public key and short ID parameters in full
XTLS Vision Used with VLESS Do not treat it as equivalent functionality Use matching Xray versions on both client and server
Routing and traffic splitting Supports rules for domains, IPs, ports, and more Supports rules for domains, IPs, ports, and more During migration, check rule syntax and outbound tags
DNS configuration Continues to expand with each release Provides an independent DNS module Do not copy complex templates without confirming they apply

Bottom line: choose the core from the node fields

Choose Xray immediately when the subscription contains security=reality, flow=xtls-rprx-vision, or a Reality public key. If the node uses only VMess, WebSocket, and TLS, test either core and preferably follow the implementation specified by the server.

Similar configurations do not mean you can copy the entire file

Xray and V2Fly share the basic concepts of inbounds, outbounds, and routing, and common JSON files may include inbounds, outbounds, routing, and dns. This similarity helps explain the configuration, but it does not guarantee that an entire file works across cores. Different versions may require different field locations, defaults, transport names, and experimental features.

The simplified VMess outbound below illustrates the structure. The address, port, user ID, and transport parameters must match the server. When v2rayN manages the connection, you normally do not need to write the entire configuration by hand; the client generates the runtime file from the node record.

{
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "node.example.net",
            "port": 443,
            "users": [
              {
                "id": "11111111-2222-3333-4444-555555555555",
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "path": "/gateway"
        }
      }
    }
  ]
}

When migrating a configuration, start with the smallest structure that can connect: one local inbound, one proxy outbound, and one direct outbound. After confirming the connection, add DNS, ad-domain rules, LAN direct access, and per-application routing step by step. Copying many rules at once mixes protocol, DNS, and routing errors into the same log.

Symptom Most likely cause Where to check
Core exits immediately after startup The current version does not recognize a field, or the JSON structure is invalid The first error in the runtime log and its field path
Node is visible but will not start The client imported the name, but the core lacks the required protocol capability Node protocol, security type, and selected core
Connection is established but webpages time out DNS, routing, or the system proxy is not working as expected Local inbound port, DNS queries, and outbound tags
Only some domains fail Domain rule order or resolution results affect traffic splitting Routing hit logs and DNS configuration

How to choose between v2rayN, v2rayNG, and v2flyNG

On desktop, start with v2rayN. It handles subscription updates, node lists, latency tests, the system proxy, routing groups, and core lifecycles. It is available for Windows, with corresponding desktop builds for macOS and Linux. It can run with Xray and other cores, but the client version, operating-system architecture, and core file must match. For a new installation, using Xray as the primary core generally provides broader coverage for modern VLESS configurations.

On Android, choose between v2rayNG and v2flyNG. v2rayNG follows the Xray path and suits subscriptions using VLESS, Reality, or the latest Xray features; v2flyNG follows the V2Fly path and is better suited to environments that explicitly use V2Fly Core. Both are graphical clients. After importing the same subscription, they may show different numbers of usable nodes because their supported protocol fields differ.

Recommended setup: share one subscription across desktop and Android, choosing the core by protocol

Desktop: v2rayN
  • Use Xray as the primary core for modern protocols
  • Open “Settings” → “Parameter Settings” and check the local ports
  • After updating the subscription, run a real connection latency test first
  • Use the build corresponding to Windows, macOS, or Linux
Android clients
  • Prefer v2rayNG for VLESS and Reality
  • Use v2flyNG when the environment explicitly adopts V2Fly
  • After importing, check the node protocol and transport fields
  • Enable per-app proxying only for the apps that need it

The subscription address can be the same, but nodes unsupported by the core do not become compatible simply because the import succeeded.

Desktop selection order

  1. Open the subscription node details and confirm whether the protocol is VMess or VLESS.
  2. Check the transport and security type; choose Xray when Reality or Vision appears.
  3. Go to “Settings” → “Parameter Settings” and confirm that the local listening address and port do not conflict.
  4. After updating the subscription, select one node and run a real connection latency test rather than checking only basic network responsiveness.
  5. After enabling the system proxy, test the browser separately from terminal programs that do not read the system proxy.

Android selection order

Bottom line: the client name does not determine the protocol

Read the node parameters first, then choose the client and core. v2rayN, v2rayNG, and v2flyNG are all configuration entry points; whether a protocol runs depends on the core version they invoke and the fields it supports.

Verify a core switch in five steps

Do not judge a core switch solely by whether the client status bar says “Started.” A core process starting successfully only means the configuration passed basic parsing; it does not prove that the remote handshake, DNS, routing, or system proxy is working. A more reliable method is to keep the same node and verify startup, connectivity, the proxy entry point, domain resolution, and application access in sequence.

  1. Save the current node parameters. Record the protocol, server address, port, user ID, transport, TLS server name, and Reality parameters. Do not modify the node while switching cores.
  2. Stop the old core process. Confirm that it releases the local ports. Historical configurations commonly use 10808 for SOCKS and 10809 for HTTP; use the current values in “Settings” → “Parameter Settings” as the authority.
  3. Start the new core and inspect the first log section. Resolve startup errors such as unknown field, failed to load config, and address already in use before testing the remote connection.
  4. Run a real connection test. Have the client complete a target connection through the proxy entry point and record the latency and failure reason. Basic network responsiveness only suggests that the address may be reachable; it does not replace the protocol handshake.
  5. Verify the traffic path. Visit an ordinary webpage first, then test a destination that requires the proxy, and finally check that direct-connection rules still select the expected outbound.

The data below illustrates the comparison method: the same VMess + WebSocket + TLS node was tested 10 consecutive times on the same machine and fixed network. Xray had a median of 84 ms, while V2Fly had a median of 87 ms—a difference of only 3 ms. That gap is too small to prove that one core is universally faster. Repeated timeouts, handshake failures, or missed routing rules matter more.

10808
Typical local SOCKS port
10809
Typical local HTTP port
84 ms
Xray comparison median
87 ms
V2Fly comparison median

Even when both cores connect to the same VMess node, latency is affected by line congestion, DNS cache state, server load, and test timing. Run at least 10 tests and compare the median for a more meaningful result than a single sample. If Xray starts a Reality node but V2Fly cannot, that is a feature-compatibility difference and should not be confused with a speed test.

Bottom line: change only one variable at a time

Keep the node, network, routing, and DNS fixed; replace only the core, then compare the startup log and 10 real connection results. If you also update the subscription or change rules, you cannot tell whether the issue comes from the core or the configuration change.

Common questions and final recommendations

Most users do not need to maintain two completely separate configurations indefinitely. Use Xray for newer protocols and V2Fly to validate established VMess environments. When the server specifies a required core, follow it first. A dual-core comparison is useful only when no requirement is stated and the node parameters fall within the common range supported by both.

Can v2rayN still import VMess subscriptions after switching to Xray?

Yes. Xray supports common VMess configurations, but after importing a subscription you should still check the address, port, user ID, transport, and TLS parameters. For older subscriptions with special fields, follow the runtime log.

Can the same subscription be used with both v2rayNG and v2flyNG?

The subscription address can be the same, but the set of usable nodes may differ. Standard VMess nodes usually work more easily on both, while nodes using Xray features such as Reality or Vision should be handled by v2rayNG.

Why is there no traffic through the system proxy after switching cores?

First confirm that the new core’s local listening port matches the port entered in the system proxy, then check whether the port is still occupied by the old process. Browsers may read the system proxy, while some command-line programs require a separate HTTP or SOCKS proxy setting.

Is Xray always faster than V2Fly?

That conclusion is too broad. For the same VMess node, speed is more strongly affected by the route, server load, and network quality. Xray’s main advantage is broader support for features such as VLESS, Reality, and Vision—not a guaranteed speed increase on every node.

Can a V2Fly v5 configuration be placed directly into every older client?

Compatibility cannot be assumed. A client may call a specific core version or implement only part of the subscription fields. Before importing, confirm the bundled core, test with a minimal configuration, and do not keep adding DNS and routing rules after a field error appears.

Download client View all four platform versions