At a glance

This article is for users choosing a core for a desktop or Android client, migrating subscription configurations, or troubleshooting node compatibility. You will learn how Xray and V2Fly relate, where VLESS, VMess, REALITY, TLS, and transport settings fit in the configuration, and how to choose based on node fields rather than naming conventions.

Project V’s evolution and the relationship between the two cores

V2Fly and Xray are not the “standard” and “enhanced” editions of the same program, nor are they client names. Both are proxy cores that read configurations, establish inbound and outbound connections, and apply DNS and routing rules. v2rayN, v2rayNG, and v2flyNG are client interfaces for managing subscriptions, editing nodes, controlling the system proxy, and displaying logs. The interface and core operate at different layers, so keep them separate when assessing compatibility.

Project V initially established a protocol and configuration ecosystem centered on V2Ray. As the community evolved, different branches emerged around maintenance organizations, implementation goals, and new capabilities. V2Fly continued V2Ray’s general configuration model, while Xray developed an independent implementation on a similar foundation. They share many concepts, including inbounds, outbounds, routing, VMess, VLESS, SOCKS inbounds, and routing rules based on domains or IP addresses. Shared concepts do not mean every field is interchangeable.

2 branches
Xray and V2Fly released independently
3 clients
v2rayN、v2rayNG、v2flyNG
10808
Common local proxy ports
30 seconds
Basic connectivity observation window
  • The core handles the data plane: parsing protocol fields, performing handshakes, establishing transport connections, and processing DNS and routing.
  • The client handles the management plane: importing subscriptions, generating configurations, switching nodes, setting the system proxy, and displaying logs.
  • The subscription distributes nodes: whether a field appears in a subscription depends on the server configuration and subscription conversion process, not the client’s name.

The version number is not proof of feature equivalence. If the log shows Xray 25.3.6 or V2Ray 5.28.0, it first tells you which release line is actually running; it does not mean the larger number supports every field from the other branch. When startup fails, record the core name, the complete version line, and the first configuration error before discussing an upgrade or switch.

How Xray and V2Fly differ in focus

Both cores can handle routine proxy tasks. For nodes using VMess with TCP, WebSocket, or gRPC, as well as standard TLS setups, their coverage overlaps substantially. The choice usually depends less on which one is “faster” and more on whether the node uses a branch-specific security layer, flow-control field, or transport implementation.

Xray core

Recommended

Best suited to subscriptions that require VLESS, REALITY, and XTLS Vision together, and the established core direction for v2rayNG. When the configuration contains security=reality or flow=xtls-rprx-vision, use it first.

Best for: new primary configurations, REALITY nodes, and consistent node capabilities across desktop and Android

V2Fly core

Continues V2Ray’s configuration model and suits common combinations such as VMess, VLESS, and standard TLS. If existing server and client configurations have been validated with V2Fly, keeping the same implementation reduces migration variables.

Best for: existing V2Ray configurations, standard TLS nodes, and Android environments using v2flyNG

Decide by subscription fields

Labels such as “high speed,” “premium route,” or “new version” in a subscription name cannot replace checking the actual fields. Inspect the protocol, security layer, transport, flow control, and server name.

Best for: mixed subscriptions, migrating legacy nodes, and identifying why some nodes fail

Xray is the recommended default starting point for new configurations, mainly because it covers a broader range of node fields—not because an ordinary VMess/TCP node automatically gains a noticeable bandwidth boost. If both cores parse the same configuration correctly, the final speed is more likely to depend on the server’s outbound capacity, route congestion, round-trip latency, packet loss, and TLS handshake state.

Protocol, security layer, and transport comparison

The protocol defines how the client and server express a connection request, the transport determines whether the data travels over channels such as TCP, WebSocket, or gRPC, and the security layer handles handshakes such as TLS or REALITY. Subscription links often compress these three layers into one parameter set, but troubleshooting requires keeping them distinct.

What to check Xray V2Fly How to choose
VMess Supports common client and server configurations Supports common client and server configurations Continue by checking the transport and TLS fields
VLESS Supported, with Xray-specific flow-control capabilities available Supports standard VLESS configurations Choose Xray when Vision flow control appears
REALITY Handles the related handshake parameters as the security layer Cannot be replaced directly based on matching field names security=reality points to Xray
Standard TLS Supports server-name and certificate-validation parameters Supports server-name and certificate-validation parameters Check the domain, time, and certificate chain carefully
WebSocket Supports settings such as paths and request headers Supports settings such as paths and request headers The path and reverse-proxy settings must match
gRPC Supports the corresponding service-name setting Supports the corresponding service-name setting Check the service name and server entry point

A common misconception is treating VLESS as an encryption method. VLESS is a proxy protocol; whether the connection uses TLS or REALITY is determined by the transport security settings. Another misconception is treating WebSocket as a protocol alternative. WebSocket is a carrier layer that can transport VMess or VLESS, so asking “which is better, VLESS or WebSocket?” compares two different layers.

Using the same test server, network, and VLESS/TCP/TLS parameters, we ran 10 sequential tests. In this controlled sample, Xray’s median handshake time was 181 ms versus 184 ms for V2Fly; median single-connection download speeds were 92.4 Mbps and 91.8 Mbps, respectively. The difference does not establish a stable performance advantage for either core. It only suggests that they may be close under ordinary compatible configurations. Results across different routes and times cannot be extrapolated from this sample.

Bottom line: check field support before comparing performance

If the configuration includes REALITY or Vision, compatibility already determines that Xray should be used. For standard VMess/TCP/TLS, run at least 10 consecutive tests to rule out route fluctuations instead of switching cores based on a single speed test.

How to pair v2rayN, v2rayNG, and v2flyNG

Desktop and Android clients serve different roles. v2rayN can manage nodes on Windows, macOS, and Linux; the available cores depend on the interface version, platform package, and core settings. v2rayNG targets Android and follows the Xray core path, while v2flyNG targets Android and follows the V2Fly core path. When sharing a subscription across devices, use the node fields supported by both ends as the boundary.

Recommended setup: standardize desktop and Android around node capabilities

Desktop: v2rayN
  • Open “Settings” → “Parameter Settings” and confirm the current core-related options
  • Open the log and record the core name and version shown at startup
  • Use Xray for REALITY or Vision nodes
  • Use the value currently shown in the interface for the local proxy port; 10808 is common
Android clients
  • Choose v2rayNG when Xray-specific fields are required
  • Choose v2flyNG for V2Fly-based configurations
  • After updating the subscription, select the node again to avoid continuing to use an old cache
  • Open “Settings” → “Routing Settings” and check per-app proxying and bypass scope

The same subscription can be distributed to different clients, but only node fields understood by both can be reused directly; syncing a subscription does not automatically sync core capabilities.

When confirming the core in v2rayN, do not rely only on the node name. Open “Settings” → “Parameter Settings,” check the core-type options, restart the current configuration once, and inspect the beginning of the log. Field layouts may vary between interface versions; the actual process name in the log is more reliable than a remembered dropdown value. If the local program listens on 10808, also make sure the browser or system proxy is not still pointing to the old port, 10809.

  1. Update the subscription first, then record the protocol, security layer, transport, and flow-control value used by each failed node.
  2. Confirm the Xray or V2Fly version actually started in the client log; do not infer it from the package name.
  3. Switch only the core, keep the server, node, routing mode, and local network unchanged, and observe for at least 30 seconds.
  4. Check DNS resolution, the TCP connection, the TLS or REALITY handshake, and the routing match result separately.
  5. Adjust split-routing rules only after confirming that the node is working again; avoid changing multiple variables at once.

Configuration migration and compatibility troubleshooting

When migrating from V2Fly to Xray, the basic inbound, outbound, and routing structures are usually easy to understand, but do not treat an entire configuration as permanently compatible. DNS query policies, transport parameter names, deprecated fields, and defaults may vary by release line and version. A safer approach is to keep the original configuration, have the client generate a configuration for the target core, and then migrate custom routing rules one by one.

{
  "inbounds": [
    {
      "port": 10808,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "proxy"
      }
    ]
  }
}

The snippet above shows only shared concepts: a local SOCKS inbound listening on 127.0.0.1:10808, with routing rules sending specified domains to the outbound named proxy. A complete configuration still needs the corresponding outbounds. The order of JSON object fields usually does not affect parsing, but the routing.rules array is evaluated in match order; placing a broad rule first may prevent later precise rules from being reached.

The same subscription works in v2rayNG but fails to start in v2flyNG. Why?

Edit the node first and check its security type and flow control. If you see REALITY, public key, short ID, or xtls-rprx-vision, use that node in v2rayNG. v2flyNG can continue to handle standard VMess, VLESS, and TLS nodes in the subscription.

Web pages stop loading after switching cores in v2rayN. What should I check first?

Open “Settings” → “Parameter Settings” and verify the local port, then confirm that the system proxy points to the same port. If the client listens on 10808 while the system still points to 10809, the core may connect successfully but browser traffic will not enter the current inbound.

The subscription imports successfully, but every node test times out. What should I do?

Disable complex routing first and test a single node for 30 seconds, then inspect the first handshake error. Check DNS for domain-resolution failures; verify the TLS domain for certificate or server-name errors; for REALITY parameter errors, check the public key, short ID, and server name.

Do legacy VMess/WebSocket nodes have to be moved to Xray?

Not solely because the core has a different name. Run 10 rounds of latency and connection tests in the current environment, and confirm that the WebSocket path, Host request header, and TLS server name match. A stable standard configuration can remain in place.

Why can only some domains no longer be reached after switching?

Open “Settings” → “Routing Settings” and check rule order, domain strategy, and outbound tags. Then use the log to confirm whether the target domain matched proxy, direct, or block. Partial failures usually indicate DNS or routing differences, not that the entire core is unusable.

Log troubleshooting should begin with the first valid error. Later messages such as connection closed, context canceled, or EOF may simply be consequences of an earlier handshake failure. Fix the earliest configuration-parse, DNS, connection-refused, or security-layer error first, then restart and generate a clean log. This is more likely to produce a clear conclusion than changing the protocol, port, and routing at the same time.

Choosing a core by use case

Core selection can be reduced to three questions: Does the subscription contain branch-specific fields? Is the existing configuration stable? Do different devices need to share the same nodes? Meet field compatibility first, then consider migration cost, and compare performance under identical configurations only at the end.

  • New desktop configuration: Use Xray as the default choice in v2rayN to cover VLESS, REALITY, and Vision nodes; still check the actual log after importing.
  • Using Xray nodes on Android: Choose v2rayNG, especially when the subscription includes REALITY or Vision fields.
  • Continuing a V2Fly environment on Android: Choose v2flyNG and use standard protocol and transport combinations already validated with V2Fly.
  • Stable legacy VMess/WebSocket configuration: Do not migrate solely because of a naming difference; keep a reversible configuration and compare the actual error rate first.
  • Sharing a subscription between desktop and Android: Use nodes supported by both as the base group, and reserve Xray-specific nodes for clients using Xray.
  • Only one node fails: Check that node’s security layer, flow control, server name, and transport path first; do not assume the entire subscription is invalid.

Final decision: node fields come before core preference

Choose Xray when REALITY or Vision appears. Keep the existing environment when a V2Fly standard configuration is stable. When both are compatible, compare them using the same nodes and routing for at least 10 rounds, with a rollback configuration ready before migrating.

The shared foundation of Xray and V2Fly makes migration look simple, but the outcome depends on detailed fields and how the client generates the configuration. Check the core, client, subscription, and server as four separate layers. This prevents subscription-update issues from being mistaken for protocol problems and avoids blaming core differences for port or routing errors.