This guide is for users choosing a client core, migrating existing nodes, or troubleshooting configuration incompatibilities. The key point: protocol names alone do not identify the core for standard VMess, VLESS, or Trojan nodes. Configurations with REALITY, XTLS Vision, or Xray-specific fields require Xray; existing V2Fly configurations and standard transports can continue using V2Fly.
Where the Two Core Branches Diverged
V2Fly and Xray both originate from the V2Ray technology stack and share a similar foundation: configurations typically include inbound, outbound, routing, DNS, logging, and policy modules. Both handle common proxy protocols and can select outbounds by domain, IP, port, or rule set. The difference is not whether a proxy can start, but which protocol extensions, transport implementations, configuration fields, and maintenance priorities came later.
V2Fly continues community maintenance of V2Ray Core while advancing the v5 configuration format and API. It suits environments built around common combinations such as VMess, VLESS, Trojan, Shadowsocks, WebSocket, and gRPC. Xray maintains compatibility with existing configurations while continuing to develop VLESS, XTLS Vision, REALITY, and related flow-control features. Once these core-specific fields appear in a node configuration, the choice is no longer a matter of preference—it determines whether the configuration can be parsed and a connection established.
Maintenance status also affects troubleshooting. When an error appears, record the client version, core version, protocol, transport, and security layer instead of simply writing “V2Ray connection failed.” For example, if the test environment is fixed at Xray-core 25.6.8 and V2Ray 5.30.0, the results apply only to that combination. If configuration parsing changes after an upgrade, test again rather than applying the old conclusion to the new version.
- Shared foundation: Similar concepts for inbound and outbound models, route matching, DNS handling, and log levels.
- Xray focus: Prioritizes features in the Xray ecosystem, including REALITY and XTLS Vision.
- V2Fly focus: Continues community maintenance of V2Ray Core and advances its own v5 configuration system.
- Migration principle: Identify core-specific fields first, verify the protocol and transport next, and compare performance last.
Support Boundaries for VLESS, REALITY, and XTLS
VLESS alone is not enough to identify the core. Both cores support VLESS use cases, but a specific configuration may include different flow-control, security-layer, and transport parameters. A VLESS node containing only an address, port, user ID, TCP, and TLS depends on a very different feature set from one that also includes a REALITY public key, short ID, server name, fingerprint, and Vision flow control.
REALITY belongs to the Xray ecosystem. Common parameters in shared links include security, pbk, sid, sni, fp, and flow. If a node requires security=reality, the client must use an Xray core that supports it. Passing such a link to a core that does not recognize the fields may result in missing fields after import, an unknown-configuration error at startup, or an immediate disconnect after the connection is established.
Xray Core
RecommendedSupports VLESS with REALITY and XTLS Vision, making it suitable for newer configurations containing fields such as flow, pbk, and sid.
Best for: REALITY nodes, Vision flow control, Xray-specific parameters
V2Fly Core
Suitable for VMess, standard VLESS, Trojan, and standard TLS transport combinations, while making it easy to keep existing V2Fly configurations.
Best for: Existing configurations, standard transports, V2Fly servers
XTLS also requires distinguishing historical names from current flow-control settings. In current configurations, VLESS with flow=xtls-rprx-vision is more common. This is not simply a renamed TLS switch; it involves Xray's data path and flow-control implementation. When the server requires Vision, the client should use the same flow value. Removing the field does not normally fall back to standard TLS; instead, it creates a parameter mismatch between the two ends.
| Configuration traits | Xray | V2Fly | Recommendation |
|---|---|---|---|
| VMess + WebSocket + TLS | Supported | Supported | Keep the existing core unless there is a clear reason to migrate |
| VLESS + TCP + TLS | Supported | Verify against the specific version and fields | Check whether the shared link contains core-specific parameters |
| VLESS + REALITY | Suitable | Not a compatibility target | Choose Xray |
| VLESS + XTLS Vision | Suitable | Not a compatibility target | Choose Xray and keep the flow field |
| V2Fly v5 configuration | Compatibility cannot be assumed | Suitable | Use V2Fly and maintain it according to the relevant documentation |
Can Configuration Files Be Swapped Directly?
A similar base JSON structure does not mean complete configurations can be exchanged without changes. Common inbound, outbound, routing, and dns modules can create the impression that changing only the executable will be enough, but each core validates protocol fields, transport fields, and object nesting differently. When core-specific fields are not recognized, the client importer may ignore them, or the core may fail to start.
Here is a simplified structure for identifying an Xray REALITY node. It is not a complete, connectable configuration, but it highlights the key checks: security is reality, flow is xtls-rprx-vision, and publicKey and shortId appear under realitySettings.
{
"protocol": "vless",
"settings": {
"vnext": [{
"address": "example.invalid",
"port": 443,
"users": [{
"id": "00000000-0000-0000-0000-000000000000",
"encryption": "none",
"flow": "xtls-rprx-vision"
}]
}]
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"serverName": "server.example",
"fingerprint": "chrome",
"publicKey": "Example public key text",
"shortId": "0123456789abcdef"
}
}
}
When migrating a subscription, distinguish the subscription content from the core configuration. A client typically parses shared links first and then converts them into the JSON required by the core. Even when two clients receive the same link, their output may differ because of default fingerprints, Mux settings, DNS policies, and routing rules. Successful import only means the client recognized the text; it does not prove that the core supports every field.
- Copy the original configuration and record the current core version before making changes. Never overwrite the only working configuration directly.
- In the node details, check the protocol, transport, security layer, flow, SNI, ALPN, and fingerprint.
- After switching cores, start one node first and watch the core log for errors such as unknown field, failed to parse, or handshake failures.
- Confirm that the local listening port, such as SOCKS port 10808, is not already in use by another process.
- Test DNS resolution, TCP page access, and sustained transfers in sequence; do not rely on a single latency reading.
How to Test Performance Differences
A latency difference of a few milliseconds on the same node usually is not enough to prove that one core is faster. Network paths, server load, DNS caching, connection reuse, and test timing all affect the result. A more reliable approach is to keep the node, configuration, network, and test target fixed, alternate multiple rounds, and compare the median, failure count, and sustained-transfer stability.
A reproducible desktop test can be set up as follows: keep the local SOCKS port at 10808, set the connection timeout to 2 seconds, and disable extra chained proxies that could alter the route. Run 50 short-connection rounds with each core, followed by three 5-minute sustained-transfer rounds. Do not update subscriptions or run speed tests during testing, or core logs and bandwidth contention may skew the results.
- Connection establishment: Record the number of successful attempts and the median duration across 50 rounds; do not use the single lowest value.
- Sustained transfer: Watch for reconnects, pauses, or handshake errors during the 5-minute window.
- Resource usage: With the same number of connections, record memory and processor usage after waiting at least 60 seconds.
- Log results: Track protocol errors, DNS errors, timeouts, and port conflicts separately.
On a standard VMess + WebSocket + TLS node, both cores often deliver nearly identical real-world throughput, so client workflow and configuration stability matter more than small numeric differences. For REALITY or Vision nodes, the test premise already limits the comparison to Xray; including a core that lacks the required fields is meaningless because the connection capabilities are not equivalent.
| Metric | Recommended sample | Meaningful result |
|---|---|---|
| Connection time | At least 50 attempts | Compare the median and failure rate |
| Sustained transfer | 3 rounds, 5 minutes each | Compare reconnect and pause counts |
| Memory usage | Read after 60 seconds of stable operation | Compare only with the same connection count |
| Log errors | Complete test cycle | Classify by error type, not just the total count |
How to Choose Between v2rayN, v2rayNG, and v2flyNG
The client name and core name are not the same thing. The client handles subscriptions, the interface, routing entry points, the system proxy, and configuration generation; the core parses the configuration and forwards traffic. Choose the platform first, then the capabilities required by the node, and finally whether the client exposes the necessary settings.
v2rayN is suited to Windows desktop environments, with convenient group management, core-log viewing, and route switching. To check the current setup, open “Settings” → “Parameter Settings” and review the core type, local listening port, and DNS options. Menu labels may vary slightly between versions, but the core log remains the direct evidence of which component is actually running.
Recommended setup: assign clients by node capabilities
Desktop (v2rayN)
- Choose Xray for REALITY or Vision nodes
- Keep the local port at 10808 for easier troubleshooting
- Export the configuration and record the routing mode before switching
Android
- v2rayNG for Xray use cases
- v2flyNG for V2Fly use cases
- Still verify node fields after importing the same subscription
Let the protocol fields determine the core first, then choose the client based on platform and workflow; do not replace a working configuration just to make the names consistent.
v2rayNG uses the Xray core and suits REALITY, XTLS Vision, and common VMess, VLESS, and Trojan nodes on Android. After import, open the node details and verify the transport, security type, SNI, fingerprint, and flow. If a subscription update suddenly breaks connectivity, compare the fields before and after the update instead of deleting the entire configuration.
v2flyNG uses the V2Fly core and suits Android users who want to keep a V2Fly configuration path. It is a better fit for existing combinations such as VMess, standard TLS, WebSocket, and gRPC. If the server explicitly requires REALITY or Vision, do not force an import by deleting fields; switch to an Xray client that supports the configuration.
Prefer Xray
The subscription contains REALITY, xtls-rprx-vision, publicKey, shortId, or other Xray-specific fields.
Continue using V2Fly
The existing V2Fly server and client are stable, and the nodes use standard VMess, VLESS, Trojan, and common transport combinations.
Do not switch yet
The server configuration is unknown, the old configuration was not preserved, or the current issue actually comes from DNS, a port conflict, or routing rules.
Common Selection Questions and Troubleshooting Steps
A mismatched core usually produces clear signals: key fields are empty after import, the core cannot start, the log reports unknown fields, the handshake repeatedly fails, or standard nodes work while every REALITY node fails. During troubleshooting, confirm that the core has actually started first, then inspect node parameters, and only afterward handle the system proxy and routing.
Why can one client connect to the same VLESS node while another cannot?
Open the node details and compare security, flow, pbk, sid, sni, and fp. If reality or xtls-rprx-vision appears, use Xray. Once the fields match, check whether local port 10808 is already in use.
Does a VMess node need Xray for better performance?
Not just because of the name. First run 50 connection tests and three sustained-transfer rounds with the current core. If the failure rate and logs are normal, keeping the existing configuration is usually safer.
What should I do if no nodes start after switching cores?
Open the core log and check for configuration parsing errors, then go to “Settings” → “Parameter Settings” to verify the core type and local port. Restore the configuration exported before switching, confirm basic connectivity, and migrate items one at a time.
How should I handle a subscription containing both standard and REALITY nodes?
On desktop, use v2rayN with Xray to manage standard and REALITY nodes together; on Android, use v2rayNG. After updating the subscription, spot-check at least one standard node and one REALITY node.
Is it normal for v2flyNG to lose the flow field after importing a node?
If the original link requires Vision, missing flow does not represent an equivalent configuration. Do not manually remove core-specific parameters; import it in v2rayNG instead and verify the REALITY public key, short ID, and server name.
The final decision can be reduced to three steps: check whether the configuration contains REALITY or Vision, confirm which core the client is actually using, and validate with logs and multiple connection rounds. Standard nodes do not need frequent migration between the two cores; core-specific protocols should match their implementation exactly. This is more reliable than judging by one latency reading, the node name, or the client name.